Parametreli testler - Bunları ne zaman ve neden kullanıyorsunuz?


15

Son zamanlarda işte, Parametrelendirilmiş testler konusunda bazı görüş farklılıkları yaşıyoruz . Normalde bir TDD stili kullanırız (veya en azından denemeye çalışırız), bu yüzden bu yaklaşımın faydalarını anlıyorum. Ancak, parametreli testlerin getirdiği kazancı görmek için mücadele ediyorum. Referans olarak, bir hizmet ve onun RESTful arabirimi aracılığıyla maruz kitaplıkları üzerinde çalışıyoruz.

Şimdiye kadar gördüğüm, en azından Eclipse içinde JUnit kullanan testler:

  • Ayrıntılı olarak eksik - bir test başarısız olduğunda, başarısız olmasına neden olan parametreleri görmek çok zordur
  • Genellikle oluşturmak karmaşık
  • Kod yazıldıktan sonra oluşturulma eğilimi - kesinlikle böyle bir dezavantaj değil, ancak insanlar bir kod parçası başlattıklarında parametreli testler düşünüyorlar mı?

Herkesin gerçekten yararlı olduğu yerlere veya bunları kullanmak için iyi ipuçlarına sahip olması harika olurdu. Sadece inatçı olmadığımdan emin olmak istiyorum çünkü şahsen bunları kullanmayı seçmiyorum ve test cephaneliğimizin bir parçası olarak düşünmemiz gereken bir şey olup olmadığını görüyorum.


1
Sorun fikirle değil, hantal kütüphaneyle ilgili. C # 'da sözdizimi çok daha dostudur. Evet, iyi bir fikir. Bu işlemi kolaylaştırmak için kendi kodunuzu ekleyin - işe yarayan her şeyi dosyalardan bir şeyler okuyun. Ayrıca MsTest'in bunu nasıl ele aldığına bakın.
Meslek

Biz (Square) Burst'u bu konuların bazılarıyla ilgilenmek için yazdık Parameterized. Genellikle daha az kazan plakası ekler ve bir testin başarısız olduğu yerlerde oldukça netleştirir.
Daniel Lubarov

Yanıtlar:


5

Herhangi bir yazılımın test edilmesindeki sorun, karmaşıklığın oldukça hızlı bir şekilde patlamasıdır. Gerçek şu ki, yöntemlerinize iletilen tüm olası parametre kombinasyonlarını test edemezsiniz . Phadke , test edilmesi gereken olası parametre değerleri listesinin oluşturulmasına izin veren bir Tasarım Tasarımı (DOE) yaklaşımını savunur .

Fikir, kapsamlı bir şekilde test etmemenize rağmen, çoğu kusur bir izole nokta hatası yerine bir "arıza bölgesi" oluşmasına neden olur. DOE yaklaşımı Phadke, dikey diziler kullanarak savunur ve parametre alanını olası tüm arıza bölgelerine vuracak kadar ince bir şekilde örnekler.

Yalıtılmış hatalar muhtemelen tanımlanmayacaktır, ancak bunlar genellikle hata bölgelerinden daha azdır.

DOE yaklaşımı, değiştirilecek parametre değerlerini seçmenin sistematik bir yolunu sunar.


Sağlanan bağlantı koptu.
Josh Gust

1
@JoshGust Google kullanılarak kolayca düzeltilebilir. Söylediğin için teşekkürler.
Peter K.

4

Kodunuzun sadece mutlu yolu değil, aynı zamanda uç durumları da işlemesini sağlamak için yararlı olabilirler. Kodunuzun normal değişkenlerle çalıştığını öğrendikten sonra, test durumunu parametreleştirin ve null'ların ve 0'ların, boş dizelerin, büyük sayıların, uzun dizelerin, garip Unicode karakterlerin vb.


2

En azından JUnit 4.8'de parametreli testlerin en az iki çeşidi vardır. Bunlar: @RunWith(Parameterized.class)Önceden tanımlanmış parametre konfigürasyonlarını üreten / okuyan bir veri kaynağı gerektiren Parametreli Testler ( ) ve @RunWith(Theories.class)argüman tipi başına bir veya daha fazla olası girdi seti verildiğinde verilen yöntemlerin spesifikasyonunu uygulayabilen Teoriler ( ). Daha az gibi görünüyor:

  • @DataPointsdize bağımsız değişkenleri için bazı olası değerler ( ) belirtin ( nullboş dize, boş olmayan dize, gerçekten uzun dize gibi)
  • @DataPointsAnimal sınıfı bağımsız değişkenleri için bazı olası değerler ( ) belirtin (örneğin null, Dogörnek, Catörnek, Birdörnek)
  • @Theorybir Stringparametreyi ve bir Animalparametreyi kabul eden hazırlama . bu dahil (4x4 = 16 kombinasyonlar, olurdu verilen örnekte (mümkün olan parametre değerlerinin her türlü ile çalıştırılır alacak null,null ))
  • test edilen yöntem bazı kombinasyonları kabul edemezse, Assume.assumeThatgeçersiz kombinasyonları filtrelemek için statik içe aktarımları kullanın (örn. boş olmayan dizeler için yöntemin davranışını kontrol etmek istediğinizde, ilk satırlardan biri "boş olmadığını varsayalım"

Daha önce yazıldığı gibi - her yöntemin olası her kombinasyonunu test etmek mantıklı değildir (test setlerini patlatır, her biri sadece 5 olası değere sahip 5 parametreli bir yöntemi test etmeyi hayal eder: 5 ** 5 -> 3000'den fazla test çalıştırması !), ancak kritik görev yöntemleri için (API yöntemleri gibi) bunu sadece güvenli tarafta olmak için teşvik ederim ...


1

Genel örnek:

  • Dize bağımsız değişkenleri ile yöntemler. Farklı girişleri ve beklenen çıktılarını test etmek için parametreli testler kullanın. Çiftlerin bir listesine sahip olmak (girdi, beklenen) her çift için bir TC yazmaktan çok daha pratiktir.

  • Aynı senaryoyu farklı argümanlara uygulayın. Biz birlikte çalışan bir senaryo var Animalnesne ve bu şekilde alt sınıflara çok şey var Dog, Cat, Bird. Mevcut hayvanların bir listesini oluşturun ve senaryoyu test edin.

Webservis için beton:

  • Yukarıdaki dize argümanlarından örnek. Aynı türden ancak farklı değerlerden farklı bağımsız değişkenlerle neler olduğunu test edin.

0

Parametreli testler, çeşitli girişleri test etmek istediğinizde basit girişi olan işlevleri / özellikleri test etmek için iyi çalışır.

Farklı işlevleri ve karmaşık girdileri test etmek için iyi çalışmazlar. Daha az kod yazmak için uygun bir yapı olarak kullanılmamalıdır.


1
Neden parametreleri gerektiği değil az kod yazmak için kolaylık olarak kullanılabilir? Büyük (ish) bir dizi test senaryosunun kapsamlı bir listesini sağlamada büyük bir erdem yoktur.
Jonathan Eunice

1
Cevabınız diğer 5 cevaptan daha fazla bilgiyi nasıl sağlıyor?
Adam Zuckerman

-2

Bir TDD-ish şekilde çok sayıda parametreli test kullandığım bir durum ayrıştırıcılar yazıyor - Giriş ve beklenen çıktı varsa bir liste ile başlayabilir ve daha sonra kodu tüm test senaryolarını geçecek şekilde yazabilirim.

Ama parametreli testlerden birkaç dehşet gördüm. Hayır, Virginia, test takımınız kendi birim testlerine ihtiyaç duymamalıdır.


1
İdeal olarak parametreleştirilmiş testler "gerçek çıkış eşleme öğesindeki (n) beklenen çıktıdaki öğe (n)" veya benzeri bir formda olmalıdır ve bu durumda teste gerek yoktur. Ama daha karmaşık bir şey için kendi test senaryoları ile temiz bir parametreleştirilmiş test ya da iki tane olağan el yıkama "test kodum açıkça doğru" daha görmek istiyorum. Eğer bu doğruysa, test senaryoları yazmazdınız. Açıkçası karmaşıklığı aşmak mümkün ve çizgi olmadığını iddia etmiyorum, ama test testlerinin iyi bir fikir olduğu durumlar olduğunu düşünüyorum.
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.