2013-03-19 7 views

Odpowiedz

6

open issue na repo github dla rodzica Eclemma'S, jacoco sugeruje, że taka funkcja byłaby faktycznie być nieco trudne do uwzględnienia.

Jednak nawet bez funkcji Eclemma, jeśli celem jest po prostu odgadnięcie gałęzi, które zostały pominięte w konkretnym przypadku, można zaprogramować kod w celu śledzenia. Najprostszym przykładem jest staroświecki oświadczenia nadruku:

if (x || y) { 
    System.out.println("BRANCH: " + x + ", " + y); 
    // Do stuff 
} 

Następnie spojrzeć na wyjściu i zobaczyć, jakie gałęzie rzeczywiście hit (np java ... | grep "BRANCH:" | sort | uniq). (Niezbyt satysfakcjonujące, wiem.)

13

Co może być x i y?

  • true || true jest prawda (nie pokryte z powodu optymalizacji JVM: jeśli pierwszy warunek jest true, drugi nie będą oceniane ze względu na krótką oceną obwodu)
  • false || true jest prawda
  • true || false jest true
  • jest false
+1

Pytanie brzmi, skąd mam wiedzieć, które z tych oddziałów nie były przestrzegane? Wiem na pewno, że nie jest to przypadek fałszywy/fałszywy, ponieważ przypadek "else" jest w niektórych przypadkach wykonywany. – tor

+7

Czy nie powinien to być prawdziwy || prawdziwy przypadek, który nie jest objęty? – Jason

+0

Po prostu potknąłem się o to pytanie - musiałem wrócić do zapamiętania starych cyfrowej tablicy prawdy i "nie przejmuj się" warunkami. –

0

Istnieje prawdopodobnie ukryte gałęzie albo z zagnieżdżonych instrukcji w bloku if lub oświadczenia rozszerza swoje x lub y predykatów.

Przeczytaj to: http://emma.sourceforge.net/faq.html#q.fractional.examples

+0

Tak, pomyślałem. Istnieją 4 różne możliwe kombinacje wartości boolean x i y, i przypuszczam, że tylko trzy z nich zostały zaobserwowane. Pytanie brzmi: jak mogę stwierdzić, który przypadek się nie wydarzył? Lub równoważnie, które przypadki zostały zaobserwowane? – tor

+0

"1 z 4 gałęzi pokrytych" wskazuje, że 3 gałęzie nie są pokryte. Myślę, że powinno być oczywiste (od podkreślenia zasięgu wewnątrz bloku), które ścieżki kodu nie są objęte. –

+1

Niestety, mój błąd całkowicie! Komunikat faktycznie mówi "1 z 4 pominiętych gałęzi". Natychmiast zaktualizuję ... – tor

4

Odpowiedź jest true|| true nie został pokryty.

Dzieje się tak, ponieważ po tym, jak JVM wykryje pierwszy warunek, który ma być prawdziwy, nie uruchomi on drugiego warunku (jest zoptymalizowany), co oznacza, że ​​część kodu nigdy nie jest uruchamiana.

Jak powiedział Maroun, 3 z 4 gałęzi pozwolą warunkowi przejść. Jeśli nadal martwisz się o zasięg kodu, możesz zastąpić warunkowe jako && zamiast ||.

(x || y) jest taki sam jak (!(!x && !y)), a to pozwoli ci przetestować wszystkie warunki, ponieważ teraz są tylko trzy gałęzie.

Oryginalna forma warunkowego jest często postrzegana w sprawozdaniach osłaniających:

if (obj == null || obj.hasError()) 
{ 
    throw new RuntimeException(); 
} 

To nigdy nie będzie można sprawdzić, czy obj jest null i ma błąd, ponieważ będzie ona rzucać wyjątek pustego wskaźnika.

Jeśli zasięg kod jest ważny, a potem po prostu korzystać z tego formularza:

if (!(obj != null && !obj.hasError())) 
{ 
    throw new RuntimeException(); 
} 
+1

lub, być może, będę mógł użyć chętnego operatora '|' lub '&', chyba że celowo wykonasz zwarcie operacji, w takim przypadku nigdy nie uzyskasz pełnego zasięgu oddziału. – tkokasih

+0

@BrettPyke, skąd się biorą trzy gałęzie w przypadku "&&"? – ishan3243

+5

@BrettPyke, jeśli przekształcasz (x || y) na! (! X &&! Y), masz ten sam problem z skrótem convention z wyrażeniem! (False && false). –

3

Jest dość łatwy woarkaround - tylko umieścić każdy orzecznik logiczny w osobnej linii, tak:

if (x 
    || y) { 
    System.out.println("BRANCH: " + x + ", " + y); 
    // Do stuff 
} 

Teraz, kiedy będziesz uruchomić analizę, The znacznik powinien wskazywać bezpośrednio na pominiętą gałąź. Gdy to zrobisz, możesz ponownie sformatować swój kod we właściwy sposób.

HTH

Powiązane problemy