Test kapsamı, kod kalitesinin yeterli bir ölçüsü mü?


20

% 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?


2
% 100 kapsam, iyi test edildiği anlamına gelmez. Ancak% 0 hiç test edilmediği anlamına gelir.
mouviciel

1
Teknik olarak hayır. Pratik olarak, evet. Deneyimler, kod kapsamı yaklaşık% 80'e ulaştığında, birim testinin yeterli olduğu hata türlerinin dengelenmeye başladığı birçok yazılım mühendisine ve test kullanıcısına öğretti. Bu pareto prensibi. Temel olarak, testlerinizin kalitesinden bağımsız olarak, kodun% 80'ini kapsadığınız noktaya geldiğinizde, muhtemelen olası sorunların çoğuna neden olan kodun% 20'sini oldukça iyi test etmişsinizdir. Bu mutlak değil, geleneksel bir bilgeliktir. Hayatlar testinize bağlıysa daha kapsamlı olmalısınız.
Calphool

@JoeRounceville Emin değilim ... Gerçekten kullanışlı bir şey test ederken yüksek test kapsamı elde edebilirim. Kapsam, yalnızca testlerin anlamlı olup olmadığını değil, kodun ne kadarına test paketi tarafından dokunulduğunu gösterir.
Andres

1
@AndresF. Bu yüzden "teknik olarak hayır, neredeyse evet" dedim. İnsanlar aptal değiller (genellikle). Sadece beyinsiz vakaları test etmezler. Bu nedenle, deneyime dayanarak , birçok mağaza% 80 civarında bir yerde durur ve (oldukça güvenli) insanlarının moron olmadığı varsayımını yapar.
Calphool

Yanıtlar:


24

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:

  • Her fonksiyon denir mi? [Fonksiyonel kapsam]
  • Her ifade yürütülüyor mu? [İfade kapsamı-- Hem işlevsel kapsam hem de beyan kapsamı çok basittir, ancak hiç olmamasından iyidir]
  • Her karar için ( ifya da gibi while), onu doğru olmaya zorlayan ve diğerlerini yanlış olmaya zorlayan bir testiniz var mı? [Karar kapsamı]
  • Bağlaç (kullanım &&) 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ı]
  • Döngü kapsamı: 0 yineleme, 1 yineleme, 2 yineleme zorlayan bir testiniz var mı?
  • Her biri breakbir 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:

  • Blackbox testleriniz birden çok test hedefini kapsıyor mu? Testlerinizin "şişman" olmasını istersiniz: Sadece X özelliğini test etmekle kalmaz, aynı zamanda Y ve Z'yi de test ederler. Farklı özelliklerin etkileşimi, hataları bulmanın harika bir yoludur.
  • "Yağ" testi istemediğiniz tek durum, bir hata durumunu test ettiğiniz zamandır. Örneğin, geçersiz kullanıcı girişi testi. Birden çok geçersiz giriş testi hedefi (örneğin, geçersiz bir posta kodu ve geçersiz bir sokak adresi) elde etmeye çalıştıysanız, büyük olasılıkla bir vaka diğerini maskeliyordur.
  • Girdi türlerini göz önünde bulundurun ve girdi türleri için bir "denklik sınıfı" oluşturun. Örneğin, kodunuz bir üçgenin eşdeğer olup olmadığını görmek için test ederse, kenarları olan üçgen (1, 1, 1) kullanan test muhtemelen test verisi (2, 2, 2) ve (3, 3, 3) bulacaktır. Zamanınızı diğer girdi sınıflarını düşünerek geçirmek daha iyidir. Örneğin, programınız vergileri işliyorsa, her vergi grubu için bir test isteyeceksiniz. [Buna denklik bölümleme denir.]
  • Özel durumlar genellikle kusurlarla ilişkilidir. Test verileriniz ayrıca bir eşdeğerlik görevinin kenarlarında, üstünde veya altında olanlar gibi sınır değerlerine sahip olmalıdır. Örneğin, bir sıralama algoritmasını test ederken, boş bir dizi, tek bir öğe dizisi, iki öğeli bir dizi ve ardından çok büyük bir dizi ile test etmek istersiniz. Sınır vakalarını yalnızca girdi için değil çıktı için de dikkate almalısınız. [Bu çağrı sınır-değer analizidir.]
  • Başka bir teknik "Hata tahminidir" dir. Programınızın kırılmasını sağlayabileceğiniz bazı özel kombinasyonları denediğinizde hissiniz var mı? O zaman sadece dene! Unutmayın: Hedefiniz, programın geçerli olduğunu doğrulamak için değil, hataları bulmaktır . Bazı insanlar hata tahmin etme yeteneğine sahiptir.

(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.


7

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.


7

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.


3

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.


2

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.


-2

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!


-3

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


Bu sadece senin fikrin mi yoksa bir şekilde yedekleyebilir misin?
gnat

2
Test etmek, bir programın istediğinizi yaptığını garanti etmenin bir yolu değildir.
Andres

1
Sonra testin ne olduğunu merak ediyorum
Andrea

@gnat bu benim görüşüm. Yine de söylenenleri söylüyor. Haskell'i derleyicisi çok katı olan ve girdinin düzgün oluşu, türleri, yan etkileri, verilerin mutasyonu hakkında birçok garanti veren bir dil örneği olarak aldım. PHP'yi tercümanı çok yumuşak olan ve bir spesifikasyonu bile olmayan bir dile örnek olarak aldım. Testlerin yokluğunda bile, türler ve etkiler sisteminden gelen tüm garantilerin varlığı genellikle iyi bir güvenilirlik derecesi verir. Testlerle telafi etmek için çok kapsamlı bir süite sahip olmak gerekir
Andrea

Yazarken belki biraz koştum - bir telefondaydım - ama yine de bir nokta olduğunu düşünüyorum. Ben PHP üzerinde bash istemiyorum, ama ben karşılaştırma Haskell çok daha fazla güvenilirlik derecesi verdiğini söyleyerek objektif bir açıklama olduğunu düşünüyorum
Andrea
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.