Birim, fonksiyonel, kabul ve entegrasyon testleri arasındaki fark nedir? [kapalı]


799

Birim, işlevsel, kabul ve entegrasyon testi (ve bahsetmediğim diğer test türleri) arasındaki fark nedir?



1
Sanırım yük testi eklemeyi unuttun!
Konuşma Ucuz Bana kodu göster

Yanıtlar:


1350

Nereye baktığınıza bağlı olarak, biraz farklı cevaplar alırsınız. Konu hakkında çok şey okudum ve işte benim damıtmam; yine, bunlar biraz yünlü ve diğerleri aynı fikirde olmayabilir.

Birim Testleri

Genellikle bir yöntem / işlev olan en küçük işlevsellik birimini test eder (örneğin, belirli bir duruma sahip bir sınıf verildiğinde, sınıfta x yönteminin çağrılması y'nin gerçekleşmesine neden olmalıdır). Birim testleri belirli bir özelliğe odaklanmalıdır (örneğin, yığın boşken pop yöntemini çağırmak bir atmalıdır InvalidOperationException). Dokunduğu her şey bellekte yapılmalıdır; bu, test kodunun ve test edilen kodun:

  • (Önemsiz) ortak çalışanlara çağrı yapın
  • Ağa erişin
  • Bir veritabanına basın
  • Dosya sistemini kullanın
  • Bir iş parçacığını döndür
  • vb.

Yavaş / anlaşılması / başlatılması / manipüle edilmesi zor olan her türlü bağımlılık, uygun teknikler kullanılarak kesilmeli / alay edilmeli / ne olursa olsun, bağımlılıklarının ne yaptığına değil, kod biriminin ne yaptığına odaklanabilirsiniz.

Kısacası, birim testleri olabildiğince basit, hata ayıklaması kolay, güvenilir (azaltılmış dış etkenler nedeniyle), hızlı bir şekilde yürütülür ve programınızın en küçük yapı taşlarının bir araya getirilmeden önce istendiği gibi çalıştığını kanıtlamaya yardımcı olur. Uyarı, tek başına mükemmel bir şekilde çalıştıklarını kanıtlayabilmenize rağmen, kod birimleri birleştiğinde patlayabilir ve bu da bizi ...

Entegrasyon Testleri

Entegrasyon testleri, kod birimlerini birleştirerek ve ortaya çıkan kombinasyonun doğru çalışıp çalışmadığını test ederek birim testleri üzerine kuruludur. Bu, bir sistemin iç kısımları olabilir veya yararlı bir şey yapmak için birden fazla sistemi bir araya getirebilir. Ayrıca, entegrasyon testlerini birim testlerden ayıran başka bir şey de ortamdır. Entegrasyon testleri, tüm kodların ve farklı ortam değişikliklerinin doğru bir şekilde çalışmasını sağlamak için iş parçacıkları kullanabilir, veritabanına erişebilir veya gereken her şeyi yapabilir .

Biraz serileştirme kodu oluşturduysanız ve ünite, disklerini diske dokunmadan test ettiyseniz, yükleme ve diske kaydettiğinizde çalışacağını nasıl anlarsınız? Belki de akarsuları yıkayıp atmayı unuttun. Belki dosya izinleriniz yanlış ve bellek akışlarında kullanarak doğası test ettiniz. Kesin olarak öğrenmenin tek yolu, üretime en yakın ortamı kullanarak 'gerçek için' test etmektir.

Ana avantajı, birim testlerinin kablolama hataları (örneğin, A sınıfı bir örnek beklenmedik bir şekilde B boş bir örneği alır) ve ortam hataları (tek CPU makinemde iyi çalışır, ancak benim meslektaşının 4 çekirdekli makinesi testleri geçemez). Ana dezavantaj, entegrasyon testlerinin daha fazla koda dokunması, daha az güvenilir olması, arızaların teşhis edilmesinin ve testlerin sürdürülmesinin daha zor olmasıdır.

Ayrıca, entegrasyon testleri, tam bir özelliğin çalıştığını kanıtlamak zorunda değildir. Kullanıcı programlarımın iç detaylarını umursamayabilir, ama ben!

Fonksiyonel Testler

Fonksiyonel testler, belirli bir girişin sonuçlarını spesifikasyonla karşılaştırarak belirli bir özelliği doğruluğunu kontrol eder. İşlevsel testler, ara sonuçlar veya yan etkilerle kendilerini ilgilendirmez, sadece sonuç (x'i yaptıktan sonra y nesnesinin z durumuna sahip olması umurumda değildir). Bunlar, "Kare (x) işlevinin 2 döndürme 4 bağımsız değişkeniyle çağrılması" gibi belirtimin bir kısmını test etmek için yazılmıştır.

Kabul testleri

Kabul testi iki türe ayrılmıştır:

Standart kabul testi, uygulamanın işlevselliğinin teknik özellikleri karşılayıp karşılamadığını görmek için tüm sistemde testler yapılmasını içerir (örn. Web sayfanızı bir web tarayıcısı aracılığıyla kullanma). Örneğin, bir yakınlaştırma simgesine tıklamak belge görünümünü% 25 büyütmelidir. " Sonuçların gerçek bir sürekliliği yoktur, sadece başarılı veya başarısız bir sonuç vardır.

Avantajı, testlerin basit İngilizce olarak tanımlanması ve yazılımın bir bütün olarak özelliklerin eksiksiz olmasını sağlar. Dezavantajı ise test piramidinde bir seviye daha ilerletmiş olmanızdır. Kabul testleri kod dağlarına dokunur, bu nedenle bir arızayı izlemek zor olabilir.

Ayrıca, çevik yazılım geliştirmede, kullanıcı kabul testi, geliştirme sırasında yazılım müşterisi tarafından / müşterisi için oluşturulan kullanıcı hikayelerini yansıtmak için testler oluşturulmasını içerir. Testler başarılı olursa, yazılımın müşterinin gereksinimlerini karşılaması gerektiği ve hikayelerin tamamlandığı düşünülebilir. Kabul sınama paketi, temel olarak, sistem kullanıcıları tarafından kullanılan dilde sınamaları tanımlayan, etki alanına özgü bir dilde yazılmış yürütülebilir bir belirtimdir.

Sonuç

Hepsi tamamlayıcı. Bazen bir türe odaklanmak veya tamamen kaçınmak avantajlıdır. Benim için temel fark, bazı testlerin bir şeye programcının bakış açısıyla bakması, diğerlerinin ise müşteri / son kullanıcı odağı kullanmasıdır.


19
+1. @Mark Simpson İşlevsel ve kabul testleri "sistem testi" olarak özetlenebilir mi? Uçtan uca testler nereye uyuyor? (zevkime göre çok farklı kelime haznesi)
Torsten Engelbrecht

3
@Franz Kod birimlerini izole ederek ve test ederek riski azaltabileceğiniz yetenek ve kolaylıktan bahsettim . Haklısın, kullandığım dil biraz gevşekti, çünkü testler kodun hatasız olduğunu kanıtlayamıyor.
Mark Simpson

15
Oylamalara rağmen, bu tamamen yanlış. Birim testleri "önemsiz" ortak çalışanları bile test etmez; enjekte edilen herhangi bir bağımlılık alay edilmelidir. Fonksiyonel testler "davranışı" test etmez; sadece "işlevi" test ederler, yani "f (A) B'yi döndürür". Yan etkiler önemliyse, "davranışsal" dır. Bunlar sistem çağrılarını içeriyorsa, "davranışsal sistem testleri" nde olduğu gibi "sistem" testleridir. (Aşağıdaki testerab'a bakınız.) "Kabul" testleri, tam yığını kapsayan "davranışsal sistem testleri" nin bir alt kümesidir. "Entegrasyon", gerçek kullanımı simüle ederek yukarı doğru test eder; tüm bağımlılıkların pratikte entegre edilebileceğini test eder.
cdunn2001

7
@ cdunn2001: Endişelenme, yapıcı eleştiri her zaman iyidir :) Yorumun bana bilmediğim birkaç şeyi öğretti ve terminolojimi biraz temizledi. Test etmeye hevesli geliştiricilerden her zaman yeni şeyler öğrenmeye hevesliyim. Miško Hevery'nin blogunu ilk keşfettiğimi hatırlıyorum - bir hazine sandığı gibiydi :)
Mark Simpson

11
@MarkSimpson Her ne kadar cevabınız çok iyi olsa da fonksiyonel testlerle ilgili biraz daha detay istiyorum. Yani cevabınızda, benim için fonksiyonel testler ile birim testleri arasında ayrım yapmak zor. Umarım bunun için zamanınız vardır, harika çalışmaya devam edin!
Andrei Sandulescu

90

Önemli olan, bu terimlerin meslektaşlarınız için ne anlama geldiğini bilmenizdir. Farklı gruplar, örneğin "tam uçtan uca" testleri derken neyi kastettiklerini biraz farklı tanımlarlar.

Son zamanlarda testleri için Google'ın adlandırma sistemine rastladım ve bundan hoşlanıyorum - sadece Küçük, Orta ve Büyük kullanarak argümanları atlıyorlar. Bir testin hangi kategoriye uyduğuna karar vermek için birkaç faktöre bakarlar - çalışması ne kadar sürer, ağa, veritabanına, dosya sistemine, harici sistemlere vb.

http://googletesting.blogspot.com/2010/12/test-sizes.html

Mevcut iş yeriniz için Küçük, Orta ve Büyük arasındaki farkın Google'ınkinden farklı olabileceğini hayal ediyorum.

Ancak, bu sadece kapsamla ilgili değil, amaçla da ilgilidir. Mark'ın testler için farklı bakış açıları, örneğin programcı ve müşteri / son kullanıcı gibi noktaları gerçekten önemlidir.


6
Çeşitli kuruluşların / kişilerin testler için neden farklı tanımlara sahip olduğu konusunda biraz perspektif kazandırmaya yardımcı olduğu için Google test adlandırma öğesi için +1.
Mark Simpson

Bu aynı zamanda neden farklı test seviyeleri kullandığınız ve bunlardan ne elde ettiğinizle ilgili çok güzel bir makaledir: kentcdodds.com/blog/unit-vs-integration-vs-e2e-tests
testerab

63

http://martinfowler.com/articles/microservice-testing/

Martin Fowler'in blog yazısı, kodu test etme stratejilerinden bahseder (Özellikle bir mikro hizmetler mimarisinde), ancak çoğu herhangi bir uygulama için geçerlidir.

Özet slaytından alıntı yapacağım:

  • Birim testleri - beklendiği gibi davranıp davranmadıklarını belirlemek için uygulamadaki en küçük test edilebilir yazılım parçalarını kullanın.
  • Entegrasyon testleri - arayüz hatalarını tespit etmek için bileşenler arasındaki iletişim yollarını ve etkileşimleri doğrulayın.
  • Bileşen testleri - kullanılan yazılımın kapsamını test edilen sistemin bir bölümü ile sınırlayın, sistemi dahili kod arabirimleri aracılığıyla manipüle edin ve test edilen kodu diğer bileşenlerden izole etmek için test çiftlerini kullanın.
  • Sözleşme testleri - harici bir hizmetin sınırındaki etkileşimleri, tüketen bir hizmetin beklediği sözleşmeyi karşıladığını iddia ederek doğrulayın.
  • Uçtan Uca testler - bir sistemin harici gereksinimleri karşıladığını ve hedeflerine ulaştığını ve tüm sistemi uçtan uca test ettiğini doğrulayın.

Bu arada harika bir makale. Ancak sözleşme testinin ne için olduğunu tam olarak anlamıyorum. Bileşen ve entegrasyon testleri ışığında gereksiz değiller mi?
wheleph

Bazı dillerde (Bay Fowler'ın kullandığı), örneğin void IMyInterface.MyMethod () gibi bir sınıfın standart tanımını kullanırken açıkta olmayan bir arabirim uygulayabilirsiniz. Hangi sırayla kendi testleri var. O noktada BDD'ye geri dönüyorsunuz .. Hangi ironik olarak Bay Fowler'in de bir toprak kapması var.
Skarsnik

2
Fowler makalesi btw değil, sadece orada gönderildi. Sözleşme testleri, müşteriler hizmetinizi kullanmaya başladıktan sonra yapılan testlerdir, daha sonra söz konusu müşteriler için bir şey kırmadığınızı, yani hizmet API'sini değiştirip değiştirmediğinizi kontrol eden testler yazarsınız.
Rafał Łużyński

@wheleph birimi, entegrasyon ve bileşen testleri çoğunlukla geliştirici tarafından yoğun şekilde kontrol edilebilen yazılım içselleri için konuşur. İlk üçteki bir sorun, sorunu çözmek için kaynağınızı değiştirmek anlamına gelir. - Sözleşme testleri işlevsellikte size vaat edilenlere değinir, ancak doğrudan kusur karşısında değişiklik yapamayabilirsiniz. Bu, yalnızca sorunu düzeltmek yerine bu olası sorunların çözümü için destek kodu eklemeyi gerektirir. - Yani sözleşme şartnamesi belirli bir yapıda olduğunu söyledi bile size geri biçimlendirilmiş json vererek bir web hizmeti etrafında çalışacaktı.
Yemi Bedu

31

Birim Testi - Adından da anlaşılacağı gibi, bu yöntem nesne düzeyinde test eder. Bağımsız yazılım bileşenleri herhangi bir hata açısından test edilir. Bu test için program bilgisi gereklidir ve yazılımın amaçlandığı gibi davranıp davranmadığını kontrol etmek için test kodları oluşturulur.

Fonksiyonel Test - Sistemin dahili çalışması hakkında bilgi sahibi olmadan gerçekleştirilir. Test cihazı, farklı girişler sağlayarak ve üretilen çıkışları test ederek sistemi sadece gereksinimleri takip ederek kullanmaya çalışacaktır. Bu test, kapalı kutu testi veya kara kutu olarak da bilinir.

Kabul Testi - Yazılım istemciye teslim edilmeden önce yapılan son testtir. Geliştirilen yazılımın tüm müşteri gereksinimlerini karşıladığından emin olmak için gerçekleştirilir. İki tür kabul testi vardır - biri geliştirme ekibi üyeleri tarafından gerçekleştirilen, iç kabul testi (Alfa testi) olarak bilinen ve diğeri (Beta testi) olarak bilinen müşteri veya son kullanıcı tarafından gerçekleştirilen

Entegrasyon Testi - Ünite testine tabi tutulmuş bağımsız modüller birbirleriyle entegre edilmiştir. Genellikle iki yaklaşım takip edilir:

1)
Yukarıdan Aşağıya 2) Aşağıdan Yukarıya


Yukarıdan aşağıya ve aşağıdan yukarıya ne demek istiyorsun? Entegrasyon testi uçtan uca test ile aynı mıdır?
tamj0rd2

18

Bu çok basit.

  1. Birim testi: Bu aslında kodlama bilgisine sahip geliştiriciler tarafından yapılan testtir. Bu test kodlama aşamasında yapılır ve beyaz kutu testinin bir parçasıdır. Bir yazılım geliştirme için geldiğinde, kod parçası veya birim olarak bilinen kod dilimlerine dönüştürülür. Ve bu birimlerin tek tek test edilmesi, geliştiriciler tarafından ifade kapsamı eksikliği gibi bir tür insan hatasını bulmak için yapılan birim testi olarak adlandırılır.

  2. Fonksiyonel test: Bu test test (QA) aşamasında yapılır ve kara kutu testinin bir parçasıdır. Daha önce yazılmış test senaryolarının fiili yürütülmesi. Bu test aslında test kullanıcıları tarafından yapılır, sitedeki herhangi bir işlevin gerçek sonucunu bulur ve bu sonucu beklenen sonuçla karşılaştırır. Eğer herhangi bir eşitsizlik bulmuşlarsa, bu bir hatadır.

  3. Kabul testi: UAT olarak bilinir. Ve bu aslında test edicinin yanı sıra geliştiriciler, yönetim ekibi, yazar, yazarlar ve bu projeye katılan herkes tarafından yapılır. Projenin sonunda hatalar olmadan teslim edilmeye hazır olmasını sağlamak.

  4. Entegrasyon testi: Kod birimleri (1. maddede açıklanmıştır) projeyi tamamlamak için birbiriyle entegre edilmiştir. Bu kod birimleri farklı kodlama teknolojisinde yazılabilir veya bunlar farklı sürümlerde olabilir, bu nedenle kodun tüm birimlerinin diğerleriyle uyumlu olmasını ve herhangi bir entegrasyon sorunu bulunmamasını sağlamak için bu test geliştiriciler tarafından yapılır.


1
@OlegTsyba cevap soruya cevap verildikten 4 yıl sonra geldi.
bentesha

1
Asla "Bu çok basit" ile bir cevap başlatmamalıyız, özellikle de bu gibi karmaşık bir konuysa.
milosm

6

Test kodunda yeniyim. Birim testleri çoğunlukla zaman kaybı gibi görünüyor. Birim testi yaptığımı sanıyordum ama entegrasyon testi yapıyordum ve sonra birim testi hakkında okudum ve saçma görünüyor, belki de çok az deneyime sahip insanlar için? Bir noktayı kaçırmamın bir şansı var.
PixMach

Eğer Birim geniş anlamıyla, o düzgün birim test vardır. Uygulama ayrıntılarını test etmeye karşıyım. Özel bir sınıf "ünite testine tabi tutulmamalıdır". Ancak, birkaç ortak sınıfınız varsa, bir diğerini test ederken bir tane alay etmek isteyebilirsiniz. Gerçek tartışma bu. Mı Birimi (a) tüm kütüphane? (b) kütüphanedeki her bir kamu sınıfı? Veya (c), her sınıftaki herkese açık yöntem? Belirli bir kütüphaneyi entegre bir bileşen olarak test etmeyi, ancak harici bağımlılıkları (sahte ve hızlı olmadıkça) taklit etmeyi veya taklit etmeyi tercih ederim. Sanırım seninleyim.
cdunn2001

1
@PixMach: aslında tam tersi. (İyi) birim testlerinin yapılmaması, gelecekte (veya başka biri) bu kodu değiştirmek zorunda kalırsanız çok fazla zaman harcar. Birim testleri olan ve olmayan kodları koruma konusunda deneyiminiz varsa, farkı bilirsiniz. Fikir, eğer bir birim testi kırılırsa, kodun hangi kısmının sabitlenmesi gerektiğini bilmelisiniz. Büyük ölçekli kabul / entegrasyon testlerinin başarısız olması genellikle size sadece şunu söyler: işe yaramıyor. Ve sonra eski okul hata ayıklama başlamak zorunda ...
Goodsquirrel

@ Goodsquirrel, "birim" olarak adlandırdığınız şeye bağlıdır. İşte sorun bu. Yeniden düzenleme sırasında hatalı testler silinecektir. İyi testler yine de yardımcı olacaktır. Kötü testler değer katmaz ve engel olur. İyi testler kendi kendini belgelendirir ve çok takdir edilir. Spesifik olalım. Başka bir değer True, aksi takdirde bir varsayılan değer bir değer döndürmek için özel bir yöntem var. (Eski kod.) Bu yöntem test edilmeli mi? Hayır diyorum. Başka bir özel yöntem n. Fibonacci sayısını döndürür. Test edilmeli mi? Evet dedim.
cdunn2001

1
En küçük açık kod. Büyük fark.
cdunn2001

5

Bunu pratik bir örnekle açıklayacağım ve teorik bir şey yok:

Bir geliştirici kodu yazar. Henüz bir GUI uygulanmadı. Bu düzeydeki test, işlevlerin doğru çalıştığını ve veri türlerinin doğru olduğunu doğrular. Testin bu aşamasına Birim testi denir.

Bir GUI geliştirildiğinde ve bir test kullanıcısına uygulama atandığında, bir müşteriyle iş gereksinimlerini doğrular ve farklı senaryoları yürütür. Buna fonksiyonel test denir. Burada, istemci gereksinimlerini uygulama akışlarıyla eşleştiriyoruz.

Entegrasyon testi: Diyelim ki uygulamamızın iki modülü var: İK ve Finans. HR modülü daha önce teslim edilmiş ve test edilmiştir. Şimdi Finans geliştirildi ve test edilebilir. Birbirine bağımlı özellikler de mevcut, bu nedenle bu aşamada, ikisi arasındaki iletişim noktalarını test edecek ve gereksinimlerde istendiği gibi çalıştıklarını doğrulayacaksınız.

Regresyon testi, herhangi bir yeni geliştirme veya hata düzeltmesinden sonra yapılan bir başka önemli aşamadır. Amacı, daha önce çalışan fonksiyonları doğrulamaktır.


1
"Bir geliştirici kodu yazıyor. Henüz bir GUI uygulanmadı. Bu düzeydeki test, işlevlerin doğru çalıştığını ve veri türlerinin doğru olduğunu doğrular. Bu test aşamasına Birim testi denir" Bu doğru değil. GUI aslında sadece bir "eklentidir". API çıkışınıza zaten E2E testleri yazabilirsiniz. (veya oluşturduğunuz herhangi bir yanıt nesnesi)
user3790897

4

Birim testi: Bir uygulamadaki bağımsız modüllerin veya bağımsız bileşenlerin testlerinin birim testi olduğu bilinmektedir, birim testi geliştirici tarafından yapılacaktır.

entegrasyon testi: modüller arasındaki iletişim ve veri akışının düzgün çalışıp çalışmadığını doğrulamak için tüm modülleri birleştirmek ve uygulamayı test etmek, bu test geliştiriciler tarafından da gerçekleştirildi.

funcional Test uygulamanın bireysel işlevselliğini kontrol fonksiyonel test için ortalama bir

Kabul testi Bu test, derleme uygulamasının müşteri gereksinimine göre olup olmadığını son kullanıcı veya müşteri tarafından yapılır ve müşteri spesifikasyonu bunun kabul testi olarak bilinir

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.