Bir listenin test edilmesi… Hepsi aynı testte mi yoksa her koşul için bir testte mi?


21

Bir işlevin bir listede beklenenleri yaptığını test ediyorum. Bu yüzden test etmek istiyorum

f(null) -> null
f(empty) -> empty
f(list with one element) -> list with one element
f(list with 2+ elements) -> list with the same number of elements, doing what expected

Bunu yapmak için, en iyi yaklaşım nedir?

  • Tüm vakaları aynı (yöntem) testinde, "WorksAsExpected" adı altında test etmek.
  • Her durum için bir test yerleştirmek, böylece
    • "WorksAsExpectedWhenNull"
    • "WorksAsExpectedWhenEmpty"
    • "WorksAsExpectedWhenSingleElement"
    • "WorksAsExpectedWhenMoreElements"
  • Düşünmediğim bir başka seçenek de :-)


2
Bunları ayrı test durumları olarak yazardım. Test sisteminiz destekliyorsa, parametreli testler kullanabilirsiniz.
jonrsharpe

5
Eğer testlerinizi bir Verilen'e yazarsanız ... Ne zaman ... Sonra stil, o zaman açıkça ayrı olarak test edilmeleri gerektiği
Robbie Dee

1
Eklemek isterim ki: IMO, ilerideki durumları (boş ve boş gibi) ayrı testlere ayırmak iyidir, çünkü bunlar genellikle farklı olası uygulamalar arasında özel durum mantığı içerir ve bu testler başarısız olursa, açıkça Test altındaki kodun ne şekilde başarısız olduğu (daha derine inmeniz veya ne olduğunu anlamak için test senaryosunun hata ayıklamanız gerekmez).
Filip Milovanović

1
Yinelenen öğeler içeren liste?
atayenel

Yanıtlar:


30

Tek bir test durumunda mı yoksa birçoğunda bir dizi test yapıp yapmamam için kullandığım basit kural: Sadece bir kurulum mu içeriyor?

Yani, eğer birden fazla element için hepsinin işlendiğini ve doğru sonucu elde ettiğini test ediyor olsaydım, iki ya da daha fazla değerlendirme yapabilirim, ancak listeyi sadece bir kez kurmam gerekiyor. Yani bir test durumu iyi.

Senin durumunda, boş bir liste, boş bir liste vb. Kurmak zorunda kalırdım. Bu yüzden kesinlikle bu durumda birden fazla test oluşturacağım.

Diğerlerinin de belirttiği gibi, bu "çoklu testler" tek parametreli bir test durumu olarak var olabilir; yani aynı test durumu çeşitli kurulum verilerine karşı çalıştırılır. Bunun uygulanabilir bir çözüm olup olmadığını bilmenin anahtarı, testin diğer bölümlerinde yatmaktadır: "eylem" ve "iddia". Her veri setinde aynı işlemleri yapabilir ve iddialarda bulunabilirseniz, bu yaklaşımı kullanın. Kendinizi if, örneğin, bu verilerin farklı bölümlerine karşı farklı bir kod çalıştırmak için eklediğini bulursanız , çözüm bu değildir. Bu durumda ayrı ayrı test senaryoları kullanın.


14

Bir takas var. Bir testte ne kadar fazla miktarda paketlenirseniz, geçmesini sağlamak için soğan etkisi o kadar yüksek olur. Başka bir deyişle, ilk başarısızlık bu testi durdurur. İlk başarısızlığı düzelene kadar diğer iddiaları bilemezsiniz. Bununla birlikte, kurulum kodu dışında çoğunlukla benzer olan bir dizi birim testine sahip olmak, sadece bir kısmının yazılı ve diğerlerinin yapmadığını bulmak için çok yoğun bir çalışmadır.

Çerçevenizi temel alan olası araçlar:

  • Teoriler . Bir teori, bir dizi veri ile ilgili bir dizi gerçeği test etmenizi sağlar. Çerçeve daha sonra testlerinizi birden fazla test verisi senaryosuyla besleyecektir - bir alana veya verileri üreten statik bir metoda göre. Bazı gerçekler bazı önkoşullara dayanarak uygulanırsa, diğerleri ise bu çerçeveler varsayım kavramını ortaya koymaz . Sizin Assume.that()o ön şartı başarısız olursa basitçe veri için Testi atlar. Bu, "Çalışmalar beklendiği gibi" tanımlamanıza ve ardından çok fazla veri beslemenize olanak sağlar. Sonuçları görüntülediğinizde, ana testler için bir girişiniz ve ardından her veri parçası için bir alt girişiniz olur.
  • Parametreli Testler . Parametrelenmiş testler teorilerin öncüsüdür, bu nedenle teorilerle yapabileceğiniz önkoşul kontrolü olmayabilir. Sonuç aynıdır. Sonuçları görüntülüyorsunuz, testin kendisi için bir ebeveyn girişiniz ve ardından her veri noktası için belirli bir girişiniz var.
  • Birden fazla değerlendirme içeren bir test . Kurulumu yapmak daha az zaman alır, ancak bir anda sorunları biraz ortaya çıkarırsınız. Test çok uzunsa ve test edilen çok fazla farklı senaryo varsa, iki büyük risk vardır: çalışması uzun sürecek ve ekibiniz bundan bıkacak ve testi kapatacak.
  • Benzer uygulama ile çoklu testler . Eğer iddialar farklıysa, testlerin üst üste gelmediğini not etmek önemlidir. Ancak, bu TDD odaklı ekibin geleneksel bilgeliği olacaktır.

Testinizde yalnızca tek bir assertifade olabileceğinin kesin bir zihniyetinde değilim , ancak bütün iddiaların tek bir eylemin post-koşullarını test etmesi gerektiği konusunda kısıtlamalar getirdim. Testler arasındaki tek fark veri ise, parametreli hale getirilmiş testler veya teoriler gibi daha ileri veriye dayalı test özelliklerini kullanma zihniyetindeyim.

En iyi sonucun ne olduğuna karar vermek için seçeneklerinizi tartın. "WorksAsExpectedWhenNull" seçeneğinin, değişen sayıda öğeye sahip bir koleksiyonla ilgilendiğiniz durumlardan temelde farklı olduğunu söyleyeceğim.


5

Bunlar farklı test durumları, ancak test kodu aynı. Bu nedenle parametreli testlerin kullanılması en iyi çözümdür. Test çerçeveniz parametrelemeyi desteklemiyorsa, paylaşılan kodu bir yardımcı fonksiyona çıkartın ve ayrı test durumlarından arayın.

Tek bir test durumundaki bir döngü aracılığıyla parametrelendirmeyi önlemeye çalışın, çünkü bu hangi veri setinin hataya neden olduğunu belirlemeyi zorlaştırır.

TDD kırmızı-yeşil-refactor döngünüzde, her seferinde bir örnek veri seti eklemelisiniz. Birden fazla test senaryosunun parametreli hale getirilmiş bir testte birleştirilmesi refactoring adımının bir parçası olacaktır.

Oldukça farklı bir yaklaşım özellik testidir . Somut girdi verileri belirtmeden, fonksiyonunuzun çeşitli özelliklerini gösteren çeşitli (parametrized) testler oluşturacaksınız. Örneğin, bir özellik olabilir: tüm listeler xsiçin listenin ys = f(xs)uzunluğu aynıdır xs. Test çerçevesi daha sonra ilginç listeler ve rastgele listeler oluşturur ve özelliklerinin hepsi için geçerli olduğunu iddia eder. Bu, örnekleri manuel olarak belirtmekten uzaklaşır, çünkü örnekleri manuel olarak seçmek ilginç kenar durumlarını kaçırabilir.


Son cümlede "özledim", "bul" olmamalı mı?
Robbie Dee,

@RobbieDee İngilizce belirsiz, sabittir.
amon

3

Her vaka için bir test yapılması uygundur çünkü her testte tek bir konseptin test edilmesi, genellikle önerilen iyi bir kılavuzdur.

Bu yazıya bakınız: Tek bir birim testinde birden fazla değerlendirme yapılması uygun mudur? . Orada da ilgili ve ayrıntılı bir tartışma var:

Kılavuzum genellikle test başına bir mantıksal KONSEP test etmenizdir. Aynı nesne üzerinde birden fazla öğe olabilir. genellikle test edilenler aynı konsept olacaktır. Kaynak - Roy Osherove

[...]

Testler yalnızca bir nedenden dolayı başarısız olmalıdır, ancak bu her zaman yalnızca bir Assert ifadesi olması gerektiği anlamına gelmez. IMHO "Düzenle, Hareket, İddialı" düzenine uymak daha önemlidir.

Önemli olan, yalnızca bir eyleminizin olması ve ardından bu eylemin sonuçlarını iddiaları kullanarak incelemektir. Ama "Düzenle, Yasa, Assert, Testin Sonu" dır. Başka bir eylem gerçekleştirerek teste devam etmeye istekliyseniz ve daha sonra daha fazla iddiada bulunduysanız, bunu ayrı bir test yapın. Kaynak


0

Benim düşünceme göre, test durumuna bağlıdır.

  • Testinizde testi ayarlamak için yalnızca 1 koşul varsa, ancak birçok yan etkisi varsa. çoklu iddia kabul edilebilir.
  • Ancak, birden fazla koşulunuz olduğunda, birden fazla test durumunuz olduğu anlamına gelir, her biri yalnızca 1 birim test kapsamında olmalıdır.

Bu bir yorum gibi daha fazla okur, Nasıl
gnat
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.