Ich frage mich, ob das Messen der bedingten Code-Abdeckung mit aktuellen Java-Tools nicht überholt ist, seit Java 8 verfügbar ist. Mit Java 8 ist Optional
und Stream
wir können oft vermeiden Code branches / Loops, die es einfach macht , zu bekommen sehr hohe bedingte Abdeckung ohne Prüfung aller möglichen Ausführungspfade. Vergleichen wir alten Java-Code mit Java-8-Code:
Vor Java 8:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
Bei der obigen Methode gibt es 3 mögliche Ausführungspfade. Um 100% der bedingten Deckung zu erhalten, müssen 3 Einheitentests erstellt werden.
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
In diesem Fall sind die Zweige ausgeblendet und wir benötigen nur einen Test, um eine 100% ige Abdeckung zu erhalten. Dabei spielt es keine Rolle, welchen Fall wir testen. Obwohl es immer noch die gleichen 3 logischen Zweige gibt, die ich glaube, abgedeckt werden sollten. Ich denke, dass es die Statistik der bedingten Deckung heutzutage zu einem absoluten Vertrauensverlust macht.
Ist es sinnvoll, die bedingte Abdeckung für Java 8-Code zu messen? Gibt es andere Tools, die untersuchten Code erkennen?
getName
? Es scheint, dass wenn user
null ist, es "unbekannt" zurückgeben sollte. Wenn user
nicht null und user.getName()
null ist, sollte "unknown" zurückgegeben werden. Wenn user
nicht null und user.getName()
nicht null ist, sollte es das zurückgeben. Sie würden diese drei Fälle in einem Unit-Test testen, denn getName
darum geht es in dem Vertrag . Sie scheinen es rückwärts zu machen. Sie möchten die Zweige nicht sehen und die Tests nicht danach schreiben, Sie möchten Ihre Tests gemäß Ihrem Vertrag schreiben und sicherstellen, dass der Vertrag erfüllt ist. Dann haben Sie eine gute Abdeckung.