Реализация модульного тестирования с iOS
Я следовал этому руководству, чтобы настроить модульное тестирование в моем приложении, когда я немного застрял.
В пуле 8 в этом уроке показано это изображение, чего я и должен ожидать при сборке: alt text 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.
Это изображение: alt text 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. (Проект для обоих остался без изменений).
Ответы
Ответ 1
Дважды щелкните "Запустить script" в разделе "Целевые числа" / "Твое имя script", затем введите
# Run the unit tests in this test bundle.
"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests" 1> /tmp/RunUnitTests.out
В основном вам нужно добавить
1> /tmp/RunUnitTests.out
к тому, что уже существует
Ответ 2
Вы пытались настроить конфигурацию сборки на "Debug" для тестового примера?
Я сделал это, как показано на http://nothing2fancy.com/2009/08/04/failed-tests-for-architecture-i386-gc-off/, и он работал
Ответ 3
попробуйте проверить эту проблему SenTestCase в Xcode 3.2 и XCBuildLogCommandInvocationSection Errors
обходной путь в этом вопросе работает для меня.
Ответ 4
Меню: Проект → Фаза новой сборки → Новая фаза сборки RunScript → Вставьте следующее в пустую область текста:
"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests" 1> /tmp/RunUnitTests.out
Теперь попробуйте построить, и вы должны получить сообщение об ошибках в модульных тестах.
Ответ 5
Я не знаю этого правильно или нет, но он работает для меня.
В общей вкладке информационного теста, я добавить исполняемый файл основного приложения target как прямая зависимость.
И никакой ошибки для 'i386' (GC OFF) ".
Удачи.
Ответ 6
Когда вы создаете свои классные классы тестов, убедитесь, что Target установлен на целевую страницу UnitTest, а не на целевую программу.
Если вы забудете сделать это при создании класса, вы можете "Получить информацию" в существующем классе и установить там цель.
Ответ 7
Хорошо, никогда не играл с модульными тестами в XCode (конечно, мне нравился JUnit в старые добрые времена Java). Итак, это просто пробная версия: какой компилятор вы используете, GCC или LLVM? Возможно, GCC - лучший выбор, чтобы быть в безопасности.
Есть ли у вас такое же поведение, когда включена опция "Только встроенная активная архитектура" в настройках проекта? Этот переключатель удаляет повторяющиеся сообщения об ошибках при создании для armv6 и armv7, возможно, это связано.
Ответ 8
Пожалуйста, взгляните на последнее яблоко sample. Когда вы загружаете код, есть файл 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.
———————————————————————————————————————————————————————————————————————————————
Следовательно, есть некоторые изменения в наборе для отправки. Я не думаю, что это было бы полезно для подачи ошибки.
Ответ 9
Это ожидаемое поведение. Сборка завершится неудачно, если один из тестов завершится неудачно, и сборка будет успешной, если пройдут все тесты.