Sınıfımı birim test ettim, şimdi bir entegrasyon testine nasıl başlayabilirim?


19

MailChimpRecipient adlı bir MailChimp listesinde alıcıları yöneten bir sınıf yazdım. Üçüncü taraf bir API sarıcı olan MCAPI sınıfını kullanır.

http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/

MCAPI nesnesini MailChimpRecipient nesnesinin yapıcısına iletiyorum, bu yüzden kendi sınıfımdaki tüm mantığı test eden PHPUnit kullanarak birim testleri yazdım (MCAPI sınıfını test etmiyorum). % 100 kod kapsamına sahibim ve tüm testler başarılı. Bu, MCAPI nesnesini alay ederek ve saplayarak yapılır.

Bir sonraki adımım da gerçek bir MCPI nesnesi kullanarak MailChimpRecipient fikstürünü gerçek bir MailChimp listesi kullanmak üzere ayarlanmış PHPUnit kullanarak bir entegrasyon testi yazmaktı.

Ben temelde testleri nesnenin genel arayüzü agains testleri yürüten bir entegrasyon testi olduğunu düşünüyorum yazdım:

public function testAddedRecipientCanBeFound()
{
    $emailAddress = 'fred@fredsdomain.com';
    $forename = 'Fred';
    $surname = 'Smith';

    // First, delete the email address if it is already on the list
    $oldRecipient = $this->createRecipient();
    if($oldRecipient->find($emailAddress))
    {
        $oldRecipient->delete();
    }
    unset($oldRecipient);

    // Add the recipient using the test data
    $newRecipient = $this->createRecipient();
    $newRecipient->setForename($forename);
    $newRecipient->setSurname($surname);
    $newRecipient->setEmailAddress($emailAddress);
    $newRecipient->add();
    unset($newRecipient);

    // Assert that the recipient can be found using the same email address
    $this->assertTrue($this->_recipient->find($emailAddress));
}

"Entegrasyon" testi, sınıfın iç bileşenlerini test etmez; yalnızca gerçek bir MCAPI nesnesi verildiğinde, reklamı yapılan gibi davranmasını sağlar.

Bu doğru mu? Bir ara testi yapmanın en iyi yolu bu mu? Sonuçta, iç üniteler bir birim testi ile test edildi. Entegrasyon testinin, davranışının tanıtıldığı şekilde, gerçekten işe yarayıp yaramadığını test etmek için orada olduğunu düşünmekte haklı mıyım?

Bir adım daha ileri götürmek için MailChimpRecipient sınıfı, diğer sınıflar tarafından da uygulanacak bir arabirim uygular. Fikir, farklı posta listesi sağlayıcıları kullanıyor olsa da, hepsi aynı şeyi yapan farklı posta listesi alıcı nesneleri kodumu iletmek için bir fabrika kullanmaktır. Entegrasyon testlerim bu arayüzü test ettiğinden, arayüzü uygulayan tüm sınıflar için kullanmaya ne dersiniz? Sonra, gelecekte, birbirinin yerine kullanılacak yeni bir sınıf tasarlarsam, aynı entegrasyon testini bir projeye eklemeden önce çalıştırabilirim.

Kulağa makul geliyor mu? Birim testleri bir nesnenin içini test eder, entegrasyon testleri onun reklamı yapılan gibi davrandığından emin olur mu?


4
Testinizde çok fazla mantığınız olduğunu düşünüyorum. İddiayı yapana kadar çok kod çalıştırıyorsunuz. Muhtemelen önce bir alıcının silinmesini test etmek istersiniz. Ama bu sorunuza cevap vermiyor, sadece bir yorum.
hakre

1
Peki setUp, testlerinizi yürütmek için gerekçe oluşturmak için bu işlevi kullanmalısınız . Giriş tanımsızsa, gerçekten test edemezsiniz. Girdinin kesin, katı ve her zaman aynı olması gerekir. Bir testin ön koşulu karşılanmazsa, bunun yerine testi atlayın. Daha sonra neden atladığını ve ek testler eklemeniz gerekip gerekmediğini ve / veya setUpdoğru yapılmadığını analiz edin .
hakre

1
Ayrıca, muhtemelen bir testin içindeki test kod değerlerini sabitlemeyin, ancak bu sınıf üyelerini testler arasında paylaşılabilir (ve merkezi bir yerde değiştirilebilir) veya kullanabilir DataProvider(bir teste parametre olarak girdi sunan bir işlevdir).
hakre

1
Test fonksiyonunuzun üzerinde çalıştığı her şeyin anlamını girin. Bir alıcı eklemeyi test ederken ve zaten mevcut olmadığından emin olmak istediğinizde, en azından devreye girmesi durumunda silme işlemini onaylamanız gerekir. Aksi takdirde, testinizin ön koşulunun test edilebilir olduğundan emin olmazsınız.
hakre

1
İyi soru için +1, ancak aynı zamanda Programcılara taşınmaya oy verdi. Test stratejileriyle ilgili soruların ait olduğu yer burası
GordonM

Yanıtlar:


17

Kodunuzu test ederken üç alana dikkat etmelisiniz:

  • Senaryo testi
  • Fonksiyonel test
  • Birim testi

Normalde her kategoride yaptığınız test miktarı bir piramit şeklindedir, yani altta çok sayıda birim testi, ortada bazı fonksiyonel testler ve sadece birkaç senaryo testi olacaktır.

Bir birim testi ile test altındaki sınıfın kullandığı her şeyi alay edersiniz ve onu saf izolasyonda test edersiniz (bu nedenle, test sırasında değiştirilebilecek şekilde tüm bağımlılıkları enjeksiyonla aldığınızdan emin olmanız önemlidir).

Birim testi ile tüm olasılıkları test edersiniz, böylece sadece 'mutlu yol' değil, aynı zamanda tüm hata koşulları da test edilir.

Tüm birimlerinizin tek başına çalıştığından tamamen eminseniz, birimlerin birleştirildiğinde de çalıştığından emin olmak için birkaç test (fonksiyonel test) yazarsınız. Ardından, tüm fonksiyonel modüller arasındaki kabloları test eden bir senaryo testi yazıyorsunuz.

Örneğin, bir arabayı test ettiğinizi varsayalım.

Tüm arabayı monte edebilir ve bir sürücü olarak olası her durumu kontrol edebilirsiniz, ancak bu gerçekten zor olurdu.

Bunun yerine, motorun küçük bir bölümünü tüm olasılıklarla test edersiniz (birim testi)

Sonra işlevsel bir test olacak tüm motoru (arabadan ayrı) test edersiniz.

Son bir test olarak, anahtarınızı sokar, arabayı çalıştırır ve otoparka götürürsünüz. Eğer bu işe yarıyorsa, tüm parçaların (akü, yakıt, motor, ..) bağlandığını biliyorsunuz ve onları tek tek test ettiğinizden beri, tüm arabanın doğru çalıştığından emin olabilirsiniz.

Bu durumda, tüm hata koşullarını ve ünite testinizdeki mutlu yolu test ettiniz ve kablolamanın doğru olup olmadığını kontrol etmek için sadece 'gerçek bileşenler' ile uçtan uca bir test yapmanız gerektiğini biliyorsunuz.

Birkaç nokta daha,

  • Birim testinizde koşullu mantıktan kaçının. Temizlemeniz gerekiyorsa, bir çeşit küresel devlet kullanmanız ve testler aniden birbirinizi etkileyebilir.
  • Testle ilgili olmayan hiçbir veri belirtmeyin. Soyadını veya soyadını değiştirirsem test başarısız olur mu? Muhtemelen önemli olan e-posta adresi olduğu için değil, testinizde açıkça belirttiğiniz için emin olamıyorum. Test verilerinizi oluşturmak ve gerçekten önemli olanı açık hale getirmek için Oluşturucu Modeline bakmayı deneyin.

Teşekkürler, bu düşündüğüm bir çok şeyi doğrular. Sadece açıklığa kavuşturmak için - bu bir birim test DEĞİLDİR. Zaten nesneyi tamamen izole eden ve nesnenin% 100 kod kapsamına sahip olan bir birim testi yazdım. Bu, ona gerçek bir MCAPI nesnesi enjekte ettiğimde çalıştığından emin olmak için bir entegrasyon testi olması gerekiyordu. Sadece listeye eklenen alıcıları silmem gerekiyor - tüm temizlik bu ve testlerin hiçbirinin birbirini etkilememesini sağlamak için uygulandı. Bunun yerine ne önerirsiniz?

1
Evet! Ünite testlerini zaten yaptığını anladım. MCAPI nesnesi alıcıları takip ediyor mu ve yapmanız gereken temizleme işlemi mi? Üçüncü tarafların sorunu ise, entegrasyon testinde yapabileceğiniz hiçbir şey yoktur. Diğer listeyi takip ediyorsanız, testlerin birbirini etkilemediğinden emin olmak için küresel verilerden (ve tektonlardan) kaçındığınızdan emin olmalısınız. Mükemmel bir dünyada, bir test başladığında / bittiğinde işleri temizler, bir tasarım kusuruna işaret eder, ancak gerçek dünyada her zaman bundan kaçınamazsınız.
Wouter de Kort

1
Senaryo testi muhtemelen PHPUnit için uygun bir şey olmadığını ekleyebilirim. Yu, Selenium gibi bir tarayıcıda çalıştırabileceğiniz bir araca veya jMeter gibi bir tarayıcıyı simüle edebilen bir araca bakmak isteyebilir.
GordonM

Teşekkürler beyler! İyi test edilebilir kod yazma konusunda öğrenilecek çok şey var, değil mi? Kendime bu kitabın bir kopyasını sipariş ettim: amazon.co.uk/… . Umarım, hepiniz söyledikleriniz bunu okuduktan sonra biraz daha mantıklı olacaktır. @Wouter, testin bir e-posta adresinin listeye eklenmesine neden olacağından yalnızca bir alıcıyı siliyorum. Listenin bu testten etkilenmemesi için siliyorum.

1
@LewisBassett Hiç Php Geliştirici değilim ama xUnit Testi desenleri ( amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054 ) kesinlikle iyi bir okuma olduğunu. Ayrıca misko.hevery.com/code-reviewers-guide'daki makaleler gerçekten ilginç.
Wouter de Kort
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.