Упрощенные утверждения в OCUnit - PullRequest
3 голосов
/ 11 февраля 2010

Я только начал использовать JCUnit и считаю, что утверждения немного громоздки. В JUnit я могу написать тест для сравнения чисел, как показано ниже. Этот тест, очевидно, провалится, но он показывает хороший, простой утверждение, которое я могу написать для двух чисел, и обратную связь, которую я получаю: «ожидается <2>, но было <3>» с очень небольшим кодом.

alt text

То, что я до сих пор пробовал в XCode:

alt text

Что работает, но не так элегантно, как JUnit. Знаете ли вы, существуют ли макросы утверждений, например, JUnit для XCode (OCUnit)? Кроме того, возможно ли получить красную / зеленую полосу в XCode?

Ответы [ 4 ]

6 голосов
/ 24 февраля 2010

Первое, что нужно знать, это то, что OCUnit (он же SenTestingKit.framework) интегрирован с XCode, но на самом деле не часть собственно XCode. OCUnit начинался как сторонний код и стал стандартом de facto для модульного тестирования Objective-C, поэтому Apple приняла его и теперь поддерживает.

Более того, вывод, который вы видите, кажется несколько странным. Я использую Xcode 3.2.1, который поставляется со Snow Leopard. Я попробовал следующий тест:

- (void) testNumbers {
    int number1 = 2;
    int number2 = 3;
    STAssertEquals(number1, number2, nil);
    STAssertEquals(4, 5, nil);
}

Вот ошибки, которые я вижу в области / окне результатов сборки Xcode:

-[ExampleTest testNumbers] : '2' should be equal to '3'
-[ExampleTest testNumbers] : '4' should be equal to '5'

Когда я дважды щелкаю по ошибке в журнале сборки, XCode сразу переходит к строке ошибочного утверждения.

Макросы OCUnit, конечно, не идеальны, но пример, который вы использовали выше, был невероятно подробным. Макросы требуют либо 2+, либо 3+ аргументов. (STFail является исключением и требует только 1+ аргументов.) Последний обязательный аргумент всегда является необязательной строкой формата для описания, и любые другие параметры используются для замены в этих заполнителях, как вы это делаете с printf() или NSLog(). Если вы передадите nil, вы получите ошибку по умолчанию без дополнительных подробностей.

Обычно я добавляю описание только тогда, когда тест действительно требует контекста. Например, что на самом деле означают тест и / или субъект (ы) утверждения. Чаще всего я просто включаю эту информацию в качестве комментариев вокруг утверждения. Проще лучше. : -)

Чтобы ответить на ваш последний вопрос, в настоящее время нет способа получить красно-зеленую полосу в XCode, как вы видели бы с JUnit. Это может быть хорошим дополнением, но не то, что я лично считаю критическим. YMMV.

1 голос
/ 24 февраля 2010

Как уже говорили другие, вы можете немного облегчить восприятие макросов, передав nil в качестве последнего аргумента. Это даст вам вывод по умолчанию, если тест не пройден. Конечно, вы можете указать свою собственную строку, когда захотите. Я часто нахожу это полезным для кода, который имеет методы, которые возвращают BOOL или id, но принимают NSError* по ссылке, подобной этой:

- (void)testFoo {
  NSError *err;
  STAssertTrue([bar fooMethodReturningBOOLError:&err], @"Error: %@ (%@)", err, [err userInfo]);
}

Что касается красной / зеленой полосы, вы получаете красный / зеленый результат в качестве последнего шага сборки в окне сборки, но он не так видим, как в других средах разработки. Есть много хорошей литературы по психологии, предполагающей, что сделать ее намного более заметной было бы хорошей идеей. Обязательно отправьте запрос на улучшение на bugreport.apple.com . Вы можете сослаться на rdar://7685315 (мой билет на этот счет).

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

В настоящее время доступен отличный фреймворк под названием OCHamcrest. Это позволяет вашим тестовым утверждениям читать как предложение, и в общем случае вам не нужно предоставлять описание ошибки, что для меня является последним, что я не хочу делать в тесте, потому что его нужно поддерживать.

Вот гитхуб https://github.com/hamcrest/OCHamcrest

Вот пример из файла readme

NSCalendarDate* date = [NSCalendarDate dateWithString:@"26 Apr 2008" calendarFormat:@"%d %b %Y"];
assertThat(date, is(onASaturday()))

Утверждения очень удобны для OCUnit, и добавление собственных утверждений довольно просто.

0 голосов
/ 11 февраля 2010

Почему бы не создать свою собственную обертку для этого?

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

...