Konu açılalı uzun zaman olmuş ama yine de birkaç şey yazmak istedim.
Programlamada "senin yaptığın yanlış", "benim yaptığım doğru" gibi şeyleri pek sevmem, sadece bazı şeyler daha etkilidir, iyidir diyebilirim. Aşağıda yazdıklarımda doğru veya yanlış dediysem bilin ki, daha iyi ya da daha kötü demek istemişimdir
@MURATSPLAT
Öncelikle kötü test edilmiş bir kod/sistem, hiç test edilmemiş olandan her zaman daha iyidir
Burada sen teorik olarak bazı şeyleri karıştırmışsın. Bir yandan unit test yaparken, öbür yandan functional test yapiyorsun.
Birim testlerin özelliği kodun bir birimi (bu birim genelde method veya sınıftır) hiç birşeye ihtiyaç duymadan çalışıp çalışmadığına bakılmasıdır. Birşeylere ihtiyaç duyuyorsa da, bu ihtiyaç duyduğu dış etmenlerin birebir sahte kopyalarını yaratırız. Bu sahte objelere/sistemlere mock deriz.
Mockery'de adı üstünde mock objeleri yaratmamıza yarayan bir araç.
Senin burada yaptığın ise data döndüren method'u mocklayıp, döndürmesi gereken değerleri bir database (SQLite) kullanarak yaratman. Yani önce veritabanını devreden çıkarmak için objeyi mockluyorsun daha sonra veritabanı kullanıp data döndürüyorsun. Bu dataları önce INSERT ile yaratıp daha sonra SELECT ile döndürmek yerine, dataları "new Product" ile yaratıp daha sonra bunları bir "Illuminate\Database\Eloquent\Collection" içine doldurup döndürsen ?
Yani:
// kodu test etmedim
public function getNativeProductModels() {
$collection = new Illuminate\Database\Eloquent\Collection();
for ($i = 0 ;$i< 10000; $i++) {
$product = new Product(['code' => rand(1, 9999999999999999), 'procategory_id' => 1, 'name@1' => 'TranslatedName']);
$collection->add($product);
}
return $collection;
}
Şimdi functional test konusunda birkaç şey söyleyeyim.
Tamamen kişisel olarak, CRUD uygulamalarında unit test yapılmasını pek mantıklı ve gerekli bulmuyorum. Çünkü CRUD uygulamaları daha çok "business logic" dediğimiz işleri yapmakta. Yani CRUD uygulamalarında business logic'in test edilmesi daha önemli diye düşünüyorum. Bu da functional veya behavioral testler ile mümkün oluyor.
Bu CRUD uygulamalarında hiç unit test yapma anlamına gelmiyor. Bozulma ihtimali olan herşeyi test edebilirsin. Mesela; bir sanal posu test etmek için birim test hazırlayabilirsin ve sanal pos sınıfını mocklayabilirsin ve başarılı/başarısız ödeme gibi koşullar altında sistemin o biriminin neler yaptığını gözlemleyebilirsin.
@Roni
Haklısın ama yanıldığın konu, testlerin amacı sistemin bir kez değil her zaman çalıştığına emin olmamızdır. Sistem değiştikçe tüm parçaların hala aynı şekilde çalıştığına manuel olarak nasıl emin olabiliyorsun?
Ama bu sınıfı bir başkasına verirsem yada kullanıma açarsam benim sınıfıma kuşku ile bakılabilir. O zaman başkası içinde test kodlarını yazmam gerekir. Testler bu gibi durumlar için hazırlanır.
Testler bunun için değil, sistemin beklendiği gibi çalışıp/çalışmadığını görebilmemiz için yazılır.