Yöntem başına kaç test?
Teorik ve son derece pratik olmayan maksimum, N-Path karmaşıklığıdır (testlerin tümünün kod boyunca farklı yolları kapsadığını varsayın); Asgari BİR! Genel yöntem başına , uygulama ayrıntılarını test etmez, yalnızca bir sınıfın dış davranışlarını test eder (değerleri döndürür ve diğer nesneleri çağırır).
Alıntı yapıyorsun:
* Ve her bir yönteminizi kendi test yöntemiyle (1-1 ilişki içinde) test etme düşüncesi gülünç olacaktır. *
ve sonra sormak:
Öyleyse, her yöntem için bir test oluşturmak 'gülünç' ise, testleri ne için / ne zaman seçtiniz?
Ama bence buradaki yazarı yanlış anladın:
Fikri one test method
başına one method in the class to test
yazarı "gülünç" olarak adlandırdığı şeydir.
(En azından benim için) Mesele 'daha az' değil, 'daha fazla'
Bu yüzden onu anladığım gibi tekrar etmeme izin ver:
Ve her bir yönteminizi SADECE BİR YÖNTEM (1-1 ilişkide kendi test yöntemi) ile test etme düşüncesi gülünç olacaktır.
Teklifinizi tekrar alıntı yapmak için:
Tamamen davranış belirleme ve sınama yazmakla ilgili olmadığını fark ettiğinizde, bakış açınız değişiyor.
Eğer TDD pratik zaman sanmıyorum :
Bir yöntemim var calculateX($a, $b);
ve bu testCalculcateX
yöntem hakkında her şeyi test eden bir test gerekiyor .
TDD'nin size söylediği şey, kodunuzun neyi sevmesi gerektiği hakkında düşünmenizdir :
İki değerden daha büyük olanı hesaplamam gerekiyor ( ilk test durumu! ) Ancak eğer $ a sıfırdan küçükse bir hata üretmeli ( ikinci test durumu! ) Ve $ b sıfırdan küçükse .... Üçüncü test durumu! ) vb.
Davranışları test etmek istiyorsun, bağlam olmadan sadece tek metodları değil.
Bu şekilde kodunuz için bir dokümantasyon olan bir test paketi alırsınız ve GERÇEKTEN ne yapması beklendiğini açıklar, belki de neden :)
Hangi kod için birim testini oluşturduğunuza karar vermeyi nasıl düşünüyorsunuz?
Depoda veya üretimin yakınında herhangi bir yerde biten her şey bir teste ihtiyaç duyar. Alıntılarını yazanın, yukarıda belirtmeye çalıştığım gibi aynı fikirde olmadığını düşünüyorum.
Eğer bir testiniz yoksa kodu değiştirmek zorlaşır (daha pahalı), özellikle de siz değişmediyseniz.
TDD, HER ŞEY için testlere sahip olmanızı sağlamanın bir yoludur, ancak testleri yazdığınız sürece sorun yok. Genellikle onları aynı gün yazmak, daha sonra yapmayacağınız için yardımcı olur, değil mi? :)
Yorumlara cevap:
iyi bir miktarda yöntem belirli bir bağlamda test edilemez, çünkü bunlar ya başka yöntemlere bağımlıdır ya da buna bağlıdır
Bu yöntemlerin arayabileceği üç şey var:
Diğer sınıfların kamu yöntemleri
Diğer sınıflarla alay edebiliriz, böylece orada durumu tanımladık. Bağlamın kontrolü bizde, bu yüzden sorun değil.
* Korunan veya aynı üzerine Özel yöntemler *
Bir sınıfın genel API'sinin bir parçası olmayan hiçbir şey doğrudan doğrudan sınanmaz.
Uygulamayı değil davranışı test etmek istersiniz ve bir sınıf bütün bunları büyük bir kamu yönteminde veya daha küçük korumalı yöntemlerde yaparsa uygulama denir . Testlerinize dokunmadan, bu korunan yöntemleri DEĞİŞTİRMEK isteyebilirsiniz. Çünkü, kodunuzdaki değişiklik davranışını değiştirirse testleriniz bozulur! Testlerin ne için orada, bir şeyi kırdığın zaman söylemek için :)
Aynı sınıftaki genel yöntemler
Bu çok sık olmaz, değil mi? Ve aşağıdaki örnekte olduğu gibi olursa, bununla başa çıkmanın birkaç yolu vardır:
$stuff = new Stuff();
$stuff->setBla(12);
$stuff->setFoo(14);
$stuff->execute();
Belirleyicilerin var olduğu ve execute method imzasının bir parçası olmadığı diğer bir konudur;)
Burada test edebileceğimiz, yanlış değerleri ayarladığımızda işlemlerin patlaması halinde gerçekleşmesidir. Yani setBla
bir dize ayrı test edilebilir geçerken bir istisna atar ama biz bu iki izin verilen değerler (12 & 14) şu bir test durumu daha (herhangi bir nedenle) birlikte çalışarak bilmediğimiz testi istiyorum.
Eğer "iyi" bir test paketi istiyorsanız, php, belki (!) 'De, @covers Stuff::execute
yalnızca bu yöntem için kod kapsamı oluşturduğunuzdan emin olmak için bir açıklama ekleyebilir ve yalnızca kurulumun yapıldığı diğer öğelerin ayrı ayrı test edilmesi gerekir (yine, bunu istiyorsun).
Yani mesele şu ki: Belki önce çevreleyen dünyalardan bazılarını yaratmanız gerekir, ancak genellikle sadece bir veya iki gerçek işlevi kapsayan anlamlı test durumları yazabilmelisiniz (ayarlayıcılar burada sayılmaz). Geri kalan eter alay edilebilir veya önce test edilebilir ve daha sonra güvenilebilir (bakınız @depends
).
* Not: Soru SO'dan taşındı ve başlangıçta PHP / PHPUnit ile ilgiliydi, bu nedenle örnek kod ve referansların php dünyasından kaynaklandığını düşünüyorum, bunun phpunit diğer xUnit'ten çok farklı olmadığı için diğer dillere de uygulanabilir olduğunu düşünüyorum. test çerçeveleri.