Temel sınıfları test etmekten kaçınmak uygun mudur?


15

Oldukça genel olması gereken esneklik / soyutlama vermek için "meta programlama" adil bir miktar ile bir temel sınıf var.

Temel sınıftaki ortak yöntemleri kullanarak çok sayıda alt sınıfım var ve her alt sınıftaki tüm vakaları kapsayan davranış odaklı birim testlerim var.

Temel sınıfı test etmeyi atlamak uygun mudur?


1
Kendime bu soruyu sormaya başladığımda bazen yaptığım bir şey, kodu kırmaya çalışmak. Geçersiz girişi atın, yanlış yapılandırma değerleri vb.
Belirtin

Yanıtlar:


31

Yeterli testiniz olup olmadığını doğrulamak için, kod kapsamınızı ve testlerin neden olduğu şube kapsamınızı kontrol edebilirsiniz (belki bir kapsam aracı kullanarak, kod yollarını gözden geçirerek veya bir hata ayıklayıcı kullanarak).

Eğer sonuca varırsanız, alt sınıflar için testler size temel sınıf kodunuz için yeterince yüksek bir kapsam sağlar, daha sonra başka testler eklemek size fazla fayda sağlamaz. Öte yandan, kod yolları varsa, yalnızca doğrudan temel sınıfı kullanarak belirli testler ekleyerek test edebilirsiniz, o zaman bu rotaya gitmelisiniz.

"Temel sınıfınızı doğrudan test etmenin" bir başka olası nedeni, o sınıfın belirli bir işlevini "tek başına" test etmek istemenizdir. Bazen test yöntemlerini, yalnızca bu yöntemi kullanan alt sınıflarınızın yöntemlerini çağırarak dolaylı olarak test etmek yerine, doğrudan belirli bir yöntem için tasarlamak daha kolay olabilir.

Tipik kullanım senaryosu kendisi için bir jenerik temel sınıf varken o Not olan bir alt sınıf türetmek için, sizin temel sınıf muhtemelen soyut. Yani böyle bir sınıfı test etmek için yine de bir türetme yapmanız gerekiyor. Bu durumda, "temel sınıfı doğrudan" test etmek elbette sadece test amaçlı özel bir türev eklemek anlamına gelebilir.


Evet, daha somut olarak tanımlanmış yöntemler için temel sınıf üzerindeki doğrudan birim testlerine katılıyorum. Yapmak istemediğim tüm meta-programlamayı test etmek, çünkü alt sınıflardaki birim testleri dolaylı olarak bu şeyleri test ediyor.
Nathan

4
Yalnızca test dizini içinde bulunan temel / soyut sınıfı genişleten ve yalnızca temel sınıfı açığa çıkarmaya / somutlaştırmaya hizmet eden bir sınıf tasarlamak, temel sınıfın uygun kapsamını ve temel yöntemlerin güvence altına alınmasını sağlamak için mükemmel bir meşru ve makul bir yaklaşımdır. kullanılan bu daha karmaşık sınıfların izolasyonunda doğru çalışma.

@MichaelT: evet. Cevabım bununla ilgili farklı bir fikrim var mı?
Doc Brown

@DocBrown hiç değil - bu noktayı açıkça ifade ettiniz. Sadece kendi cevabımda yazacağım ek bir açıklama ekliyordum (daha önce söylemediyseniz). "Doc'un söylediği her şeye katılıyorum, ancak özellikle seslenmek ve hakkında daha fazla yazmak istiyorum ..." diye bir cevap yazmak istemiyorum.

2

Programcılar yararına otomatik test oluşturuldu, testlere hizmet etmek için programcılar oluşturulmadı.

Bizi daha üretken hale getirmek ve müşterilerin şikayet ettiği “sorun” sayısını azaltmak için testlerimiz var.

Dolayısıyla, her bir alt sınıftaki tüm vakaları kapsayan davranış odaklı birim testleriniz olduğu için, müşterinin de temel sınıfı doğrudan test etmesinin bir yararı yoktur. Bu , temel sınıftaki bazı kodları değiştirerek ve örneğin bir kod satırında ortak olan bir testin başarısız olup olmadığını görerek veya “if ifadesine” bir “not” ekleyerek doğrulanabilir . (Sadece her kod satırının testler kapsamında olduğunu kontrol etmek yeterli değildir.)

Daha sonra testin sizi daha üretken hale getirip getirmeyeceğini sormaktan vazgeçtik . Bu birkaç şekilde olabilir.

  • Kod hakkında daha net düşünmenize izin vermek - kod yazılırken, bu durumda bu olası değildir.
  • Temel sınıftaki bazı kodları ayrı ayrı test etmenize izin verin, bu nedenle kod zaten çalıştığından bir kez daha olası olmayan bir şekilde daha hızlı hata ayıklayın.
  • Alt sınıftaki mantığın ayrıntılarını anlamak zorunda kalmadan temel sınıftaki kodu değiştirmenize izin vermek - belki de kodu yeniden düzenliyorsanız ???

Alt sınıfların çalıştığı göz önüne alındığında, temel sınıf için doğrudan testler yazmanın herhangi bir anlamı görmüyorum. Bu güne kadar değil, bu testleri erken bir durumda yazmanın faydaları olmazdı.

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.