Bazı insanlar entegrasyon testlerinin her türlü kötü ve yanlış olduğunu iddia eder - her şey ünite testinden geçirilmelidir, bu da bağımlılıklarla alay etmeniz gerektiği anlamına gelir; Çeşitli sebeplerden dolayı her zaman düşkün olmadığım bir seçenek.
Bazı durumlarda, bir birim testinin hiçbir şeyi kanıtlamadığını biliyorum.
Aşağıdaki (önemsiz, saf) depo uygulamasını (PHP'de) örnek olarak alalım:
class ProductRepository
{
private $db;
public function __construct(ConnectionInterface $db) {
$this->db = $db;
}
public function findByKeyword($keyword) {
// this might have a query builder, keyword processing, etc. - this is
// a totally naive example just to illustrate the DB dependency, mkay?
return $this->db->fetch("SELECT * FROM products p"
. " WHERE p.name LIKE :keyword", ['keyword' => $keyword]);
}
}
Diyelim ki bu havuzun, belirli anahtar kelimelere uyan ürünleri bulabildiğini kanıtlamak istiyorum.
Gerçek bir bağlantı nesnesiyle yapılan entegrasyon testinden kısacası, bunun gerçekten gerçek sorgular oluşturduğunu nasıl bilebilirim - ve bu sorgular gerçekte yaptıklarımı gerçekten yapar.
Bağlantı nesnesini bir birim testinde alay etmek zorunda kalırsam, yalnızca "beklenen sorguyu oluşturur" gibi şeyleri kanıtlayabilirim - ancak bu gerçekten işe yarayacağı anlamına gelmez ... yani, belki sorguyu oluşturuyor demektir. Beklerdim ama belki bu sorgu düşündüğüm şeyi yapmaz.
Başka bir deyişle, oluşturulan sorgu hakkında iddialarda bulunan, aslında değer içermeyen bir test gibi hissediyorum, çünkü findByKeyword()
yöntemin nasıl uygulandığını test ediyor , ancak bu gerçekten işe yaradığını kanıtlamıyor .
Bu sorun havuzlar veya veri tabanı entegrasyonu ile sınırlı değildir - birçok durumda, bir sahte kullanım (test-double) kullanımıyla ilgili iddialarda bulunup bulunmadıklarını, sadece işlerin nasıl uygulandığını ispatladığını kanıtladığı durumlarda geçerlidir. aslında işe yarıyor.
Bu gibi durumlarla nasıl başa çıkıyorsunuz?
Böyle bir durumda entegrasyon testleri gerçekten "kötü" mü?
Bir şeyi test etmenin daha iyi olduğu fikrine kapılıyorum ve ayrıca entegrasyon testlerinin neden hepsi test edilemeyen sayısız kod yollarına neden olduğunu da anlıyorum - ancak tek amacı bir hizmet durumunda (depo gibi) başka bir bileşenle etkileşime geçmek için, entegrasyon testi olmadan bir şeyi gerçekten nasıl test edebilirsiniz?