Zaten entegrasyon testim varsa birim testine ihtiyacım var mı?


47

Programım için zaten bir entegrasyon testim varsa ve hepsi geçti, o zaman işe yarayacağına dair iyi bir fikrim var. Öyleyse birim testleri yazmak / eklemek için nedenler nelerdir? Zaten entegrasyon testleri yazmak zorunda olduğum için, sadece entegrasyon testlerinin kapsamadığı kısımlar için ünite testi yazmak istiyorum.

Birim testinin entegrasyon testine faydasını bildiğim şey:

  • Küçük ve dolayısıyla hızlı koşmak (ancak bir şeyi test etmek için yeni bir ünite eklemek, entegrasyon testi tarafından zaten test edilmiştir, toplam test takımımın daha büyük ve daha uzun çalışması)
  • Hatayı daha kolay bulun çünkü yalnızca bir şeyi test eder (ancak entegrasyon testim başarısız olduğunda her bir parçayı doğrulamak için birim testine başlayabilirim)
  • Entegrasyon testinde yakalanmayan hatayı bulun. örneğin maskeleme / ofsetleme hataları. (eğer entegrasyonum tüm testleri test ederse, bu da programımın bazı gizli hatalar olsa bile çalışacağı anlamına gelir. Bu nedenle, gelecekteki entegrasyon testlerini kırmaya başlamadıkça veya performans sorununa neden olmadıkça bu hataları bulma / düzeltme gerçekten yüksek öncelikli değildir)

Ve biz her zaman daha az kod yazmak istiyoruz, ancak birim testleri yazmak için çok daha fazla kod gerekiyor (temelde sahte nesneler kuruluyor) Bazı ünite testlerim ve entegrasyon testlerim arasındaki fark, ünite testlerinde sahte nesne kullandığım ve entegrasyon testlerinde gerçek nesne kullandığım. Çok fazla çoğaltma var ve çoğaltılmış koddan hoşlanmıyorum, testlerde bile bu davranışını değiştirmek için ek yük ekliyor (refactor aracı her zaman her şeyi yapamıyor).


Merak etmeyin, entegrasyon testlerinizin kapsamı ne kadar? Ayrıca, eğer karmaşık bir mantığınız varsa, entegrasyon testleriniz hepsini veya bir kısmını ve iş için önemli olan veya rastgele hangi bölümleri kapsar?
civan

Bu soru belirsiz görünüyor. Bir etkileşimciyi çağıran bir Rails denetleyici yöntemine sahip olduğumu varsayalım ( github.com/collectiveidea/interactor ). Denetleyici yöntemim için entegrasyon testleri yazmaya karar verdim (çünkü onlar olmadan API uç noktamın çalıştığına güvenemiyorum). Burada en az iki soru var: (1) aynı zamanda denetleyici yöntemlerim için birim testleri yazmalı mıyım (yani entegrasyon testlerimle aynı davranışı test eden birim testleri yazmalı mıyım) ve (2) birim testleri yazmalı mıyım benim etkileşimcim için? Bu iki soruya belli ticari bağlamlarda farklı cevaplardım.
Daniel

Yanıtlar:


33

Birim testi için ve birim test için iyi argümanlar ortaya koydunuz. Kendine sorman gereken Yani, " Ben olumsuz olanları maliyetleri ağır bastığı olumlu argümanlar değeri görüyor musunuz? " Kesinlikle yapın:

  • Küçük ve hızlı, hiçbir şekilde en önemlisi olmasa da, birim testinin güzel bir yönüdür.
  • Locating-bug [s] -easier son derece değerlidir. Profesyonel yazılım geliştirme çalışmalarının birçoğu, bir hatanın maliyetinin yaşlandıkça ve yazılım teslim hattını düşürürken hızla arttığını göstermiştir.
  • Maskeli böcek bulmak çok değerlidir. Belirli bir bileşenin tüm davranışlarının doğrulanmış olduğunu bildiğinizde, daha önce kullanılmadığı şekilde güvenle kullanabilirsiniz. Tek doğrulama, entegrasyon testi ile yapıldığında, yalnızca geçerli kullanımlarının doğru davrandığını bilirsiniz .
  • Alay etmek, gerçek dünyadaki davalarda maliyetlidir ve alaycı sürdürmek iki katına çıkar. Aslında, "ilginç" nesneler veya arayüzlerle alay ederken, sahte nesnelerinizin gerçek nesnelerinizi doğru şekilde modellediğini doğrulayan testlere bile ihtiyacınız olabilir!

Kitabımda, artılar eksilerini ağır basıyor.


2
Gerçek dünyadaki olaylarla alay etmek daha ucuz değil mi? Siz sadece alayın alacağı mesajların beklentilerini oluşturuyor ve neyin döneceğini belirtiyorsunuz.
Dogweather,

10
@Dogweather Mocks ilk oluşturulduğunda iyi çalışıyor. Zaman geçtikçe ve gerçek nesne değiştikçe, alaycı onunla birlikte değişmek zorunda. Yolda 10 yıl ve 6,000 birim testi var, "başarılı" testlerinizin gerçekten başarılı olduğunu bilmek çok zor.
Ross Patterson

1
Bunun yanı sıra, "10 yıl ve 6,000 birim testi", abartısız değil kişisel deneyime dayanan rakamlardır.
Ross Patterson,

3
2004 veya 2005'te otomatik geliştirici testleri (ünite ve entegrasyon, ancak ikincisi) yazmaya başladım ve Java için gelişmiş bir alaycı kütüphane geliştirdim. Çoğu zaman aynı nedenden ötürü birden fazla entegrasyon testi gördüm (DB'deki bir değişiklik veya bir ağ değişikliği gibi) ve bazen tekrar kullanılabilen bileşenler için "düşük seviyeli" entegrasyon testleri yazdım, ama yine de, sadece çok fazla entegrasyon testleri. Mocking ile izole edilmiş ünite testleri, çoğu zaman buna değmez; Alay etmeyi sadece entegrasyon sınavlarına yardımcı olarak uyguluyorum.
Rogério

Son kurşun noktanız yaptığınız argümanla çelişiyor gibi görünüyor. Bu madde işaret noktasında, gereksiz alaylar yazmaya karşı dava açıyorsunuz; bu, zaten entegrasyon testleri tarafından kapsanan parçalar için birim testleri yazmaya karşı bir argümandır. Bununla birlikte, argümanınızın itici gücü, zaten entegrasyon testleri tarafından kapsanan kısımlar için birim testleri yazmaktan yanadır. @RossPatterson 'daki niyetinizi lütfen açıklayabilir misiniz?
Daniel

8

Var olan bir entegrasyon test testini en son model olarak yeniden yerleştirmede fazla bir değer görmüyorum.

Entegrasyon testleri genellikle eski uygulamalar için yazmak çok daha kolaydır, çünkü genellikle test edilecek fonksiyonlar sıkıca birleştirilmiştir, böylece izolasyondaki test üniteleri (= test etme) farklı / pahalı / imkansız olabilir.

> Then what are the reasons to write/add unit tests?

Kanımca test geliştirme, kanuni üniteden önce ünite testlerini yazarsanız daha etkili olur . Bu şekilde, testleri yerine getiren kod, test edilebilen minimum harici referanslarla açıkça ayrılır.

Kod, ünite testleri olmadan zaten mevcutsa, ünite testlerini yazmak için genellikle çok fazla iş gerekir, çünkü kod kolay test için yazılmamıştır.

TDD yaparsanız, kod otomatik olarak test edilebilirdir.


2
Hayır olan eski bir uygulamam varsa unit-testsve unit-testsbelirli kısımlara dahil etmek istersem , önce integration testseski kodu yazması daha iyi olur mu ? Bu bir kez yazıldıktan sonra, sıkı kaplini ayırabilir ve test edilebilen arayüzlerle fonksiyonlar yaratabilirsiniz. Eğer beri integration-testzaten yazılı, daha sonra kodunun yeni sürümü hala istenilen çalışmaları olduğunu, üstlenmeden her adımında doğrulayabilir?
alpha_989

2
@ alpha_989, bu çok IMHO ve diğer fikirleri duymaya açığım, ancak Eski Kod için Birim Testleri Üzerine Entegrasyon Testlerini tercih ederim. Her iki durumda da, herhangi bir test eklemeden önce yöntemlerin doğru çalıştığından emin olmanız gerekir, ancak Entegrasyon Testi, yöntemlerin genel beklentilerinin bireysel kod elemanlarının aksine çalışmasını sağlar.
Britt Wescott

5

Entegrasyon testleri yalnızca birkaç bileşenin beklendiği gibi birlikte çalıştığını doğrulamalıdır. Bireysel bileşenlerin mantığının doğru olup olmadığı birim testleriyle doğrulanmalıdır.
Çoğu yöntem birkaç olası yürütme yoluna sahiptir; if-o zaman-başkalarının, beklenmeyen ya da sadece düz yanlış değerleri olan girdi değişkenlerini düşünün. Genellikle geliştiriciler sadece mutlu yol hakkında düşünmeye meyillidirler: yanlış giden normal yol. Ancak, bu diğer yollar söz konusu olduğunda, iki seçeneğiniz vardır: son kullanıcının UI’de gerçekleştirdiği eylemler yoluyla bu yolları keşfetmesine izin verebilir ve uygulamanızı çökertmeyeceğini umabilir veya iddiada bulunan birim testleri yazabilirsiniz. Diğer yolların davranışları ve gerektiğinde işlem yapmak.


4

Sorunuzda belirttiğiniz nedenlerden bazıları gerçekten önemlidir ve kendi başlarına ünite testi lehine çok iyi sonuç verebilirler, ancak YMMV. Örneğin, entegre test takımınızı ne sıklıkla çalıştırıyorsunuz? Entegre testlerle ilgili deneyimim, er ya da geç çok yavaşlayacakları bir değişiklik yaptığınızda bunları çalıştırmayacağınızdır ve bir hata eklemek ve tespit etmek arasındaki süre artacaktır.

Ayrıca, yaptığınız büyük bir hata da buna güvenmektir.

Find bug that may not be caught in integration test. e.g. masking/offsetting bugs.

önemli değil. Kullanıcılarınızın sizin için hataları bulmasını mı bekliyorsunuz? Entegre testlerden elde edilen eş değerlere güvenmek bence tehlikelidir, kapsama alanlarının% 'sini kolayca alabilirsiniz ama gerçekte çok az test yapıyorsunuzdur.

Sanırım bütünleşik testlere karşı yapılan kanonik referans JBrains'in mesajları:

http://www.jbrains.ca/permalink/integrated-tests-are-a-scam-part-1

Zaten onları okumadım diye.

Son olarak, IMO, tasarımınız için birim testlerinden alabileceğiniz geri bildirimler paha biçilmezdir. Bir tasarımın içgüdüsel olarak hissetmesi ve bütünleşik testlere güvenmesi de bir hata olabilir.


Bu makaleyi gerçekten anlamadım. Yani birçok kod yolu var ve entegrasyon testleri hepsini kapsayamıyor ... öyleyse? Aynı şey, üniteleriniz anlamsız olduğu kadar önemsiz olmadığı sürece, ünite testleri için de geçerlidir.
Casey,

Bu, bir ton birim test yazmanız ve entegrasyon testlerinden kaçınmanız gerektiğinden, kod kapsamına sabitlenmeye karşı bir argüman gibi.
Casey,

1

Kodunuzu değiştirmek veya yeniden düzenlemek zorunda kalmayı beklemiyorsanız, birim testlerinin yapılması esastır. Birim testleri, yalnızca kod yazıldığı sırada hataları göstermek için değil, daha fazla kod yazıldığında yeni hataların ortaya çıktığını göstermek için de vardır.

Evet, önce entegrasyonunuzu ve ünite testlerinizi yazmak daha iyidir, ancak daha sonra yazılsalar bile onlara sahip olmak için çok fazla değeriniz vardır.


3
Davayı yaptığını sanmıyorum. Entegrasyon testleri ayrıca koddaki hataları ortaya çıkarır ve aslında birim testlerinin yapamayacağı hataları yakalayabilir.
Casey,
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.