PHPUnit Test Soru - Nasıl Birim benim sınıf test

3 Cevap php

Ben tanıtır bariz pozitifler için Birim testi içine almak için çalışıyorum, ve ben, diğer gün yazdığı bir sınıf için bir Birim testi yazmak çalışıyorum. (Benimle ayı lütfen bu TDD tersi olduğunu biliyorum)

Benim sınıf, Image, resim işleme için bazıları ile bağlantılı olarak kullanılır.

Image aslında bir GD resim kaynak ve onunla birlikte depolar veri sarar. Örneğin, bir örneği Image her zaman yeni bir genişlik / yükseklik, yani görüntüsünden, orijinal görüntü verileri, vb, mevcut durumu içerecektir

Image sınıfı da, yöntemlerini içerir

  • Bir dosya, dize veri veya URL, örneğin kendini oluşturma $image->loadFromPath()
  • Geçerli Image örneğinin özelliklerinin yeni GD resim kaynak oluşturma, örneğin arka plan saydamlığı, vb korumak için boyutlandırma görüntü için
  • Manipülasyon derslerinde kullanılmak üzere GD resim kaynak Klonlama

Ne ile mücadele ediyorum PHPUnit ile düzgün nasıl Birim test bu sınıftır. Biraz okuma yaptık ve bunu yaklaşım nasıl bir kaç çelişkili fikirler var ve ben neyin doğru olduğunu bilmiyorum. Yaparım,

  1. Write a test for each method of the class. Ben her yöntemi sınamak gerektiğini okumuştum. Eğer bağımlılık zinciri böylece Ancak, bazı yöntemlerin, diğerleri (haklı olarak ben eklemek) çalıştırın. Ama aynı zamanda her Birim test diğer bağımsız olması gerektiğini okudum. Bu durumda eğer Peki ben ne yapmalıyım?
  2. Write each test as a usage route of the class. Ben de her test yerine sınıf ile alabilir 1 yol / kullanım yolu temsil gerektiğini okumuştum. Her kullanımını kapsayacak nedenle, sonuçta tam kod kapsama alırsınız.

Bu nedenle eğer varsa, bu hangi, doğru mu?

3 Cevap

Birim testleri bir sınıfın kamu arayüzleri değerlendirmek için yazılmalıdır. Eğer bu programda kullanılacak niyetinde olarak test case sınıfını kullanmalısınız. Burada fikir, sınıfın behavior (ya da beklenen, beklenmeyen, ya da kenar koşulları) test etmektir.

Deftere Her iki fikir doğru. Teorik olarak, sınıfındaki tüm metodlar çalıştırmak olduğunu yeterince test durumlarını (kodunuzu rotalar) olmalıdır.

Belirtildiği gibi,% 100 test kapsamı her zaman gerçekçi olmayan güzel bir hedeftir, ama.

Ayrıca, GD durumunda, (zaten test edilmiş, bunu tekrar test zaman harcamanıza gerek yok) GD'nin işlevselliğini test birim testleri yazma konusunda dikkatli olun. I read up on phpunit en mocks ve taslakları kullanarak (ve dosya sistemini alaycı) PHPUnit kılavuzda olacaktır.

İşte bir örnek testi gibi görünebilir ne:

public function testImageIsResized()
{
    $image = new Image();
    $image->loadFromPath('some/path');
    $image->resize(200, 300);
    $this->assertEquals(200, $image->getWidth());
    $this->assertEquals(300, $image->getHeight());
}

Şimdi, görüntü sınıfın beklenen davranışa bağlı olarak, bu test sorunu olmadan geçmek olabilir, ya da yeni boyutlar orantılı orijinal görüntü boyutları kısıtlı bekliyordum çünkü başarısız olabilir. Ama biz açıkça testinde kendisi bu sınırlama için denetler iç yöntem çağırmadı.

Stephen Melrose dedi:

However, some of the methods run others (rightly so may I add), so you then have a chain of dependency. But I also read that each Unit test should be independent from the other

Test bağımsızlık hakkında o, bir testin sonucu (ya da sonuç eksikliği) başka sonucunu etkileyip etkilemediği hakkında, iki defa aynı kodu test değil değildir. İlk Test bazı verileri ekler ve daha sonra bu verileri kaldırabilirsiniz önce başarısız olursa, ikinci test beklenenden farklı sonuçlar alabilirsiniz. İdeal rastgele sırayla sınamaları çalıştırmak, ya da bazı ve diğerlerini çalıştırmak mümkün olmalıdır.