Реализация модульного тестирования с iOS - PullRequest
36 голосов
/ 05 января 2010

Я следовал этому руководству , чтобы настроить модульное тестирование в моем приложении, когда я немного застрял.

В пуле 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 ...», и я действительно думаю, что они документировали такое обновление. Надеюсь, это будет исправлено в ближайшее время.

UPDATE: Вот подтверждение, что что-то изменилось с момента выпуска 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 ]

5 голосов
/ 28 января 2011

Дважды щелкните «Run script» в «Targets» / «Your target target name», затем введите

# Run the unit tests in this test bundle. 
"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests" 1> /tmp/RunUnitTests.out

В основном вам нужно добавить

1> /tmp/RunUnitTests.out

к тому, что уже есть

1 голос
/ 16 февраля 2011

Меню: Проект -> Новая фаза сборки -> Новая фаза сборки RunScript -> Вставьте следующее в пустую текстовую область:

"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests" 1> /tmp/RunUnitTests.out

Теперь попробуйте собрать, и вы должны получить ошибку при неудачных модульных тестах.

1 голос
/ 08 ноября 2010

попробуйте проверить эту проблему SenTestCase в Xcode 3.2 и XCBuildLogCommandInvocationSection Errors

обходной путь в этом вопросе работает для меня.

1 голос
/ 20 марта 2010

Вы пытались установить для конфигурации конфигурации значение «Отладка» для теста?

Я сделал это, как показано на http://nothing2fancy.com/2009/08/04/failed-tests-for-architecture-i386-gc-off/, и это сработало

0 голосов
/ 03 марта 2011

Это ожидаемое поведение.Сборка завершится неудачей, если один из тестов не пройден, и сборка будет успешной, если все тесты пройдут.

0 голосов
/ 28 января 2011

Пожалуйста, посмотрите на последний образец яблока . Когда вы загружаете код, появляется файл 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.

———————————————————————————————————————————————————————————————————————————————

Следовательно, есть некоторые изменения в наборе для тестирования. Я не думаю, что это будет стоить для регистрации ошибки.

0 голосов
/ 27 января 2011

ОК, никогда не играл с юнит-тестами в XCode (конечно, мне нравился JUnit в старые добрые времена Java). Так что это всего лишь пробная версия: какой компилятор вы используете, GCC или LLVM? Возможно, GCC - лучший выбор, чтобы быть в безопасности.

Есть ли у вас такое же поведение, когда в настройках проекта включен параметр «Построить только активную архитектуру»? Этот переключатель удаляет дубликаты сообщений об ошибках при сборке для armv6 и armv7, возможно, это связано.

0 голосов
/ 06 ноября 2010

Когда вы создаете классы для первого теста, убедитесь, что для Target задана цель UnitTest, а не цель приложения.

Если вы забудете сделать это при создании класса, вы можете «Получить информацию» о существующем классе и установить там цель ....

0 голосов
/ 01 апреля 2010

Я не знаю, правильно это или нет, но это работает для меня.

На вкладке «Общие» в тестовом наборе информации я добавить мой основной исполняемый файл приложения цель как прямая зависимость.

И нет ошибки для «i386 ′ (GC OFF)».

Удачи.

...