Реализация модульного тестирования с iOS
Я следовал этому руководству, чтобы настроить модульное тестирование в моем приложении, когда я немного застрял.
В пункте 8 в этом уроке показано это изображение, чего я и должен ожидать при сборке: http://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iphone_development/art/logic_test_failure_text_editor.jpg
Однако это не то, что я получаю, когда строю. Я получаю это сообщение об ошибке: Command /bin/sh failed with exit code 1
а также сообщение об ошибке, созданное модульным тестом. Затем, когда я раскрываю первую ошибку, я получаю это:
PhaseScriptExecution "Run Script" "build/3D Pool.build/Debug-iphonesimulator/LogicTests.build/Script-1A6BA6AE10F28F40008AC2A8.sh"
cd "/Users/james/Desktop/FYP/3D Pool"
setenv ACTION build
setenv ALTERNATE_GROUP staff
...
setenv XCODE_VERSION_MAJOR 0300
setenv XCODE_VERSION_MINOR 0320
setenv YACC /Developer/usr/bin/yacc
/bin/sh -c "\"/Users/james/Desktop/FYP/3D Pool/build/3D Pool.build/Debug-iphonesimulator/LogicTests.build/Script-1A6BA6AE10F28F40008AC2A8.sh\""
/Developer/Tools/RunPlatformUnitTests.include:412: note: Started tests for architectures 'i386'
/Developer/Tools/RunPlatformUnitTests.include:419: note: Running tests for architecture 'i386' (GC OFF)
objc[12589]: GC: forcing GC OFF because OBJC_DISABLE_GC is set
Test Suite '/Users/james/Desktop/FYP/3D Pool/build/Debug-iphonesimulator/LogicTests.octest(Tests)' started at 2010-01-04 21:05:06 +0000
Test Suite 'LogicTests' started at 2010-01-04 21:05:06 +0000
Test Case '-[LogicTests testFail]' started.
/Users/james/Desktop/FYP/3D Pool/LogicTests.m:17: error: -[LogicTests testFail] : Must fail to succeed.
Test Case '-[LogicTests testFail]' failed (0.000 seconds).
Test Suite 'LogicTests' finished at 2010-01-04 21:05:06 +0000.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.000) seconds
Test Suite '/Users/james/Desktop/FYP/3D Pool/build/Debug-iphonesimulator/LogicTests.octest(Tests)' finished at 2010-01-04 21:05:06 +0000.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.002) seconds
/Developer/Tools/RunPlatformUnitTests.include:448: error: Failed tests for architecture 'i386' (GC OFF)
/Developer/Tools/RunPlatformUnitTests.include:462: note: Completed tests for architectures 'i386'
Command /bin/sh failed with exit code 1
Теперь это очень странно, так как он запускает тесты (и, как вы можете видеть, у меня срабатывает STFail), потому что, если я добавлю другой тест, который пройдет, я не получу ошибок, поэтому тесты работают нормально. Но почему я получаю эту дополнительную сборку?
Также можно отметить, что при загрузке решений / шаблонов, которые должны работать, я получаю ту же ошибку. Я предполагаю, что я что-то здесь неправильно настроил, но я только на 100% правильно выполнил урок!
РЕДАКТИРОВАТЬ: Согласно этому блогу, этой публикации и несколько других веб-сайтов, я не единственный, кто получает эту проблему. Так было с момента выпуска xCode 3.2, предполагая, что документы и учебные руководства Apple Dev Center также до версии 3.2.
Однако некоторые говорят, что это известная проблема, тогда как другие, кажется, думают, что это было сделано намеренно. Мне, например, хотелось бы и расширенную консоль, и сообщения кода, и мне определенно не нравится ошибка "Command /bin/sh...", и я действительно думаю, что они документировали такое обновление. Надеюсь, это скоро будет исправлено.
ОБНОВЛЕНИЕ: Вот подтверждение, что что-то изменилось с момента выпуска xCode 3.2.1.
Это изображение: http://ing0.co.uk/info/pics/unittest-xcode-3.2.1.png из моей тестовой сборки с использованием 3.2.1. Это из более старой версии (3.1.4): http://ing0.co.uk/info/pics/unittest-xcode-3.1.4.png. (Проект для обоих остался без изменений).
9 ответов
Дважды щелкните "Run script" в "Targets" / "Your target target name" и введите
# Запустите модульные тесты в этом тестовом комплекте. "${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests" 1> /tmp/RunUnitTests.out
В основном вам нужно добавить
1> /tmp/RunUnitTests.out
к тому, что уже есть
Попробуйте проверить эту проблему SenTestCase в Xcode 3.2 и XCBuildLogCommandInvocationSection Ошибки
Обходной путь в этом вопросе работает для меня.
Меню: Проект -> Новая фаза сборки -> Новая фаза сборки RunScript -> Вставьте следующее в пустую текстовую область:
"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests" 1> /tmp/RunUnitTests.out
Теперь попробуйте собрать, и вы должны получить ошибку при неудачных модульных тестах.
Вы пытались установить конфигурацию сборки "Отладка" для тестового случая?
я сделал это, как показано на http://nothing2fancy.com/2009/08/04/failed-tests-for-architecture-i386-gc-off/ и это сработало
Я не знаю это правильно или нет, но это работа для меня.
На вкладке "Общие" в тестовом наборе информации я добавляю исполняемую цель моего основного приложения в качестве прямой зависимости.
И нет ошибки для "i386′ (GC OFF)".
Удачи.
Когда вы создаете классы для первого теста, убедитесь, что для Target задана цель UnitTest, а не цель приложения.
Если вы забудете сделать это при создании класса, вы можете "Получить информацию" о существующем классе и установить цель там....
Пожалуйста, посмотрите на последний образец яблока. Когда вы загружаете код, появляется файл read me, в котором четко написано:
———————————————————————————————————————————————————————————————————————————————
Running Logic Tests
To run the logic tests:
1. Choose Project > Set Active Target > CalculatorTests.
2. Choose Project > Set Active SDK > Simulator.
3. Choose Build > Build. Xcode runs the test cases implemented in
the CalculatorTests.m file.
4. Choose Build > Build Results to open the Build Results window, containing
the tests results. You may have to click the Show Transcript button (the
third button on the bottom-left corner of the build results list) to view
the build transcript.
The logic-tests results look similar to this:
PhaseScriptExecution <project_directory>/build/iPhoneUnitTests.build/Debug-iphonesimulator/CalculatorTests.build/Script-17AA84010F99894F00167681.sh
cd <project_directory>
/bin/sh -c <project_directory>/build/iPhoneUnitTests.build/Debug-iphonesimulator/CalculatorTests.build/Script-17AA84010F99894F00167681.sh
/Developer/Tools/RunPlatformUnitTests.include:364: note: Started tests for architectures 'i386'
/Developer/Tools/RunPlatformUnitTests.include:371: note: Running tests for architecture 'i386' (GC OFF)
objc[1222]: GC: forcing GC OFF because OBJC_DISABLE_GC is set
objc[1222]: GC: forcing GC OFF because OBJC_DISABLE_GC is set
Test Suite '<project_directory>/build/Debug-iphonesimulator/CalculatorTests.octest(Tests)' started at 2009-05-19 16:55:28 -0700
Test Suite 'CalculatorTests' started at 2009-05-19 16:55:28 -0700
<time> otest[1222:80f] -[CalculatorTests testAddition] setUp
<time> otest[1222:80f] -[CalculatorTests testAddition] start
<time> otest[1222:80f] -[CalculatorTests testAddition] end
<time> otest[1222:80f] -[CalculatorTests testAddition] tearDown
Test Case '-[CalculatorTests testAddition]' passed (0.007 seconds).
<time> otest[1222:80f] -[CalculatorTests testDivision] setUp
<time> otest[1222:80f] -[CalculatorTests testDivision] start
<time> otest[1222:80f] -[CalculatorTests testDivision] end
<time> otest[1222:80f] -[CalculatorTests testDivision] tearDown
Test Case '-[CalculatorTests testDivision]' passed (0.003 seconds).
<time> otest[1222:80f] -[CalculatorTests testInputException] setUp
<time> otest[1222:80f] -[CalculatorTests testInputException] start
<time> otest[1222:80f] -[CalculatorTests testInputException] end
<time> otest[1222:80f] -[CalculatorTests testInputException] tearDown
...
Test Case '-[CalculatorTests testSubtractionNegativeResult]' passed (0.002 seconds).
Test Suite 'CalculatorTests' finished at 2009-05-19 16:55:28 -0700.
Executed 6 tests, with 0 failures (0 unexpected) in 0.021 (0.022) seconds
Test Suite '<project_directory>/build/Debug-iphonesimulator/CalculatorTests.octest(Tests)' finished at 2009-05-19 16:55:28 -0700.
Executed 6 tests, with 0 failures (0 unexpected) in 0.021 (0.024) seconds
/Developer/Tools/RunPlatformUnitTests.include:388: note: Passed tests for architecture 'i386' (GC OFF)
/Developer/Tools/RunPlatformUnitTests.include:399: note: Completed tests for architectures 'i386'
Remember that logic tests are executed as part of the build process to provide
you with build errors for failed unit tests. Logic unit-test bundles are not
intented to run in iPhone Simulator or a device.
———————————————————————————————————————————————————————————————————————————————
Следовательно, есть некоторые изменения в наборе для тестирования. Я не думаю, что это будет стоить для регистрации ошибки.
Хорошо, никогда не играл с юнит-тестами в XCode (конечно, мне нравился JUnit в старые добрые времена Java). Так что это всего лишь пробная версия: какой компилятор вы используете, GCC или LLVM? Возможно, GCC - лучший выбор, чтобы быть в безопасности.
Есть ли у вас такое же поведение, когда в настройках проекта включена опция "Только активная архитектура"? Этот переключатель удаляет дубликаты сообщений об ошибках при сборке для armv6 и armv7, возможно, это связано.
Это ожидаемое поведение. Сборка завершится неудачей, если один из тестов не пройден, и сборка будет успешной, если все тесты пройдут.