Существует ли какой-либо инструмент тестирования модулей командной строки, не основанный на Xcode, для Objective-C?

Пост Компиляция Objective-C без GUI говорит следующее:

Чтобы скомпилировать Objective-C на OSX, вы должны легко получить XCode, который можно бесплатно получить в магазине приложений. Получение XCode обеспечит получение необходимых структур (заголовков), таких как Foundation, Cocoa и т. Д. Однако это не обеспечит вас необходимыми инструментами командной строки для компиляции Object-C из командной строки. Откройте XCode, перейдите в "Настройки"> "Загрузки"> "Компоненты" и установите "Инструменты командной строки". Это установит gcc, clang, make и т. Д.

Я ищу инструмент, не основанный на Xcode, для решения этого моего вопроса, который я только что открыл: возможно ли сделать проект Objective-C для тестирования на Travis?

Этот инструмент должен соответствовать следующим требованиям:

  • Это никак не должно быть связано с Xcode.
  • Следующий уровень простоты вполне достаточно: только некоторые int main {} код собирает все файлы тестовых примеров поблизости и запускает тестовые утверждения в коде, который я хочу протестировать (например, ST- в SetTestingKit или GH- в GHUnit)
  • Мне не нужен интерфейс, графический интерфейс, Xcode, симулятор.
  • Было бы здорово, если бы он мог работать как на Mac, так и на Ubuntu (да, Трэвис), возможно, используя GNUstep, как описано в цитируемом посте.

ОБНОВЛЕНИЕ НА ОСНОВАНИИ ОТВЕТА:

Следующая простая установка, основанная на том, что сказал Мальте Танкред в принятом ответе, кажется вполне достаточной для моих текущих потребностей:

Три файла, все в каталоге тестов моего проекта:

octest.m

#import <Foundation/Foundation.h>
#import <SenTestingKit/SenTestingKit.h>

int main() {
    @autoreleasepool {
        SenSelfTestMain();
    }

    return 0;
}

Makefile

CC=clang # or gcc

# Trick to get current dir: https://stackru.com/questions/322936/common-gnu-makefile-directory-path
TESTS_DIR:= $(dir $(lastword $(MAKEFILE_LIST)))
PROJECT_DIR:= $(TESTS_DIR)/..

FRAMEWORKS_PATH:= -F/Applications/Xcode.app/Contents/Developer/Library/Frameworks
FRAMEWORKS:= -framework Foundation -framework SenTestingKit
LIBRARIES:= -lobjc
INCLUDE_PATHS:= -I$(PROJECT_DIR)/Projectfiles\
                -I$(TESTS_DIR)/TestHelpers

SOURCE_FILES = $(wildcard $(PROJECT_DIR)/Projectfiles/*.m)

SOURCE_TEST_SUITE = $(wildcard $(TESTS_DIR)/Tests/*.m)

SOURCE_TESTS = $(TESTS_DIR)/TestHelpers/TestHelpers.m\
                 octest.m


CFLAGS=-Wall -Werror -fobjc-arc -g -v $(SOURCE_FILES) $(SOURCE_TEST_SUITE) $(SOURCE_TESTS)
LDFLAGS=$(LIBRARIES) $(FRAMEWORKS)
OUT=-o octest

all:
    $(CC) $(FRAMEWORKS_PATH) $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(OUT)

runtests

#!/bin/bash
export DYLD_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Library/Frameworks
make
./octest

ОБНОВЛЕНИЕ ДЛЯ ЗАПИСИ ВЫХОДНОГО КОДА:

Через несколько дней после того, как я задал этот вопрос, Трэвис объявил о поддержке Objective-C:

http://about.travis-ci.org/blog/introducing-mac-ios-rubymotion-testing/

Хотя есть сценарии по умолчанию, которые они предлагают использовать для создания сборок, я решил использовать описанный здесь подход и по-прежнему использовать octest вместо подхода с xcodebuild, который использует Travis.

По умолчанию для установки travis используются сценарии сборки, написанные Джастином Спаром-Саммерсом: https://github.com/jspahrsummers/objc-build-scripts:

Они используют awk для захвата кода выхода из вывода xcodebuild, так как он всегда существует с кодом завершения 0, даже если весь набор тестов дает сбой!

OCTest ведет себя одинаково - он всегда существует с кодом 0, и вот как я использовал упрощенную версию сценария Travis awk для своих нужд, создавая его так, как я описал выше:

octest.awk

# Exit statuses:
#
# 0 - No errors found.
# 1 - Build or test failure. Errors will be logged automatically.

BEGIN {
    status = 0;
}

{
    print;
    fflush(stdout);
}

/[0-9]+: (error|warning):/ {
    errors = errors $0 "\n";
}

/with [1-9]+ failures?/ {
    status = 1;
}

END {
    if (length(errors) > 0) {
        print "\n*** All errors:\n" errors;
    }

    fflush(stdout);
    exit status;
}

runtests

#!/bin/bash

export DYLD_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Library/Frameworks

make

runtests ()
{
  ./octest 2>&1 | awk -f "octest.awk"

  local awkstatus=$?

  if [ "$awkstatus" -eq "1" ]
  then
    echo "Test suite failed"
    return $awkstatus
  else
    echo "Test suite passed"
    return 0
  fi
}

echo "*** Building..."

runtests || exit $?

4 ответа

Решение

Ответ на ваш главный вопрос - да: есть инструменты тестирования командной строки для Objective-C, которые не зависят от XCode.

Например, вы можете использовать OCUnit/SenTestingKit без использования Xcode. Все, что вам нужно сделать, это указать компилятору / компоновщику на фреймворк. Рассмотрим следующий файл, octest.m:

#import <Foundation/Foundation.h>
#import <SenTestingKit/SenTestingKit.h>

int main() {
  @autoreleasepool {
    SenSelfTestMain();
  }
  return 0;
}

@interface MyTest : SenTestCase
@end

@implementation MyTest
- (void)testSomething {
  STAssertEquals(1, 2, @"fail");
}
@end

Скомпилируйте это:

clang -o octest octest.m -F/Applications/Xcode.app/Contents/Developer/Library/Frameworks -framework Foundation -framework SenTestingKit

Теперь запустите

DYLD_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Library/Frameworks ./octest

и вы должны увидеть что-то вроде

Test Suite '/tmp/octest(Tests)' started at 2013-04-04 12:34:49 +0000
Test Suite 'MyTest' started at 2013-04-04 12:34:49 +0000
Test Case '-[MyTest testSomething]' started.
octest.m:16: error: -[MyTest testSomething] : '1' should be equal to '2': fail
Test Case '-[MyTest testSomething]' failed (0.000 seconds).
Test Suite 'MyTest' finished at 2013-04-04 12:34:49 +0000.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.000) seconds
Test Suite '/tmp/octest(Tests)' finished at 2013-04-04 12:34:49 +0000.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.001) seconds
make: *** [default] Error 1

Этот пример зависит от XCode в том смысле, что он использует встроенную инфраструктуру SenTestingKit, но общий процесс создания и запуска тестов, как описано выше, не зависит от XCode.

Теперь, чтобы запустить его в системе Linux, вам нужно установить SenTestingKit (и, скорее всего, GNUstep), но с этими компонентами процесс сборки и тестирования должен быть практически одинаковым.

Есть порты objcunit для платформ не Mac. Вы можете посмотреть на порт в MidnightBSD, который работает с GNUstep. Патчи должны работать и для других сред. У pkg-descr есть сайт с пакетами, а у Makefile будет URL-адрес для загрузки.

Посмотрите на xctool от Facebook, который является заменой Apple xcodebuild, Мы создаем нашу библиотеку Objective-C, используя maven, и используем ее только для тестов вместо xcodebuild и это прекрасно работает. Вывод намного более читабелен по сравнению с xcodebuild,

От xctool страница,

xctool is a replacement for Apple's xcodebuild that makes it easier to build 
and test iOS and Mac products. 

Однако следует отметить, что он не поддерживает создание целей. Вы можете использовать схему, хотя.

Для компиляции target-C я знаю быстрый и грязный (и несколько ограниченный) способ сделать это - я делаю это онлайн на http://www.compileonline.com/compile_objective-c_online.php. Тем не менее, этот компилятор отбрасывает много ошибок c-99, которые, я думаю, связаны с тем, что он является строгим надмножеством C и не включает некоторые более уникальные функции языка (например, @synthesize или даже точечную нотацию), но он выполняет свою работу. Я набираю код с помощью Notepad++. Как я уже сказал, ограниченный, но хирургический.
* Также - он поддерживает ввод в стиле командной строки, который является твердым.

Другие вопросы по тегам