Entegrasyon testlerini ne zaman yazmalıyım?


30

TDD kurallarına göre birim testleri üretim kodundan önce yazılmıştır, peki ya beton (alaysız) kablolu nesneler arasındaki etkileşimi uygulayan Entegrasyon testlerinden ne haber?

Ünite testlerinden önce veya sadece "kablolamayı" test etmek için üretim kodundan sonra yazılmalı mı?

Kabul veya fonksiyonel testlerden bahsetmediğimi, ancak düşük seviyeli entegrasyon testlerinden bahsettiğimi unutmayın.

Yanıtlar:


49

Rspec Kitabı , diğer BDD kaynaklarının yanı sıra, şöyle bir döngü önerir:

görüntü tanımını buraya girin

Özünde, süreç:

While behaviour required
    Write an integration test for a specific behaviour
    While integration test failing
        Write a unit test to fulfil partial behavior
        While unit test failing
            Write code to make unit test pass
        Commit
        While refactoring can be done
            Refactor
            While unit test failing
                Write code to make unit test pass
            Commit
    Push

Feragatname: Aklımda bunun en iyi kod ve ürüne yol açtığına dair hiçbir şüphe yok, ancak zaman alıcı olabilir. Entegrasyon testlerinin her zaman geçmesi gerektiğini söylemek söz konusu olduğunda veri ve determinizm konusunda her türlü zorluk vardır. Her koşulda uygun değildir; bazen kapıdan bir şeyler çıkarman gerekir.

Bu, ideal bir süreç göz önünde bulundurularak büyük olduğunu söyledi. Size ödün vermeniz gereken bir nokta verir.


2
Teşekkürler pdr, ancak bir yinelemenin başında / başında yazılan Kabul testlerinden bahsetmediğimi belirttim, daha düşük seviyeli entegrasyon testleriyle ilgileniyorum.
Chedy2149

@ chedy2149: Akkh. Bu yorumu kaçırdım. Cevabımı kaldırmadan önce, entegrasyon testleri bağlamında "düşük seviye" ile ne demek istediğinizi daha spesifik tutmanız gerektiğini düşünüyorum.
pdr

Alt seviye: hangi davranış kullanıcılar veya müşteriler tarafından belirtilmez ve sınıf / bileşen etkileşimlerini test etmek için kullanılan geliştiriciler tarafından beklenir.
Chedy2149

4
Aslında, bu resimde "kabul testi" veya "entegrasyon testi" koyarsanız, bunun bir fark yaratacağını düşünmüyorum - farklı soyutlama seviyelerindeki her tür test için ideal bir görünümdür. Ancak IMHO’daki asıl sorun, bunun “zaman alıcı” olabileceği değildir - asıl sorun, hala TDD’nin yardımı ile tasarlanan bir kamu arayüzüne karşı “önceden” entegrasyon testleri yazmaktır. ".
Doktor Brown

@DocBrown yani cevabınız üretim kodundan sonra ve serbest bırakılmadan önce mi?
Chedy2149

10

Gerçek proje bana ünite testleri yazmanın mümkün olmadığını gösterdi, daha sonra entegrasyon ve hatta ters yön yanlış bile oldu :-) Bu yüzden, genellikle entegrasyon testleriyle birlikte ünite testleri yazıyorum.

Niye ya? Her iki tür testi de nasıl gördüğümü yazmama izin verin:

  1. Birim testleri - Vikipedi ve tüm bilgilerin yanı sıra birim testleri , tasarımınızı daraltmanıza , modelinizi ve ilişkilerinizi geliştirmenize yardımcı olur . Akış basittir: yeni proje / yeni bileşen yazmaya başladığınızda, çoğu zaman bir çeşit PoC yapıyorsunuzdur . İşiniz bittiğinde, her zaman uzun yöntemlere, uzun sınıflara, tutarlı olmayan yöntemlere ve sınıflara vb. Sahip olursunuz.

    Birim testleri, yukarıda açıklanan sahte (başka bir bileşene bağımlılık olmadan) sınıflarını kullanarak gerçek birim testi yaptığınız zaman, test edilemez niteliktedir. Test edilemeyen kodun temel işareti, testlerin büyük bir kısmıdır; çünkü birçok bağımlılıkla (veya durumlarla) dalga geçmek zorunda kalırsınız.

  2. Entegrasyon testleri - doğru ve çalışma testleri size, yeni bileşeninizin (veya bileşenlerinin) birlikte veya diğer bileşenlerle birlikte çalıştığını söylüyor - bu genel tanımdır. Ben entegrasyon testleri çoğunlukla tanımlamak için yardımcı olduğunu tespit ettik senin bileşeni nasıl kullanılacağını akış gelen tüketici tarafında .

    API'nizin dışardan mantıklı gelmediğini söylediği için bu gerçekten önemlidir.

Peki, sonra birim testlerini ve entegrasyon testlerini yazdığımda ne oldu?

İyi sınıflar, net tasarım, iyi yapıcı, kısa ve uyumlu yöntemler, IoC hazırlığı vb. Aldım. Bireysel bir müşteri / tüketici sınıfını, örneğin entegrasyon veya GUI ekibinin geliştiricisine verdiğimde, API'mı unbian göründüğü için kullanamadı. , tuhaf. Kafası karışmıştı. Bu yüzden API'yi kendi bakış açısına göre tamir ettim ama aynı zamanda birçok testi tekrar yazmak zorunda kaldım, çünkü yöntemleri ve bazen de API'nin nasıl kullanılacağı akışını değiştirmek için zorlandım.

Peki, daha sonra entegrasyon testleri ve birim testleri yazdığımda ne oldu?

Kesin akışım var, iyi bir kullanılabilirlik Benim de sahip olduğum büyük sınıflar, tutarlı olmayan kodlar, günlük kaydı yok, uzun yöntemler. Spagetti kodu

Benim tavsiyem nedir?

Aşağıdaki akışı öğrendim:

  1. Kodunuzun temel iskeletini geliştirin
  2. Tüketici açısından mantıklı olup olmadığını söyleyen entegrasyon testlerini yazın. Temel kullanım durumu şimdilik yeterli. Test açıkça çalışmıyor.
  3. Her sınıf için birim testleri ile birlikte kod yazınız.
  4. Uyum sınavlarının geri kalanını / eksikliğini yazın. Bu sınamayı, kodunuzu nasıl geliştirdiğiniz # 3 içinde uygulamak daha iyi olur.

Ünite / entegrasyon testi hakkında küçük sunumlar yaptığımı unutmayın , iskeletin tanımlandığı slayt # 21'e bakınız.


5

Birim Testleri , bir uygulamadaki mümkün olan en küçük test edilebilir bit yazılımını test etmek ve işlevselliğini test etmek için kullanılır. Her ünite, uygulamanın parçalarına veya daha büyük bileşenlerine birleştirilmeden önce ayrı olarak test edilir.

Entegrasyon Testlerinin geldiği yer burasıdır :
Bu parçaların bir araya getirilmesi sırasında önceden test edilmiş birimlerden oluşan yeni oluşturulan parçaları test ederler. En iyi örnek, uygulamanın kendisini yazarken testleri bu noktada yazmak olacaktır.


Yani cevabınız üretim kodundan sonra mı?
Chedy2149

Bu soruya cevap vermiyor. Entegrasyon testleri yazıldıktan sonra üretim kodunun yazılıp yazılmadığını soruyor. Cevabınız her iki şekilde de alınabilir.
Reacgular

1
@MathewFoscarini - cevap güncellendi. Umarım şimdi daha netleşir.
Ben McDougall

Birim testleri ile ilgili olarak, " mümkün olan en küçük yazılım parçası" ile ilgilenirim . Kontratta ne olduğunu test edin (örneğin bir nesnenin halka açık yöntemleri, bir kütüphanenin ihraç ettiği işlevler) çünkü sözleşme neyin işe yaraması gerektiğini tanımlar. Diğer şeyler test edilebilir, ancak böyle yapmak sadece zaman kaybı değil aynı zamanda üretkenliktir.
saat

3

Entegrasyon testlerini birim testlerine çok benzer olarak görme eğilimindeyim. Bunun üzerine kodun bir alt kümesini kara kutu olarak görüyorum. Yani entegrasyon testleri sadece daha büyük bir kutu.

Onları üretim kodundan önce yazmayı tercih ederim. Bu, henüz hangi kabloları bağlamadığımı ya da nesnelerin etkileşimindeki ayrıntıları biraz değiştirdiğimi hatırlamama yardımcı olma avantajına sahiptir.


Farklı test seviyeleri vardır: beyaz kutu bileşen testi, beyaz kutu entegrasyon bileşeni testi. Bileşen kara kutu testi, entegrasyon kara kutu testi. Entegrasyon sistemi testi de var.
Alexander.Iljushkin

2

Kabul testlerinin yanı sıra, üçüncü taraf sistemler veya bileşenlerle iyi bir şekilde bütünleştiğini doğrulamak için yalnızca bir uygulamanın sınırlarına entegrasyon testleri yazma eğilimindeyim.

Buradaki fikir, üçüncü tarafın uygulamanızın ihtiyaç duyduğu şeyle konuşma biçiminden çeviri yapan ve bu çevirmenleri gerçek dış sisteme karşı test eden adaptör nesneleri oluşturmaktır. Bu testi ilk mi yoksa son testi mi yaptığınız, normal birim testlerinizden daha az önemli olduğunu düşünüyorum çünkü

  • TDD tarafından sağlanan tasarım anlayışı burada çok fazla farketmez, çünkü tasarım önceden bilinir ve genellikle karmaşık bir şey yoktur, sadece bir sistemden diğerine şeyleri eşlersiniz.

  • Ele almak istediğiniz modül / sisteme bağlı olarak, kısa bir TDD geri besleme döngüsüne gerçekten iyi uymayan çok fazla keşif, yapılandırma kontrolü, örnek veri hazırlığı gerekebilir.

Bununla birlikte, adaptörünüzü kademeli olarak küçük güvenli adımlarla oluşturmaktan daha rahat hissediyorsanız, kesinlikle ilk teste girmenizi tavsiye ederim, zarar görmez.

Bu yaklaşımın örneklerini burada bulabilirsiniz: http://davesquared.net/2011/04/dont-mock-types-you-dont-own.html (6. paragraf) http://blog.8thlight.com/eric- smith / 2011/10/27 / şu-not-yours.html


Burada “sistemimiz” ile 3. parti kütüphaneler arasındaki etkileşimi doğrulayan entegrasyon testlerinden bahsediyorsunuz, örneğin bir eklenti geliştirirken bir platforma karşı etkileşimleri test etmeye ne dersiniz?
Chedy2149

Eklenti geliştirme konusunda çok az deneyimim olsa da, ana bilgisayar uygulamasıyla sıkı sıkıya bağlantılı olduklarından, farklı olabilirler, bu nedenle bu entegrasyonu tamamen benimsemek ve bir adaptör katmanına gerek duymamaya karar vermek isteyebilirsiniz. Bu durumda, test performansı konusunda gerçekten dikkatli olurdum - ana bilgisayar uygulamasına bağlı olarak, API’sini doğrudan testlerinizin çok başında aramak çok yavaş olabilir. Bundan korkuyorsanız, her zaman "ek soyutlama katmanı" yaklaşımına başvurabilir ve adaptörlerde mock + entegrasyon testlerini kullanabilirsiniz.
guillaume31

1

Böylece ilk cevabı kabul edecektim ama silindi.
Özetlemek gerekirse
Belirli bir yinelemede:

  1. Birim testi yaz
  2. Üretim kodunu yaz
  3. Etkileşimleri test etmek için Entegrasyon testleri yaz

Entegrasyon düzeyinde test edilebilirliği garanti etmek için 1 ve 2 iken entegrasyon testlerini aklınızda bulundurun.

Entegrasyon testlerinin mutlaka 3. adımda baştan sona yazılması gerekmez, kısmen 1. ve 2. adımlar arasında yazılabilir.


3
Bu özetleme, sürecin yinelemeli yapısını tamamen görmezden geliyor. Üretim kodunuzun API'sini bir dereceye kadar stabil hale getirdikten sonra, yazma entegrasyon testlerine başlayabilirsiniz. Daha sonra üretim kodunuz üzerinde tekrar çalışabilir ve muhtemelen entegrasyon testlerinizi değiştirebilir veya genişletebilirsiniz. Bu yüzden çoğu durumda "üretim kodundan sonra entegrasyon testleri yazmazsınız", genelde her ikisini de paralel olarak yaparsınız. Aslında bu, ne tür bir yazılım kullandığınıza da bağlıdır. “Siyah beyaz” düşünme sizi daha da ileriye götürmez.
Doktor Brown

İyi nokta. Cevap, yeniden tasarımlama yoluyla tasarımın yinelemeli yapısını görmezden geliyor gibi görünüyor.
Chedy2149

0

Birim testleri kod ayrık blok sınamak içinde projeniz.
Entegrasyon testleri, kodunuzun diğer kodla nasıl etkileşimde bulunduğunu test eder: başka bir deyişle, kodunuzun arayüzünü test eder .

Bir arabirimin arkasındaki kodu geliştirirken birim testleri yaz.
Arabirimi veya arabirimi uygulayan kodu geliştirirken tümleştirme testlerini yazın.

Bu, bazen bir projenin entegrasyon testlerini çok geç yazacağınız anlamına gelir, çünkü çalışmanın büyük kısmı ara yüzün arkasındadır: örneğin, bir derleyici, birkaç mantık katmanını uygulayan belirli bir web servisi veya .. iç mantık

Bununla birlikte, bir dizi REST servisi uyguluyorsanız veya veri modelini yeniden yapılandırıyorsanız ve XA işlemlerine destek ekliyorsanız, hemen hemen tümleştirme testlerini geliştirmeye başlayacaksınız, çünkü çalışmanızın çoğu ara yüze odaklanmış olsun. REST API veya programın veri modelini nasıl kullandığı.


Birim testlerinin beyaz kutu testi ve entegrasyon testlerinin kara kutu testi olduğunu söylemeyi kabul eder misiniz?
Chedy2149

Ne yazık ki, bu bağlıdır. Entegrasyon testi teknolojileri son yıllarda (en azından Java dünyasında) muazzam gelişmeler sağladı, böylece 1 sınıfı test edebiliyorum - ancak bir uygulama sunucusunda. O zaman soru şu, birim testleri ile entegrasyon testleri arasındaki çizgi nerede? Kodunuzu diğer teknolojilerle etkileşime girerek test ederken bir entegrasyon testi mi yoksa bütün başvurunuzu test ederken bir entegrasyon testi mi - ama mutlaka çalışması gereken ortamda değil mi?
Marco

Kısacası, bazı durumlarda, entegrasyon testlerinin kara kutu testi olduğundan emin olun, ancak her durumda değil.
Marco

FYI: Wiki entegrasyon testini "bireysel yazılım modüllerinin birleştirildiği ve bir grup olarak test edildiği yazılım testindeki aşama" olarak tanımlar
Marco

Kesinlikle, Marco. Her bileşen seviyesinde entegrasyon vardır. Kod seviyesi, uygulama seviyesi, sistem seviyesi.
Alexander.Iljushkin
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.