Eclemma говорит, что 1 из 4 ветвей не покрыт, но какая ветка это?
Есть ли простой способ узнать, какая ветка мне не хватает? То есть У меня есть код такой:
if (x || y) {
// do stuff
}
В подсветке покрытия есть желтая точка в Eclipse, которая гласит:
1 из 4 пропущенных веток
но я хотел бы знать, какая ветка отсутствует.
Ответы
Ответ 1
открыть вопрос в реестре github для родителя Eclemma, jacoco, предполагает, что такую функцию на самом деле немного сложно включить.
Однако, даже без функции Eclemma, если целью является просто выяснить, какие ветки пропустили в конкретном случае, вы можете настроить код для отслеживания. Самый простой пример - старомодные заявления печати:
if (x || y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
Затем просмотрите вывод и посмотрите, какие ветки вы на самом деле нажали (например, java ... | grep "BRANCH:" | sort | uniq
). (я не знаю, насколько это ужасно удовлетворяет).
Ответ 2
Что могут быть x
и y
?
-
true || true
true (не рассматривается из-за оптимизации JVM: если первое условие true
, второе не будет оцениваться из-за оценки короткого замыкания)
-
false || true
true
-
true || false
true
-
false || false
false
Ответ 3
Ответ true|| true
не был рассмотрен.
Это связано с тем, что, как только JVM обнаружил, что первое условие является истинным, тогда оно не будет выполнять второе условие (оно оптимизировано), что означает, что часть кода никогда не запускается.
Как сказал Марун, 3 из 4 ветвей позволят условно пройти. Если вас все еще беспокоит покрытие кода, вы можете реорганизовать условное выражение как &&
вместо ||
.
(x || y)
совпадает с (!(!x && !y))
, и это позволит вам протестировать все условия, так как теперь есть только три ветки.
Оригинальная форма условного выражения часто встречается в защитных выражениях:
if (obj == null || obj.hasError())
{
throw new RuntimeException();
}
Это никогда не позволит вам проверить, есть ли obj
null
И имеет ошибку, потому что он выкинет исключение Null Pointer.
Если покрытие кода важно, просто используйте эту форму:
if (!(obj != null && !obj.hasError()))
{
throw new RuntimeException();
}
Ответ 4
Существует довольно простой woarkaround - просто поместите каждый логический предикат в отдельную строку, например:
if (x
|| y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
Теперь, когда вы запустите analisys, маркер должен указывать непосредственно на ветку, которая пропущена. После того, как вы его закроете, вы можете правильно переформатировать свой код.
НТН
Ответ 5
Вероятно, неявные ветки либо от вложенных операторов в блоке if
, либо от расширений ваших предикатов x
или y
.
Прочтите это:
http://emma.sourceforge.net/faq.html#q.fractional.examples
Ответ 6
Что будет результатом следующих выражений?
-
true || true
true || true
это правда -
true || false
true || false
это правда -
false || true
false || true
это правда -
false || false
false || false
ложь
Если вы заметили в 1-м и 2-м случае, когда у вас 1-й параметр как ИСТИНА, вам не нужно проверять 2-й параметр.
-
true && true
это правда -
true && false
ложь -
false && true
ложь -
false && false
ложь
Или, если вы видите сценарии с оператором AND, если первый параметр равен FALSE, вам никогда не нужно проверять второй параметр.
И, следовательно, вы никогда не сможете проверить 1 ветку из 4 веток.