Тестирование блока командной строки Xcode 4.5
Наличие проблемы с момента обновления до Xcode 4.5 при выполнении моих модульных тестов через командную строку.
Ниже приводится вывод, который я вижу, когда пытаюсь запустить мои тесты.
Unknown Device Type. Using UIUserInterfaceIdiomPad based on screen size
Terminating since there is no workspace.
/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include:334: note: Passed tests for architecture 'i386' (GC OFF)
/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include:345: note: Completed tests for architectures 'i386'
Несмотря на то, что он говорит, что тесты прошли и завершились, я не думаю, что они действительно были запущены.
Я использую следующую команду для запуска тестов
xcodebuild -workspace MyApp.xcworkspace -scheme MyAppTests -sdk iphonesimulator -configuration Отладка чистой сборки TEST_AFTER_BUILD = YES
Кто-нибудь сталкивается с той же проблемой и может предложить решение?
Ответы
Ответ 1
Просто подумал, что я должен поделиться тем, что я сделал для решения этой проблемы. Я выполнил решение, описанное в fooobar.com/questions/116294/..., но преобразовал ruby script в оболочку. В конце я в основном установил ios-sim
через homebrew и заменил Run Script
в Build Phases
моей тестовой цели следующим образом:
if [ "$RUN_UNIT_TEST_WITH_IOS_SIM" = "YES" ]; then
test_bundle_path="$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.$WRAPPER_EXTENSION"
ios-sim launch "$(dirname "$TEST_HOST")" --setenv DYLD_INSERT_LIBRARIES=/../../Library/PrivateFrameworks/IDEBundleInjection.framework/IDEBundleInjection --setenv XCInjectBundle="$test_bundle_path" --setenv XCInjectBundleInto="$TEST_HOST" --args -SenTest All "$test_bundle_path"
echo "Finished running tests with ios-sim"
else
"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests"
fi
Чтобы начать тест, я передаю аргумент RUN_UNIT_TEST_WITH_IOS_SIM=YES
например.
xcodebuild -workspace MyApp.xcworkspace -scheme MyAppTests -sdk iphonesimulator -configuration Debug clean build RUN_UNIT_TEST_WITH_IOS_SIM=YES
Ответ 2
Я заметил эту проблему в бета-версиях Xcode 4.5/iOS 6. Я работал над автономным модульным тестировщиком, чтобы обойти эту проблему. Он работает путем компиляции вашего пакета unit test, а затем компиляции версии вашего приложения, которая автоматически запускает модульные тесты в среде симулятора.
Инструмент отнюдь не является полным, но у достаточного количества людей, похоже, есть эта проблема, что я выпускаю инструмент так, как сейчас. Пожалуйста, вилку или комментарий, чтобы я мог улучшить инструмент.
xcodetest: https://github.com/sgleadow/xcodetest
Также следите за этим радаром по проблеме http://openradar.appspot.com/12306879
Ответ 3
xcodebuild -project ${PROJECT_PATH}/${PROJECT_NAME}.xcodeproj \
-scheme ${TEST_SCHEME} \
-configuration Debug \
-sdk iphonesimulator5.1 \
clean build \
TEST_AFTER_BUILD=YES
Настройка iphonesimulator к версии 5.1, похоже, решает проблему. На эту проблему попали радиолокационные ошибки.
В этой статье также упоминается хорошее решение:
http://baolei.tumblr.com/post/32428168156/ios-unit-test-from-command-line-ios6-xcode4-5
Ответ 4
Также есть небольшой взлом, который может помочь запустить тесты командной строки на iOS6.0 simulator SDK
Я использую кедр, и эта настройка помогла мне:
Сначала вам нужно немного обновить файл main:
// Faking up that workspace port
CFMessagePortCreateLocal(NULL, (CFStringRef) @"PurpleWorkspacePort", NULL, NULL,NULL);
return UIApplicationMain(argc, argv, nil, @"CedarApplicationDelegate");
Во-вторых, вам нужно добавить категорию в UIWindow:
@implementation UIWindow (Private)
- (void)_createContext {
// Doing nothing here. Just for crash avoidance
}
@end
Cedar Unittest будет работать нормально, с некоторыми предупреждениями во время выполнения, но, по крайней мере, они смогут запускать:)