Модульное тестирование и TDD, OCUnit vs Google Tool Box

Я пытаюсь выбрать между OCUnit и Google Tool Box, есть ли у вас какие-либо предпочтения, порекомендует тот или иной, почему? Мне было бы очень интересно узнать о вашем опыте с любым из двух.

Основная проблема, с которой я сталкиваюсь, заключается в управлении сбоями в тестируемых методах (например: BAD ACCESS) Никто из них не смог сказать мне, в каком классе произошел сбой!!!

С помощью панели инструментов Google я могу увидеть, какой тестовый пакет запускается, но не тестовый пример (как вы должны делать, когда в вашем тестовом наборе 50 тестовых случаев?)

С OCUnit я могу хотя бы увидеть, какой тестовый пример в том, что тестовый набор вызвал сбой.

Вот сообщение, которое у меня есть с GTB:

Executed 0 tests, with 0 failures (0 unexpected) in 0.000 (0.000) seconds

Test Suite 'LogicTests' started at 2009-12-14 18:03:15 +0100

 /Users/admin/Documents/Tests/GTBTest/RunIPhoneUnitTest.sh: line 122:   688    Segmentation fault      "$TARGET_BUILD_DIR/$EXECUTABLE_PATH" -RegisterForSystemEvents

 Command /bin/sh failed with exit code 139

Я вижу, что это тестовый набор "LogicTests", который вызвал сбой, но все.

С OCunit вот сообщение для той же ошибки:

Test Suite 'LogicTests' started at 2009-12-14 17:51:26 +0100
Test Case '-[LogicTests testFail]' started.
/Developer/Tools/RunPlatformUnitTests.include: line 415:   536 Segmentation fault      "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}"

По крайней мере, с OCUnit я могу отслеживать, какой тестовый пример выполнялся, и, в конечном итоге, отлаживать его (но это может занять очень много времени без информации о номере и номере строки...)

Как вы справляетесь с этими проблемами?

Спасибо заранее.

PS: вот как воспроизвести проблему, это очень просто:

Просто создайте класс с методом, который сбой при его вызове (который происходит все время, когда вы делаете TDD):

- (void) crashMethod {
 NSMutableArray *crashArray;
 [crashArray addObject:[NSObject new]];
}

И затем создайте тестовый пример, который вызывает следующие методы:

- (void) testFail {
    ClassToTest *test = [[ClassToTest alloc] init];
 [test crashMethod];
 [test release];
 }

Спасибо заранее, Винсент

Ответ 1

Думаю, я поеду с GTB.

С xCode 3.2 Ошибки OCUnit и предупреждения не отображаются внутри кода. Кажется, это известная проблема: l http://osdir.com/ml/xcode-users/2009-10/msg00216.html

С GTB он отлично работает. Я не могу поверить в это, но кажется, что GTB лучше интегрирован с более новыми версиями xCode, чем OCUnit....

Отладка модульных тестов не требует ничего, он отлично работает с самого начала. (с xCode вам нужно множество настроек: http://chanson.livejournal.com/119578.html

С GTB вы можете запускать тесты на устройстве, и у вас есть инструменты для тестирования пользовательского интерфейса (похоже, вы можете создать поддельную иерархию UIView, а затем сравнить ее с тем, что у вас есть во время выполнения). Я скептически отношусь к автоматическому тестированию пользовательского интерфейса (дорогостоящему и трудноуправляемому), но это приятная функция!

http://code.google.com/p/google-toolbox-for-mac/wiki/CodeVerificationAndUnitTesting

Ответ 2

Кстати, Google Toolbox теперь печатает сообщения о запущенных тестах, если кто-то задавался вопросом: -)