Alay edilemeyen somut dış uygulamalara dayanan kod testleri nasıl yazılır?


17

Arka plan: Üzerinde çalıştığım bir modül için bazılarını oluşturarak, birim testleri kavramını iş arkadaşlarıma tanıtmaya çalışmayı düşünüyorum; Son zamanlarda değişti ve bazı daha soyutlamalar / etkileşimler gerektiriyor, bu yüzden uygulama etrafında elle dürtmek zorunda kalmadan çalıştığını "kanıtlayacak" bir test paketi geliştirmek için iyi bir yol gibi görünüyor.

Ancak sorun, modülün PDF ve XSL gibi taşınamaz dış etkenlere dayanmasıdır. Temelde XML'i veritabanından okudum ve ona bir XSL dönüşümü uyguluyorum, sonra ABCPDF adlı bir kitaplığı kullanarak PDF'ye dönüştürüyorum. Bu PDF daha sonra statik bir şablona dayalı başka bir PDF ile birleştirilir. XML'i test edebileceğimi ve değerlerin doğru olduğundan emin olabileceğimi biliyorum, ancak potansiyel hataların ve sorunların birçoğu bitmiş belgenin gerçek görüntüsü ile ilgilidir - örneğin, metin dizelerinin ne kadar uzun süre sarıldığı, belirli HTML alanlarının olduğu gibi minutiae Bu şeyleri test etmek bile mümkün mü (bunların muhtemelen entegrasyon testleri olduğunu fark ediyorum veya .. adını unuttuğum üçüncü tür test [Kabul testleri değil, diğer tür] ve birim değil testler), bildiğim kadarıyla, bir PDF'yi kolayca oluşturup kısa bir süre sonra tekrar okuyamıyor veya bir HTML dizesi (yani dönüştürülmüş XML) oluşturabiliyor ve belirli tablo hücrelerinin varlığını kontrol etmek için elle ayrıştıramıyorum. diğer tablo hücreleriyle ilişkisi.

Böyle bir durumda, bilgilerin doğru olduğundan ve PDF'yi oluşturabildiğimden veya bunları birleştirebildiğimden emin olmak için birim testlerine odaklanmalı mıyım veya gerçek görüntüleme sorunları için manuel testlere başvurmalı mıyım?


6
"mockable harici faktörler" ilk etapta birim testleri yapmadığınıza dair bir ipucudur . Bu entegrasyon testi demektir . Hangisini yapmak istiyorsun? Arasında test Birimi sizin kod veya bu entegrasyon test kompozit şey? Lütfen birini veya diğerini seçin, çünkü her ikisi hakkında aynı anda konuşmak zor.
S.Lott

2
"Mockable" satın almıyorum. "Nasıl alay edileceğini bilmiyorum" u kabul edeceğim, bu sadece asıl sorunuzun "nasıl alay edeceğim?" Anlamına gelir.
Rein Henrichs

Muhtemelen :) Kullanılan XML ile alay etmeyi biliyorum, ancak biçimlendirmenin önemli olduğu gerçek bir PDF'yi veya HTML belgesini alay etmeyi bilmiyorum.
Wayne Molina

1
"Fonksiyonel" (uygulama uçtan uca) veya "sistem" (birden çok uygulama uçtan uca) testleri demek istediğinizi düşünüyorum
Gary Rowe

@Gary - Evet, işlevsel kelimeydi. Onları şimdi Rails öğrenmekten hatırlıyorum: Birim test modelleri, Fonksiyonel test kontrolörleri, Entegrasyon her şeyi test ediyor.
Wayne Molina

Yanıtlar:


13

Üniteyi değil özelliği test edin

Bilinen xml girişlerini kullanarak bir PDF çıktısı alın ve doğru (ve titizlikle) doğru olduğunu doğrulayın. Sonra referans olarak kaydedin.

Aynı xml girişlerini kullanan gelecekteki testler referansla ikili dosya karşılaştırması yapabilir.

Dosya düzeyinde karşılaştırma tatmin edici değilse, PDF'yi testin sonunda görüntüleyin ve ekran görüntüleri alın, ardından otomatik testin referans ekran görüntüleri ile karşılaştırılmasını sağlayın.


+1 çünkü yalnızca bu düzeydeki nihai sonuçla ilgileniyorsunuz. PDF'yi nasıl elde ettiğinizin uygulanmasını değiştirirseniz, işlevsel testinizi değiştirmeniz gerekmez.
Gary Rowe

2
İyi tavsiye için +1, mevcut projemizde yaptığımız şey budur. PDF karşılaştırması yapmak için, zaman damgaları gibi belgelerdeki değişen parçaları atlamamıza izin veren özel bir araç seti oluşturduk. Uyarı: Farklı bir PDF oluşturucusuna geçmek, düzende küçük değişikliklere neden olarak yanlış pozitif sinyal yığınları için doğrudan ikili karşılaştırmaya neden olabilir.
Péter Török

5

Normalde böyle bir durumda, bir arayüzle kullanabileceğiniz bir uygulamanın arkasında test edemeyeceğiniz her şeyi soyutlarsınız. Ben sadece PDF oluşturucu gibi aptalca bir şey yapacağım çünkü bu makul görünüyor.

public class PdfBuilder : IPdfBuilder
{
  public byte[] BuildPdf(...)
  {
    // actual untestable code here
  }
}

public interface IPdfBuilder
{
  byte[] BuildPdf(...);
}

Daha sonra IPdfBuilder'ı testlerinizde istediğiniz gibi yapmak için alay edebilirsiniz. Bu genellikle bir IoC kapsayıcısı kullanmaya başlamanız gerektiği anlamına gelir ( /programming/871405/why-do-i-need-an-ioc-container-as-opposed-to-straightforward-di-code ve /programming/21288/which-net-dependency-injection-frameworks-are-worth-looking-into olarak başlamak için bir yer) şimdi kullanmıyorsanız.

Birim testi olmayan testlere genellikle entegrasyon testi denir. Karmaşık entegrasyon testleri genellikle buna değmez, bu yüzden sadece bir kısmı soyutlarsınız ve o soyutlamadaki iş mantığı miktarını azaltırsınız, böylece bir birim testinde test edebilirsiniz.

Bu tamamen net değilse bana bildirin.


Test edilemeyen kodu gizlemek için +1. Ardından, doğru sonucu elde etmek için bu arayüzden geçmeniz gerekenleri bulana kadar manuel testler yapabilirsiniz. o senin regresyon birim testleri almak için düzgün oluşturuluyor.
Ethel Evans

1

Bir süre önce çok benzer bir şey inşa ettim ve sadece temel görsel testleri kullandım. Testin otomatik hale getirilmesi gerekmez, bu nedenle sadece beklenen bir sonuç aramakla ilgili yanlış bir şey yoktur (belli ki, önceden belirlenmiş çeşitli durumlarda). Genellikle bir resim, görseller söz konusu olduğunda bin teste değer . Otomatik birim testini yoğun bir şekilde kullanıyorum, ancak bazı kişilerin GUI testine veya görsel IMHO'ya girerken biraz uzaklaşabileceğini düşünüyorum. Bazı ürünlerde bu "yeterince iyi" yaklaşımın YMMV için yeterli olmayacağını kabul ediyorum.

Bununla birlikte, taşınmaz dışsallıklar konusunda biraz endişeliydim. Bu, genel bir genel kural olarak kaçınmak için iyi olan sıkı bir bağlantı işareti olabilir, ancak daha fazla ayrıntı olmadan bu konuda kodunuz hakkında çok fazla spekülasyon yapmayacağım.


Çok sıkı bir şekilde birleşti ama bu gevşek bir şekilde birleştirmek için herhangi bir buy-in ve yeniden düzenleme için hiçbir kaynak ayrılmıştır çünkü bu tamir edemez bir alandır (ama bu tamamen farklı bir dizi sorun).
Wayne Molina
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.