Entegrasyon testleri tüm ünite testlerini tekrarlamak içindir?


36

Diyelim ki bir işleve sahibim (Ruby'de yazılmıştır, ancak herkes tarafından anlaşılabilir olmalıdır):

def am_I_old_enough?(name = 'filip')
   person = Person::API.new(name)
   if person.male?
      return person.age > 21
   else
      return person.age > 18
   end
end

Birim testinde tüm senaryoları kapsayacak şekilde dört test oluşturacağım. Her biri Person::APIinatlı yöntemlerle alaycı nesne kullanacaktır male?ve age.

Şimdi entegrasyon testleri yazmaya başlıyor. Person :: API'nin artık alay edilmemesi gerektiğini düşünüyorum. Bu yüzden aynı dört test senaryosunu yaratacağım, ancak Person :: API nesnesi ile alay etmeden. Bu doğru mu?

Eğer evet ise, o zaman hiç birim test yazmanın amacı nedir, bana sadece daha fazla güven veren entegrasyon testleri yazabilirsem (gerçek nesneler üzerinde çalışırken, saplamalar veya alaylar değil)?


3
Eh, noktalardan biri, alay / birim test ederek, herhangi bir sorunu kodunuza izole edebileceğinizdir. Bir entegrasyon testi başarısız olursa, kodunun kimin, sizin veya API’nizin bozuk olduğundan haberi yoktur.
Chris Wohlert,

9
Sadece dört test mi? Test etmeniz gereken altı sınırınız var: 17, 18, 19, 20, 21, 22 ...;)
David Arno

22
@FilipBartuzi, yöntemin bir erkeğin 21 yaşın üzerinde olup olmadığını kontrol ettiğini varsayıyorum? Şu anda yazıldığı gibi, bunu yapmaz, sadece 22+ ise geçerlidir. İngilizce'de "21 yaş üstü" olsa da "21+" anlamına geliyor. Yani kodunuzda bir hata var. Bu tür hatalar sınır değerleri, yani bir erkek için 20, 21, 22, bu durumda bir kadın için 17, 18, 19 test edilerek yakalanır. Bu yüzden en az altı test gereklidir.
David Arno

6
0 ve -1 durumlarından bahsetmiyorum. Bir insanın -1 yaşına gelmesi ne anlama gelir? API'nız saçma bir şey döndürürse kodunuz ne yapmalı?
RubberDuck,

9
Parametre olarak bir kişi nesnesini geçtiyseniz, test etmek çok daha kolay olacaktır.
JeffO

Yanıtlar:


72

Hayır, entegrasyon testleri gerektiğini sadece birim testlerin kapsamı çoğaltmak değil. Onlar olabilir bazı kapsama yinelenen ama konu bu değil.

Birim testinin amacı, belirli bir küçük işlevsellik fonksiyonunun tam ve tamamen amaçlandığı şekilde çalışmasını sağlamaktır. Bir birim testi am_i_old_enough, muhtemelen her birinin insanın yaşadığı farklı yaşlardan, kesinlikle eşiğe yakın olanlardan gelen verileri test edecektir . Bu testi yazdıktan sonra, bütünlüğü bir am_i_old_enoughdaha asla sorulmamalıdır.

Bir entegrasyon testinin amacı, tüm sistemin veya önemli sayıda bileşenin bir kombinasyonunun birlikte kullanıldığında doğru olanı yaptığını doğrulamaktır . Müşteri yazdığınız belirli bir yardımcı program işlevini umursamıyor, web uygulamalarının küçükler tarafından erişime karşı düzgün bir şekilde korunmasını önemsiyor, çünkü aksi takdirde düzenleyiciler kendilerine değer verecek.

Kullanıcının yaşını denetleme olduğunu biri o işlevselliği küçük bir parçası, ama entegrasyon testi sizin fayda fonksiyonu doğru eşik değerini kullanıp kullanmadığını kontrol etmez. Arayan kişinin bu eşiğe göre doğru kararı verip vermeyeceğini, yardımcı program işlevinin çağrılıp çağrılmadığını, erişim için diğer koşulların karşılanıp karşılanmadığını, vb. Test eder .

Her iki test türüne de ihtiyacımızın nedeni, temel olarak, yürütmenin alabileceği bir kod tabanı üzerinden yol için olası senaryoların bir birleşimsel patlaması olması. Yardımcı program işlevi yaklaşık 100 giriş içeriyorsa ve yüzlerce yardımcı program işlevi varsa, her durumda doğru olan şeyin olup olmadığını kontrol etmek için milyonlarca test senaryosu gerekir. Çok küçük kapsamlardaki tüm durumları kontrol edip sonra bu kapsamların ortak, ilgili veya muhtemel kombinasyonlarını kontrol ederek , bu küçük kapsamların zaten doğru olduğunu varsayarak, birim testinde gösterildiği gibi , sistemin yaptığı konusunda oldukça emin bir değerlendirme alabiliriz. ne olması gerektiği, olmadan testine alternatif senaryolar boğulma.


6
“Test etmek için alternatif senaryolarda boğulmadan sistemin yapması gerekeni yaptığı konusunda kendinden emin bir değerlendirme alabiliriz.” Teşekkür ederim. Birisi otomatik testle aklı başında test ettiğinde onu seviyorum.
jpmc26

1
JB Rainsberger, testler ve son paragrafta yazdığınız "Bütünleşik Testler Bir Dolandırıcılık" adlı kombinatoryal patlama hakkında güzel bir konuşma yaptı . Entegrasyon testleriyle ilgili çok fazla bir şey yok ama yine de oldukça ilginç.
Bart van Nierop,

The customer doesn't care about a particular utility function you wrote, they care that their web app is properly secured against access by minors-> Çok zekice bir düşünce, teşekkürler! Sorun kendin için proje yapmaktır. Zihniyetinizi programcı olmakla aynı zamanda ürün müdürü olmak arasında bölmek çok zor
Filip Bartuzi

14

Kısa cevap "Hayır" dır. Daha ilginç olan kısım, bu durumun neden / nasıl ortaya çıkabileceğidir.

Sanırım karışıklık ortaya çıkıyor, çünkü sıkı uygulamalara uymuyor gibi görünen kod için katı test uygulamalarına (birim testleri - entegrasyon testleri, alaycı vb.) Uymaya çalışıyorsunuz.

Bu, kodun "yanlış" olduğunu veya belirli uygulamaların diğerlerinden daha iyi olduğunu söylemez. Basitçe, test uygulamaları tarafından yapılan varsayımların bazıları bu durumda geçerli olmayabilir ve kodlama uygulamalarında ve test uygulamalarında benzer bir "katılık" seviyesi kullanmaya yardımcı olabilir; veya en azından, dengesiz olduklarını kabul etmek, bu da bazı yönlerin uygulanamaz veya gereksiz olmasına neden olacaktır.

En belirgin nedeni, işlevinizin iki farklı görevi gerçekleştirmesidir:

  • Adlarına Persongöre bir ararken . Bu Person, muhtemelen başka yerde yaratılmış / depolanmış nesneleri bulabildiğinden emin olmak için entegrasyon testi gerektirir .
  • PersonCinsiyetlerine göre yeterince yaşlı olup olmadığını hesaplamak . Bu, hesaplamanın beklendiği gibi yapıldığından emin olmak için birim testini gerektirir.

Bu görevleri bir kod bloğunda gruplandırarak, birini diğeri olmadan çalıştıramazsınız. Hesaplamaları test etmek istediğinizde, Person(ya gerçek bir veri tabanından ya da bir saplama / alaydan) bakmak zorunda kalırsınız . Aramanın sistemin geri kalanıyla bütünleştiğini test etmek istediğinizde, yaşınıza göre bir hesaplama yapmak zorunda kalırsınız. Bu hesaplama ile ne yapmalıyız? Görmezden mi gelmeliyiz yoksa kontrol edelim mi? Bu, sorunuzda tarif ettiğiniz kesin çıkmaz gibi görünüyor.

Bir alternatif hayal edersek, hesaplamayı kendi başımıza yapabiliriz:

def is_old_enough?(person)
   if person.male?
      return person.age > 21
   else 
      return person.age > 18
   end
end

Bu saf bir hesaplama olduğundan, üzerinde entegrasyon testleri yapmak zorunda değiliz.

Arama görevini de ayrıca yazmak isteyebiliriz:

def person_from_name(name = 'filip')
   return Person::API.new(name)
end

Ancak, bu durumda, işlevsellik o kadar yakındır Person::API.newki, onu kullanmanız gerektiğini söyleyeceğim (varsayılan ad gerekliyse, başka bir yerde, bir sınıf niteliği gibi depolanması daha iyi olur mu?).

Person::API.new(Veya person_from_name) için bütünleştirme testleri yazarken, tek yapmanız gereken, beklentileri geri alıp almadığınızdır Person; Tüm yaşa dayalı hesaplamalar başka yerlerde de yapılır, böylece entegrasyon testleriniz bunları görmezden gelebilir.


11

Killian'ın cevabına eklemeyi sevdiğim bir diğer nokta , birim testlerinin çok hızlı çalışması, 1000 tane alabilmemiz. Bir entegrasyon testi genellikle daha uzun sürüyor çünkü web servislerini, veritabanlarını veya diğer bazı dış bağımlılıkları çağırıyor, bu yüzden entegrasyon senaryoları için çok fazla zaman alabilecekleri aynı testleri (1000'ler) çalıştıramıyoruz.

Ayrıca, birim testleri tipik olarak inşaat zamanında (inşaat makinesinde) yapılır ve entegrasyon testleri bir ortam / makineye yerleştirildikten sonra gerçekleştirilir .

Genelde biri her bina için 1000 birim testlerimizi ve her dağıtımdan sonra 100 ya da çok değerli entegrasyon testlerimizi gerçekleştirir. Her yapıyı dağıtıma almayabiliriz, ancak bu sorun değil çünkü dağıtım için yaptığımız yapı tümleştirme testlerini çalıştıracak. Genelde, bu testleri 10 veya 15 dakika içinde çalışacak şekilde sınırlamak istiyoruz, çünkü konuşlandırmayı çok uzun süre tutmak istemiyoruz.

Ek olarak, haftalık bir programda, hafta sonu veya diğer mola zamanlarında daha fazla senaryoyu kapsayan bir regresyon entegrasyon testi takımı çalıştırabiliriz. Daha fazla senaryo ele alınacağı için bunlar 15 dakikadan daha uzun sürebilir, ancak genellikle hiç kimse Sat / Sun üzerinde çalışmıyor, bu yüzden testlerle daha fazla zaman geçirebiliriz.


Dinamik diller için geçerli değildir (örneğin, geliştirme aşaması olmadan)
Filip Bartuzi,
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.