Zastanawiam się, czy pomiar pokrycia kodu warunkowego przez obecne narzędzia dla Java nie jest przestarzały od czasu pojawienia się Java 8. Z Java 8 użytkownika Optional
i Stream
często możemy uniknąć kodu rozgałęzień / pętle, co sprawia, że łatwo dostać bardzo wysoki zasięg bez warunkowego testowanie wszystkich możliwych ścieżek wykonania. Porównajmy stary kod Java z kodem Java 8:
Przed Javą 8:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
W powyższej metodzie istnieją 3 możliwe ścieżki wykonania. Aby uzyskać 100% zasięgu warunkowego, musimy utworzyć 3 testy jednostkowe.
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
W tym przypadku gałęzie są ukryte i potrzebujemy tylko 1 testu, aby uzyskać 100% pokrycia i nie ma znaczenia, który przypadek przetestujemy. Chociaż nadal istnieją te same 3 logiczne gałęzie, które należy uwzględnić, wierzę. Myślę, że sprawia to, że statystyki pokrycia warunkowego są obecnie całkowicie niezaufane.
Czy ma sens mierzenie zasięgu warunkowego dla kodu Java 8? Czy są jakieś inne narzędzia wykrywające kod, który został sprawdzony?
getName
? Wydaje się, że jeśli user
jest zerowy, powinien zwrócić „nieznane”. Jeśli user
nie jest zerowy i user.getName()
jest zerowy, powinien zwrócić „nieznany”. Jeśli user
nie jest zerowe i user.getName()
nie jest zerowe, powinno to zwrócić. Więc przetestowałbyś te trzy przypadki, ponieważ o to właśnie chodzi w umowie getName
. Wygląda na to, że robisz to wstecz. Nie chcesz widzieć gałęzi i pisać testów zgodnie z nimi, chcesz pisać testy zgodnie z umową i upewnić się, że umowa jest wypełniona. To wtedy masz dobry zasięg.