Почему Cobertura не сообщает о том, что путь к ветке утвержден? - PullRequest
7 голосов
/ 25 февраля 2011

В Cobertura , я не могу заставить его сообщить, что условный путь утверждения assert был выбран. Это известное ограничение?

У меня есть тест JUnit , который ожидает, что будет выдано AssertionError, и он пройдет правильно. Проблема в том, что Cobertura сообщает, что ветвь assert не была покрыта.


После дополнительного расследования я вижу, что часть покрытия филиала обнаруживается. Строка вопроса:

assert data != null;

и Cobertura сообщает о покрытиях как:

Условное покрытие 75% (3/4) [каждое условие 50%, 100%].

Какие различные условия ветвления ожидает Кобертура?

Ответы [ 2 ]

10 голосов
/ 15 июля 2011

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

Для каждого заявления Java assert Cobertura отслеживает два условия:

  1. Был ли данный оператор утверждения выполнен с включенной или отключенной проверкой утверждений.
  2. Действительно ли предикат оценивается как истинный или ложный.

Таким образом, возможны четыре исхода. Информация предоставлена для данной строки в отчете HTML состоит из

  • результат для условия 1 (0-2 возможности, взятые из 2, адресация выполнения с включенной или отключенной проверкой),
  • и результат для условия 2 (0-2 возможностей, взятых из 2: утверждение подтверждено или не выполнено).
  • общий результат (0-4 из 4),

Типичные сценарии:

  • Запуск Cobertura один раз с проверкой утверждений отключен . Вы получите:
    Включено / выключено: 50% (отключено); Выполнено / не выполнено: 0% (не достигнуто); Следовательно, в целом 25%.
    Cobertura сообщит об этом как

    Conditional coverage 25% (1/4) [each condition 50%, 0%]

  • Запуск Cobertura один раз, с проверкой утверждений включен . Как правило, ваши утверждения всегда верны, поэтому вы получите:
    Включено / выключено: 50% (включено); Пройдено / не выполнено: 50% (всегда верно); Следовательно, в целом: 50%.

  • Запуск Cobertura дважды, один раз с проверкой утверждений включен, и один раз без. Предполагая, что утверждения всегда верны, мы получаем:
    Включено / выключено: 100% (как включено, так и отключено); Пройдено / не выполнено: 50% (всегда верно); Следовательно, в целом 75%.

Тогда, если мы добавим тестовые случаи, которые гарантируют, что данное утверждение выходит из строя по крайней мере один раз, и проходит по крайней мере один раз, мы получаем все цифры на 100%.

Обратите внимание, что если вы используете утверждения в стиле дизайна по контракту, вы вообще не сможете заставить их потерпеть неудачу, см. ответ на другой вопрос о переполнении стека, покрытие Cobertura и ключевое слово assert .

Наконец: хотя эти цифры объяснимы, я не уверен, что они очень полезны. Я бы предпочел, чтобы в общих отчетах пропускалось освещение, связанное с утверждениями. Clover может сделать это, но я не знаю инструмента анализа покрытия с открытым исходным кодом с этой замечательной функцией.

3 голосов
/ 25 февраля 2011

Мне удалось получить 100% покрытие, запустив JUnit дважды;один раз с включенными утверждениями и один раз с отключенными утверждениями.

...