Fehlende Zweige bei der Verwendung von assertTrue statt assertNull
In Java/Junit, ich brauche, um auf null zu testen mit einem Objekt. Es gibt eine Vielzahl von Möglichkeiten, die ich testen eine Bedingung, aber ich war mit assertTrue für die meisten meiner tests. Wenn ich für null-Werte in einer assertTrue, EclEmma fest, dass es die Tests nur einen Zweig.
Beheben, wenn ich die Anweisung in eine variable manuell ein (wie die Einstellung das Ergebnis in ein boolean und übergeben es in assertTrue) die code-coverage wird als vollständig auf die geltend machen, nicht aber auf die variable initialisieren Linie.
Warum ist das passiert? Ist das mit der extra-byte-code, Java-scheinbar fügt, wie erwähnt auf http://sourceforge.net/apps/trac/eclemma/wiki/FilteringOptions? Alle Lösungen (außer mit anderen assert-Anweisungen).
assertTrue:
assertTrue( myObject == null ); //1 of 2 branches
assertTrue:
boolean test = (myObject == null); //1 of 2 branches missing
assertTrue(test); //complete
assertNull:
assertNull( myObject ) //complete;
Das ist wahr, und ich habe kein problem mit assertNull, wenn es eine Voraussetzung ist, jedoch, IMO, behaupten, dass die "Typen" sind nur eine andere form von assertTrue. Es kann Hinzugefügt werden, nutzen, um mit verschiedenen assert-Typen Hinzugefügt-Fehler info/Lesbarkeit aber das ist nicht wirklich ein Problem hier.
Das ist nicht zu sagen, dass ich mich weigere, Sie zu verwenden, assertNull und wahrscheinlich werden Sie es, ich fand gerade dieses problem interessant, wie ich bin grundsätzlich der Prüfung für die gleiche Sache, aber Emma gibt völlig unterschiedliche Ergebnisse.
Warum sind Sie mit der code-coverage auf Ihrem test-code? Ich glaube nicht, dass jemand kümmern sollte, wenn alle Ihre test-code Zweige werden getestet; das scheint mir albern.
Das zugrunde liegende Problem nicht in Zusammenhang mit Laufenden Berichterstattung an den test-code, und die sich nicht auf die Verwendung von assertNull versus assertTrue.
InformationsquelleAutor Dalin Seivewright | 2012-04-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für die meisten Boolean-Ausdrücke, die Java-compiler erzeugt zusätzliche Niederlassungen in den byte-code.
JaCoCo produziert "branch coverage", basierend auf den generierten byte-code, basiert nicht auf der original-Java-code, und damit zeigt zusätzliche branch-coverage-Informationen für fast jeden booleschen Ausdruck, den Sie verwenden.
In Ihrem code, der Boolean-Ausdruck, den Sie verwenden, ist
myObject == null
.Berechnen Sie diesen Wert, wird der Java-compiler generiert code, drücken Sie die zwei Argumente auf dem stack, und dann einen bedingten Sprung, um push 1 (wahr) oder 0 (false) auf den stack. JaCoCo reports der branch-coverage dieser bedingte Sprung.
So, die Tatsache, dass Sie verwenden
myObject == null
löst das Verhalten, das Sie beschreiben.Als einige andere Beispiele, versuchen Sie dies:
Dies kann nützlich sein, wenn der Boolesche Ausdruck ist, zum Beispiel, von einer Funktion zurückgegeben wird, der verwendet wird, als Bedingung in einer if-then-else-Anweisung irgendwo sonst. Während meist eine Folge der Art und Weise der Java-compiler arbeitet, hilft es zu beurteilen Zustand Abdeckung (anstelle der bloßen Zweig Abdeckung) des originalen Java-code.
Diese Funktion ist nicht allzu gut dokumentiert, aber hier sind einige Hinweise:
a = !a
So ist es, in der Tat, in Bezug auf die zusätzlichen byte-code erzeugt wird, aber nicht auf die spezifischen Beispiele von synthetischen byte compiler-Konstrukte, für die die Filter-Optionen sind vorgesehen.
BEACHTEN Sie: Hast Dur BEARBEITEN, da die erste Antwort war zu viel denke. Dank @ira baxter für gut & kritische Diskussion.
InformationsquelleAutor avandeursen
Die Tatsache, dass Emma behandelt einen bedingten Ausdruck wie "etwas mit einem branch" (Zweig) Berichterstattung zählen IMHO scheint einfach gebrochen. Es ist nicht eine bedingte Verzweigung.
Können wir streiten über die Geltend machen; wenn es waren definiert als "throws exception auf assert failure", dann ist es wirklich ein conditonal Zweig; wenn es definiert ist [ich glaube nicht, ich bin kein Java Experte] "beendet mein Programm auf assert failure", dann ist es nicht wirklich ein Zweig. Auch obskure sind Methodenaufrufe; diese sind bedingten Verzweigungen in dem Sinne, dass, wenn die aufgerufene Methode eine Ausnahme auslöst, Ablaufsteuerung, nicht weiterhin den "rest der Anweisung".
Unserer Java-Test-Abdeckung tool bekommt die (branch) coverage-Analyse auf solche Bedingungen "rechts".
assert
Schlüsselwort.Ich bin damit einverstanden, dass der Aufruf dieser Emma/JaCoCo-Funktion branch-coverage ist (sehr) verwirrend. (Separate) Abdeckung Infos sagen mir für jede Boolesche (sub -) Ausdruck, ob es evaluiert zu true und false ist eine nützliche Funktion, wenn.
determinining ob für jede Zustand in einem Programm ausgeübt hat, die als "true" oder "false" ist nicht branch-coverage; es ist "Bedingung Berichterstattung". Sicherlich unser Werkzeug nicht tun, condition-coverage; basierend auf der bisherigen Verständnis, ich glaube nicht, dass Emma tut condition coverage), aber ich könnte mich überrascht.
Danke Ira, du hast mich denken, und ich habe eine große Bearbeiten der Antwort.
InformationsquelleAutor Ira Baxter
100% code-coverage auf boolean-Methoden, führen Sie die folgenden
InformationsquelleAutor sunshine