Странное поведение инструмента покрытия кода ECLEmma в eclipse

есть странная проблема с инструментом покрытия кода ECLEmma:

Для класса MyFirstLogger я написал тестовый класс MyFirstLoggerTest:

введите здесь описание изображения

введите здесь описание изображения

Обратите внимание, что я написал в MyFirstLoggerTest метод тестирования, в котором я ожидаю получить исключение NullPointerException, просто для того, чтобы пройти else if-случай в setLogger-методе в MyFirstLogger, где logger равно нулю, а NullPointerexception выдается.

Но почему эта ветка до сих пор желтая, а не зеленая? Это ошибка?


person user3133542    schedule 02.05.2015    source источник


Ответы (1)


Такое поведение является распространенным:

  • testNullableGetLogger читается, потому что Emma (но и большинство других инструментов покрытия кода) помечают строку как успешную, если она завершена. Поскольку выдается исключение (NullPointerException), строка (и метод!) не может быть завершена и, таким образом, красная.

  • else if (logger == null) имеет желтый цвет, потому что emma добавляет в код неявный случай else. В вашем случае этот случай else никогда не может быть введен, потому что случаи if охватывают все состояния в регистраторе. Чтобы строка стала зеленой, замените ее на else.

person CoronA    schedule 02.05.2015
comment
Добавляет неявное else... где? на if в строке 16? ДАЖЕ при этом условие в строке 16 все еще присутствует (вы сказали, что проверили байт-код); почему он не помечен как выполненный? - person Ira Baxter; 02.05.2015
comment
Желтый цвет означает, что он частично выполнен. Подсказка в eclipse говорит: «1 из 2 ветвей пропущена». Обычный сбой, если ветвь else не введена или, как здесь, не существует в исходном коде. - person CoronA; 02.05.2015
comment
Описанной модификации нет в байт-коде файла класса. Я не проверял байт-код времени выполнения, но похоже, что каждый if ... else if без else получает синтетический else или отсутствующий else, по крайней мере, сообщается таким образом. - person CoronA; 02.05.2015
comment
В байт-код не добавляется неявное else; каждое условие ==, != и т. д. создает инструкцию байт-кода условного перехода. Что происходит, так это то, что условие является избыточным, поскольку оно всегда будет оцениваться как true если достигнуто. Однако инструменты покрытия кода не обнаруживают такую ​​избыточность, поскольку для этого потребуется сложный анализ потока данных. - person Rogério; 05.05.2015
comment
@IraBaxter Он не помечен как выполненный, потому что инструмент покрытия (здесь JaCoCo, но и JMockit Coverage) не выполняет анализ потока данных. Насколько я знаю, ни один инструмент покрытия в настоящее время не делает этого, включая Clover. - person Rogério; 05.05.2015
comment
Спасибо за разъяснение. Это означает, что Jacoco проверяет обход всех условных целей и остальных. Тем не менее, если остаток виден только в байт-коде (как здесь), я бы назвал это неявным «иначе». Как я теперь понимаю это не Jacoco добавлено, оно уже есть. Ты согласен? - person CoronA; 05.05.2015