Saya bertanya-tanya apakah mengukur cakupan kode bersyarat oleh alat saat ini untuk Java tidak usang sejak Java 8 muncul. Dengan Java 8 Optional
dan Stream
kita sering dapat menghindari kode cabang / loop, yang membuatnya mudah untuk mendapatkan cakupan bersyarat sangat tinggi tanpa menguji semua jalur eksekusi yang mungkin. Mari kita bandingkan kode Java lama dengan kode Java 8:
Sebelum Java 8:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
Ada 3 jalur eksekusi yang mungkin dalam metode di atas. Untuk mendapatkan 100% cakupan bersyarat, kita perlu membuat 3 unit tes.
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
Dalam hal ini, cabang disembunyikan dan kami hanya perlu 1 tes untuk mendapatkan cakupan 100% dan tidak masalah yang akan kami uji. Meskipun masih ada 3 cabang logis yang sama yang harus dibahas saya percaya. Saya pikir itu membuat statistik cakupan bersyarat sepenuhnya tidak dipercaya hari ini.
Apakah masuk akal untuk mengukur cakupan bersyarat untuk kode Java 8? Apakah ada alat lain yang melihat kode yang dimasukkan?
getName
? Tampaknya bahwa jika user
nol, itu harus mengembalikan "tidak dikenal". Jika user
bukan nol dan user.getName()
nol, itu harus mengembalikan "tidak dikenal". Jika user
bukan nol dan user.getName()
bukan nol, itu harus mengembalikannya. Jadi, Anda akan menguji tiga kasus karena itulah kontraknya getName
. Anda tampaknya melakukannya mundur. Anda tidak ingin melihat cabang dan menulis tes sesuai dengan itu, Anda ingin menulis tes Anda sesuai dengan kontrak Anda, dan memastikan kontrak terpenuhi. Saat itulah Anda memiliki cakupan yang baik.