% 80 test kapsamı (tüm testler geçer) olan bazı kodlarım varsa, test kapsamı olmayan koddan daha yüksek kalitede olduğunu söylemek adil mi?
Yoksa daha sürdürülebilir olduğunu söylemek adil mi?
% 80 test kapsamı (tüm testler geçer) olan bazı kodlarım varsa, test kapsamı olmayan koddan daha yüksek kalitede olduğunu söylemek adil mi?
Yoksa daha sürdürülebilir olduğunu söylemek adil mi?
Yanıtlar:
Sıkı bir anlamda, test paketinin kalitesi belirlenene kadar herhangi bir iddiada bulunmak adil değildir. Testlerin çoğu önemsiz veya birbirini tekrarlıyorsa testlerin% 100'ünü geçmek anlamlı değildir.
Soru şudur: Proje tarihinde, bu testlerden herhangi biri hataları ortaya çıkardı mı? Bir testin amacı hataları bulmaktır. Ve eğer yapmadılarsa, test olarak başarısız oldular. Kod kalitesini artırmak yerine, size yalnızca yanlış bir güvenlik duygusu veriyor olabilirler.
Test tasarımlarınızı geliştirmek için (1) beyaz kutu teknikleri, (2) kara kutu teknikleri ve (3) mutasyon testi kullanabilirsiniz.
(1) Test tasarımlarınıza uygulamak için bazı iyi beyaz kutu teknikleri. Bir whitebox testi, belirli kaynak kodu göz önünde bulundurularak yapılır. Beyaz kutu testinin önemli bir yönü kod kapsamıdır:
if
ya da gibi while
), onu doğru olmaya zorlayan ve diğerlerini yanlış olmaya zorlayan bir testiniz var mı? [Karar kapsamı]&&
) veya ayrılma (kullanım ||
) olan her koşul için, her alt ifadenin doğru / yanlış olduğu bir sınaması var mı? [Durum kapsamı]break
bir döngüden kaplanmış mı?(2) Gereksinimler mevcut olduğunda Blackbox teknikleri kullanılır, ancak kodun kendisi yoktur. Bunlar yüksek kaliteli testlere yol açabilir:
(3) Son olarak, beyaz kutu kapsamı ve uygulanan blackbox teknikleri için çok sayıda güzel testiniz olduğunu varsayalım. Başka ne yapabilirim? Testlerinizi Test Etme Zamanı . Kullanabileceğiniz tekniklerden biri Mutasyon Testi'dir.
Mutasyon testi altında, hata yaratma umuduyla programınızda (bir kopyası) değişiklik yaparsınız. Bir mutasyon şunlar olabilir:
Bir değişkenin referansını başka bir değişkene değiştirme; Abs () işlevini ekleyin; 'Den daha azdan daha büyük' e değiştirin; Bir ifadeyi silme; Bir değişkeni sabit ile değiştirin; Geçersiz kılma yöntemini silme; Bir süper yönteme başvuruyu silme; Bağımsız değişken sırasını değiştir
Programınızın çeşitli yerlerinde birkaç düzine mutant oluşturun [programın test etmek için derleme yapması gerekecektir]. Testleriniz bu hataları bulamazsa, şimdi programınızın mutasyona uğramış sürümünde hatayı bulabilecek bir test yazmanız gerekir. Bir test hatayı bulduğunda, mutantı öldürdünüz ve başka bir tane deneyebilirsiniz.
Zeyilname : Bu etkiyi belirtmeyi unuttum: Hatalar kümelenme eğilimindedir . Bunun anlamı, bir modülde ne kadar çok hata bulursanız, daha fazla hata bulma olasılığınızın o kadar yüksek olmasıdır. Bu nedenle, başarısız olan bir testiniz varsa (yani, test başarılıdır, çünkü hedef hataları bulmaktır), sadece hatayı düzeltmeniz gerekir, aynı zamanda modülü kullanarak daha fazla test yazmalısınız. yukarıdaki teknikler.
Hataları sabit bir oranda bulduğunuz sürece, test çalışmaları devam etmelidir. Yalnızca, bulunan yeni hataların oranında bir düşüş olduğunda, bu geliştirme aşaması için iyi test çabaları yaptığınızdan emin olmalısınız.
Herhangi bir kırılma değişikliğinin testlere yakalanma olasılığı daha yüksek olduğundan, bir tanımla daha sürdürülebilirdir.
Ancak, kodun birim testlerini geçmesi, gerçekte daha yüksek kalitede olduğu anlamına gelmez. Kod hala alakasız yorumlar ve uygunsuz veri yapıları ile kötü biçimlendirilmiş olabilir, ancak yine de testleri geçebilir.
Hangi kodu korumayı ve genişletmeyi tercih ettiğimi biliyorum.
Kesinlikle hiçbir testi olmayan kod son derece yüksek kalite, okunabilir, güzel ve verimli (veya toplam önemsiz) olamaz, bu nedenle hayır,% 80 test kapsamı olan kodun, test kapsamı olmayan koddan daha yüksek kalitede olduğunu söylemek doğru değildir.
İyi testlerle kapsanan% 80 kodun muhtemelen kabul edilebilir kalitede ve muhtemelen nispeten sürdürülebilir olduğunu söylemek doğru olabilir . Ama gerçekten çok az şey garanti ediyor.
Daha refactorable diyebilirim. Kod çok sayıda testle kaplanmışsa yeniden düzenleme son derece kolaylaşır.
Daha sürdürülebilir olarak adlandırmak adil olur.
Korunabilir kısmı kabul ederdim. Michael Feathers geçtiğimiz günlerde bu konuyu tartıştığı " Test edilebilirlik ve iyi tasarım arasındaki derin sinerji " adlı mükemmel bir konuşma videosu yayınladı . Konuşmada ilişkinin bir yolu olduğunu, yani iyi tasarlanmış kodun test edilebilir olduğunu, ancak test edilebilir kodun mutlaka iyi tasarlanmış olmadığını söylüyor.
Video akışının videoda harika olmadığını belirtmek gerekir, bu nedenle tam olarak izlemek istiyorsanız indirmeye değer olabilir.
Bir süredir kendime "koşul kapsamı" ile ilgili olarak bu soruyu soruyorum. Peki atollic.com bu sayfa hakkında nasıl "Neden kod kapsamı analizi?"
Daha teknik olarak, kod kapsamı analizi, programınızda test durumlarınızın kapsamadığı alanları bulur ve programınızın başka türlü test edilmemiş kısımlarını kapsayan ek testler oluşturmanıza olanak tanır. Bu nedenle, kod kapsamının, kodun kendisinin kalitesini değil, test prosedürlerinizin kalitesini anlamanıza yardımcı olduğunu anlamak önemlidir .
Bu burada oldukça alakalı görünüyor. Belli bir seviyede (kod veya başka türlü) kapsama alanı elde etmeyi başaran bir test senaryosu kümeniz varsa, test edilen kodu oldukça kapsamlı bir giriş değerleri seti ile çağırmanız olasıdır! Bu, test edilen kod hakkında çok fazla bilgi vermez (kod patlamazsa veya algılanabilir hatalar oluşturmazsa), ancak test senaryo setinize güven verir .
İlginç bir Necker Cube bakış açısıyla, test kodu şimdi test edilen kod tarafından test ediliyor!
Bir programın istediğinizi yaptığını garanti etmenin ve değişikliklerin istenmeyen bir etki yaratmamasını sağlamanın birçok yolu vardır.
Testlerden biri. Verilerin mutasyonundan kaçınmak başka bir şeydir. Bir tür sistem de öyle. Veya resmi doğrulama.
Bu nedenle, testin genellikle iyi bir şey olduğunu kabul etsem de, belirli bir test yüzdesi fazla bir şey ifade etmeyebilir. Haskell'de iyi test edilmiş bir PHP kütüphanesinden daha fazla test yapılmadan yazılmış bir şeye güvenirim