2013-03-30 1 views
3

Пост Compiling Objective-C without GUI говорит следующее:Есть ли какой-либо инструмент для тестирования командной строки на основе кода без кода Xcode для Objective-C?

Для компиляции Objective-C на OSX легкий путь, вы должны получить XCode, которое свободно получить из магазина приложений. Получение XCode обеспечит получение необходимых фреймворков (заголовков), таких как Foundation, Cocoa и т. Д. Это, однако, не предоставит вам необходимые инструменты командной строки для компиляции Object-C из командной строки. Откройте XCode, перейдите в раздел «Предпочтения»> «Загрузки»> «Компоненты» и «Установить средства командной строки». Это позволит установить GCC, лязг, сделать и т.д.

Я ищу инструмент без Xcode на основе решения этого мой вопрос, я только что открыл: Is it possible to make an Objective-C project to be tested on Travis?

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

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

ОБНОВЛЕНИЕ НА ОСНОВЕ ПРИНЯТА ОТВЕТ:

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

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

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://stackoverflow.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 

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

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

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

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

По установке Travis по умолчанию полагается на сборки скриптов, написанных Джастин Spahr-Саммерс: 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 $? 

ответ

1

Ответ на ваш основной вопрос: да. Существуют средства тестирования командной строки для Objective-C , которые не зависят от Xcode.

Например, вы можете использовать OCUnit/SenTestingKit без использования Xcode. Все, что вам нужно сделать - это указать ваш компилятор/компоновщик в рамки. Рассмотрим follwing файл, 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), но с этими компонентами в месте процесс сборки и испытания должны быть по существу то же самое.

+0

Большое спасибо за ваш ответ. Я не знал о «SenSelfTestMain()». Не могли бы вы расширить свой ответ, сказав мне, как я мог, используя ваш пример, «собрать все тестовые файлы .m-файлов рядом с Xcode в тестовой цели» (например: что, если MyTest находится в отдельном MyTest.m файл, а не в том же файле octest.m?). Извините, если я прошу что-то мертвое просто: я парень, который изучает C/Objective-C по принципу «сверху вниз», от уровня Xcode до основания. –

+0

А, самый простой подход - добавить #import «MyTest.m» над функцией main(), правильно? Я только что работал так. –

+1

Вам не нужно '# импортировать любые файлы заголовков при использовании автоматического обнаружения теста. Просто убедитесь, что вы связываете тестовые примеры с исполняемым файлом или загружаете их динамически во время выполнения, и 'SenSelfTestMain()' найдет тесты. Это то, что происходит в Xcode; он запускает исполняемый файл 'otest', который, в свою очередь, загружает тестовый пакет, содержащий тестовые примеры. –

2

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

+0

смотри также на Github: https://github.com/tancred/ObjcUnitPrototype: _ "Я экспериментировал с новой версией ObjcUnit, блок тест framwork для Objective-C, который я написал еще в 2001/2002 вместе с моим другом и коллегой Питер Линдберг. ObjcUnit был адаптацией (почти прямой перевод) в JUnit для Objective-C ... "_ –

0

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

+0

Спасибо за ваш ответ. Мне кажется, что вы задали вопрос по-другому, чем я спросил здесь: моя цель - найти инструмент тестирования единицы !, а не возможность проверить код Objective-C руками! В любом случае спасибо за ссылку, не знали об этом. –

0

Посмотрите на 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. 

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

Смежные вопросы