Неправильное покрытие кода приводит к XCode при тестировании исключений - PullRequest
6 голосов
/ 15 марта 2012

Я создаю статическую библиотеку для iOS и пытаюсь получить данные покрытия кода для ее модульных тестов.Я использую CoverStory для визуализации сгенерированных файлов покрытия кода.

Я получаю правильную информацию для большинства тестов.

Однако любой тест, который проверяет, что должно быть выброшено исключение, не являетсяпомечается как проверенное.

Например, метод

- (void)shouldThrow:(BOOL)throw {

    if (throw)
       @throw [NSException exception...];

    NSLog(@"not thrown");

}

Проверено с помощью теста

- (void)testShouldThrow {
    STAssertThrows( [myObject shouldThrow:YES], @"Should have thrown an exception");

    STAssertNoThrow( [myObject shouldThrow:NO], @"Should not have thrown an exception");
}

Пройдет все испытания (т. е. исключение выдается правильно),Однако покрытие кода не показывает 100% - строка с @throw не помечена как проверенная.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 19 марта 2012

Строка с @throw на ней не завершена (потому что выброшено исключение), поэтому она не помечается как покрытая.Вы можете отправить сообщение об ошибке, но это, вероятно, довольно трудно исправить.Если это одна строка в выражении ветвления, может быть очень трудно сказать, проверялось ли оно, но если перед ним есть строки, которые были выполнены, вам нужно будет просто предположить, что это тоже было.1002 * Плохо то, что вы никогда не сможете достичь 100%.

0 голосов
/ 16 августа 2013

Еще хуже проблема в том, что кажется, что счетчики строк перед @throw в том же блоке условий также не являются одинаковыми.Поэтому просто написать код перед @throw в качестве маркера не поможет решить проблему.

Однако , я обнаружил, что условия включают переменные ("if (YES)", "if (1 == 1) "не в делах") всегда покрываемыСледовательно, мы могли бы сделать непростую задачу - сначала определить тривиальную переменную условия, а затем добавить тест условия, включающий эту переменную, перед @ throw.

static BOOL __trivialYES = YES;   //for cover @throw, and never use 'const'

затем

if(__trivialYES) @throw ...;

Помогает решить проблему, и для вашего удобства вы можете определить свой собственный макрос для этих вещей.

#define #throw if (__trivialYES)

, а затем оператор throw:

#throw ...;

, и это, вероятно, сделает тест покрытияработать лучше.

PS: «#throw» - просто пример макроса.Это так же, как другой макрос.'#' - просто действительный символ (для некоторых прекомпиляторов), что делает его особенным.

...