Java 8 için geçerli araçlarla koşullu kod kapsamının ölçülmesinin geçersiz olup olmadığını merak ediyorum. Java 8'lerle Optional
ve Stream
çoğu zaman kod dallarından / döngülerden kaçınabiliriz, bu da tüm olası yürütme yollarını test etmeden çok yüksek koşullu kapsama alanı almayı kolaylaştırır. Eski Java kodunu Java 8 koduyla karşılaştıralım:
Java 8'den önce:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
Yukarıdaki yöntemde 3 olası yürütme yolu vardır. Şartlı kapsamın% 100'ünü elde etmek için 3 birim test oluşturmamız gerekiyor.
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
Bu durumda, dallar gizlidir ve% 100 kapsama almak için sadece 1 teste ihtiyacımız var ve hangi durumda test edeceğimiz önemli değil. Yine de ele alınması gereken aynı 3 mantıksal dal olmasına rağmen inanıyorum. Bugünlerde koşullu kapsama istatistiklerinin tamamen güvenilmez hale geldiğini düşünüyorum.
Java 8 kodu için koşullu kapsamı ölçmek anlamlı mı? Test edilmemiş kodu tespit eden başka araçlar var mı?
getName
? Görünüşe göre user
null olursa , "bilinmeyen" dönmelidir. Eğer user
boş değil ve user.getName()
null, bu "bilinmeyeni" dönmelidir. Eğer user
boş değil ve user.getName()
boş değil, o dönmelidir. Yani bu üç vakayı birim olarak test edersiniz çünkü sözleşmenin konusu getName
budur. Geriye doğru yapıyor gibisin. Şubeleri görmek ve testleri bunlara göre yazmak istemiyorsunuz, testlerinizi sözleşmenize göre yazmak ve sözleşmenin eksiksiz olarak doldurulmasını istiyorsunuz. O zaman iyi bir kapsama sahip olursunuz.