Farklı test yöntemleri
İlk önce ne yaptığınızı tanımlayın: Birim testi veya entegrasyon testi . Büyük olasılıkla yalnızca bir sınıfı test ettiğiniz için katman sayısı ünite testi için önemli değildir. Gerisini alay ettin. Entegrasyon testi için çoklu katmanları test etmeniz kaçınılmazdır. Yerinde iyi bir birim testiniz varsa, hile entegrasyon testlerini çok karmaşık yapmamaktır.
Ünite testleriniz iyi ise, entegrasyon testi yaparken tüm detayları test etmek zorunda kalmazsınız.
Kullandığımız terimler, bunlar biraz platforma bağımlı, ancak bunları neredeyse tüm test / geliştirme platformlarında bulabilirsiniz:
Örnek uygulama
Kullandığınız teknolojiye bağlı olarak isimleri farklı olabilir, ancak bunu örnek olarak kullanacağım:
Model Product, ProductsController ve ürünlerle birlikte bir HTML tablosu oluşturan bir dizin görünümüne sahip basit bir CRUD uygulamanız varsa:
Uygulamanın sonucu, aktif olan tüm ürünlerin bir listesini içeren bir HTML tablosu gösteriliyor.
Birim testi
model
Model kolayca test edebilirsiniz. Bunun için farklı yöntemler var; demirbaş kullanıyoruz. Bence buna "sahte veri setleri" diyorsun. Böylece her test çalıştırılmadan önce, tabloyu yaratır ve orijinal verileri koyarız. Çoğu platformun bunun için yöntemleri var. Örneğin, test sınıfınızda, her testten önce çalıştırılan bir setUp () yöntemi.
Daha sonra testimizi yapıyoruz, örneğin: testGetAllActive products.
Bu yüzden doğrudan bir test veritabanına test ediyoruz. Veri kaynağını alamıyoruz; Her zaman aynı yaparız. Bu, örneğin veritabanının yeni bir versiyonuyla test etmemize olanak tanır ve herhangi bir sorgu sorunu ortaya çıkacaktır.
Gerçek dünyada her zaman% 100 tek sorumluluk izleyemezsin . Bunu daha iyi yapmak istiyorsanız, alay ettiğiniz bir veri kaynağını kullanabilirsiniz. Zaten var olan teknolojiyi test etmek gibi hissettiren bizim için (ORM kullanıyoruz). Ayrıca testler çok daha karmaşık hale gelir ve sorguları gerçekten test etmezler. Bu yüzden böyle tutarız.
Sabit kodlanmış veriler, fikstürlerde ayrı olarak saklanır. Yani fikstür bir create table deyimi ve kullandığımız kayıtlar için ekler içeren bir SQL dosyası gibidir. Çok fazla kayıtla test etme gereği duymadıkça onları küçük tutuyoruz.
class ProductModel {
public function getAllActive() {
return $this->find('all', array('conditions' => array('active' => 1)));
}
}
kontrolör
Denetleyicinin daha fazla çalışmaya ihtiyacı var çünkü modeli test etmek istemiyoruz. Öyleyse yaptığımız şey, modelle dalga geçmek. Bunun anlamı: Testler: kayıt listesini döndürmesi gereken index () yöntemi.
Bu yüzden model metodu getAllActive () ile alay ediyoruz ve içine sabit veri ekliyoruz (örneğin iki kayıt). Şimdi denetleyicinin görünüme gönderdiği verileri test ediyoruz ve bu iki kaydı gerçekten geri alıp almadığımızı karşılaştırıyoruz.
function testProductIndexLoggedIn() {
$this->setLoggedIn();
$this->ProductsController->mock('ProductModel', 'index', function(return array(your records) ));
$result=$this->ProductsController->index();
$this->assertEquals(2, count($result['products']));
}
Bu yeterli. Denetleyiciye çok az işlevsellik eklemeye çalışıyoruz çünkü bu testi zorlaştırıyor. Ama elbette içinde her zaman bir kod var. Örneğin, aşağıdakiler gibi gereksinimleri test ediyoruz: Bu iki kaydı yalnızca oturum açtıysanız gösterin.
Bu nedenle, kontrol cihazının normal olarak bir sahte ve küçük bir parça kodlanmış verilere ihtiyacı vardır. Bir giriş sistemi için belki başka bir tane. Testimizde bunun için yardımcı bir yöntemimiz var: setLoggedIn (). Bu, giriş yaparak veya giriş yapmadan test etmeyi kolaylaştırır.
class ProductsController {
public function index() {
if($this->loggedIn()) {
$this->set('products', $this->ProductModel->getAllActive());
}
}
}
Görünümler
Görüntüleme testi zor. İlk önce tekrarlayan mantığı ayırıyoruz. Yardımcılara koyduk ve sıkı bir şekilde bu sınıfları test ettik. Hep aynı çıktıyı bekliyoruz. Örneğin, geneHtmlTableFromArray ().
O zaman projeye özel görüşlerimiz var. Bunları test etmiyoruz. Bunları test etmek gerçekten istenmiyor. Onları entegrasyon testleri için saklıyoruz. Çünkü kodların çoğunu görüşlere dönüştürdüğümüz için burada daha düşük bir risk var.
Bunları test etmeye başlarsanız, muhtemelen çoğu projeniz için kullanışlı olmayan bir HTML parçasını değiştirdiğinizde testlerinizi değiştirmeniz gerekir.
echo $this->tableHelper->generateHtmlTableFromArray($products);
Entegrasyon testi
Platformunuza bağlı olarak, burada kullanıcı hikayeleri vb. İle çalışabilirsiniz. Selenyum veya diğer benzer çözümler gibi web tabanlı olabilir .
Genel olarak veri tabanını sadece demirbaşlar ile yüklüyoruz ve hangi verinin mevcut olması gerektiğini iddia ediyoruz. Tam entegrasyon testi için genellikle çok genel şartlar kullanıyoruz. Yani: Ürünü aktif olarak ayarlayın ve ardından ürünün kullanılabilir olup olmadığını kontrol edin.
Doğru alanların mevcut olup olmadığı gibi her şeyi bir daha test etmiyoruz. Burada daha büyük gereksinimleri test ediyoruz. Çünkü testlerimizi denetleyiciden veya görünümden çoğaltmak istemiyoruz. Bir şey uygulamanızın gerçekten önemli bir parçasıysa veya güvenlik nedenleriyle (parola mevcut DEĞİLDİR) ise, doğru olduğundan emin olmak için bunları ekleriz.
Sabit kodlanmış veriler armatürlerde saklanır.
function testIntegrationProductIndexLoggedIn() {
$this->setLoggedIn();
$result=$this->request('products/index');
$expected='<table';
$this->assertContains($expected, $result);
// Some content from the fixture record
$expected='<td>Product 1 name</td>';
$this->assertContains($expected, $result);
}