Подтвердить что ты не робот

Eclemma говорит, что 1 из 4 ветвей не покрыт, но какая ветка это?

Есть ли простой способ узнать, какая ветка мне не хватает? То есть У меня есть код такой:

if (x || y) {
    // do stuff
}

В подсветке покрытия есть желтая точка в Eclipse, которая гласит:

1 из 4 пропущенных веток

но я хотел бы знать, какая ветка отсутствует.

4b9b3361

Ответ 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 веток.