Cobertura отказывается признать, что код был закрыт

Я использую подключаемый модуль Maven (2) Cobertura для создания отчетов о покрытии кода, и у меня есть следующая заглушка, которую я использую в методе:

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
}
System.err.println("The program never exited!");

Я знаю, что мне нужно зарегистрировать исключение и т. Д., Но сейчас это не главное ... Cobertura отказывается признать, что строка после печати трассировки стека закрыта. То есть строка с '}' перед оператором System.err.println не отображается как закрытая. Раньше закрывающая фигурная скобка метода не отображалась как закрытая, поэтому оператор System.err. Любая идея, как я могу убедить плагин cobertura maven, что, поскольку оператор System.err.println закрыт, эта конечная фигурная скобка должна быть закрыта?

Ах да, и я использую фиктивный менеджер безопасности, чтобы создать исключение безопасности, так как это самый простой из найденных мной способов заставить тест продолжать выполняться после вызова System.exit.


person MetroidFan2002    schedule 13.10.2008    source источник


Ответы (4)


Я не использовал Cobertura какое-то время (2005?) и видел такое поведение тогда. Аналогичная проблема существует с NCover для C# и фигурными скобками после блоков catch/finally.

Я бы предложил добавить в этот отчет об ошибке Cobertura с подробным описанием аналогичного проблема. Кроме того, следуйте совету @tvanfosson и поймите, что отсутствие охвата фигурной скобки, которая на самом деле ничем не становится в JVM, - это то, что вы можете игнорировать как «шум».

person user7116    schedule 13.10.2008
comment
Спасибо, я добавил свой пример кода к указанной вами ошибке. Надеюсь, эта ошибка будет исправлена ​​в будущем, я не знал, что это ошибка, пока вы не разместили эту ссылку. Просто подумал, что это какая-то проблема с конфигурацией, которую я пропустил! - person MetroidFan2002; 13.10.2008

Я бы посмотрел отчет о покрытии. Дважды проверьте мои тесты. Обратите внимание, что код действительно покрывается, и не беспокойтесь о достижении 100%. Покрытие кода лучше всего использовать, чтобы найти области, которые вы, возможно, пренебрегли своими тестами, но просто сосредоточиться на получении 100% покрытия в качестве цели — плохая привычка, которая может привести к тому, что вы пропустите тесты, которые необходимо написать, только потому, что ваш инструмент показывает 100%. Используйте инструмент для того, что он может сделать, но не попадайте в ловушку, позволяя инструменту определять, что вы делаете.

person tvanfosson    schedule 13.10.2008
comment
Я согласен с вашим утверждением, однако очень раздражает невозможность достичь идеального покрытия кода, когда покрыт код выше и ниже скобки. Это тесты, которые я делаю, когда код свежий, поэтому функциональности пока не так много. - person MetroidFan2002; 13.10.2008
comment
Идеальное покрытие — это заблуждение. Вам нужно тратить время на сложный код, а не на геттеры и сеттеры. Покрытие ценно только в той мере, в какой оно помогает вам достичь цели, за которую вам платят, — предоставления продукта, а не отчетов. - person ddimitrov; 13.10.2008
comment
Конечно, идеальное покрытие не является конечной целью всех метрик, но я не согласен с вашим мнением о тестировании геттеров и сеттеров. Много раз геттер или сеттер модифицировались, чтобы иметь недокументированный побочный эффект, и его трудно отследить. Убийство теста решает эту проблему - person MetroidFan2002; 13.10.2008
comment
›› Много раз геттеры или сеттеры модифицировались, чтобы иметь побочный эффект, который не задокументирован, и его трудно отследить. Есть ли у вас какие-либо эмпирические данные? Мой личный опыт работы с системами среднего размера (100-1000 kloc) говорит мне, что это не так ... или, может быть, мне просто повезло :-) - person ddimitrov; 13.10.2008
comment
Вам просто повезло :) Один из особенно неприятных побочных эффектов, которые я обнаружил, - это геттер, который выполняет вычисление O (n) на своем выходе перед возвратом... если тестовый пример был создан для явной проверки этого O ( n) функциональность, ее было бы легко отследить и устранить. - person MetroidFan2002; 13.10.2008

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

Я знаю, что у Эммы похожие проблемы. Clover работает намного лучше, но является коммерческим (не уверен, что он справится и с этим случаем). . Если вы используете IDEA, попробуйте их новую реализацию покрытия. - это неплохо и в активной разработке.

person Community    schedule 13.10.2008
comment
Я пропущу все, что не бесплатно ;) Что касается моей IDE, я довольно широко использую Eclipse. Я бы попробовал Emma, ​​но, к сожалению, у него нет плагина Maven 2, о котором я знаю, поэтому на данный момент Cobertura — лучший вариант, о котором я знаю. - person MetroidFan2002; 13.10.2008

Я знаю, что это старый вопрос и что Cobertura уже исправил это, но для полноты отсутствующее покрытие на «}» было вызвано внутренним автоматическим блоком «finally».

Смотрите свой код следующим образом:

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
} finally {
    // noop
}

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

person Bruno D. Rodrigues    schedule 28.05.2013