PHP Unit Test Nedir? Neden Unit Test Yazmalı{mı?}yız…
Bu yazımızda Unit Test nedir? Kim neden yazmıştır ve Unit Test nasıl yazılır? Sorularının cevaplarını bulacağız.
Hadi başlayalım…
Unit Test yani Birim Test nedir?
Projemizdeki en küçük birimlere ait testlerdir. Bu testleri yazmamızın asıl amacı, kodumuzu daha güvenilir, sürdürülebilir ve hata toleransı yüksek hale getirmektir. Birim testleri yazarken projeyi olabilecek en küçük birimlere ayırmak, bağımlılıklardan kurtarmak ve test etmektir. Bu yüzdendir ki Unit Test yazarken en çok göreceğimiz kelimelerden biri de “assert” kelimesidir. “Assert” kelimesi türkçe olarak “iddia etmek” anlamına gelir. Yazımızın ilerleyen kısımlarında birim test yazarken kullanılan assert yöntemlerine değineceğiz.
Kim Neden Yazmıştır?
Unit Test nedir? diye sorduğumuzda akla ilk gelen isim Sebastian Bergmann ‘dır. Sebastian abimizin lokasyonu şu sıralar Siegburg, Almanya ’dır. Kendisi hakkında daha detaylı bilgiye github sayfasından ulaşabilirsiniz. https://github.com/sebastianbergmann
PHPUnit, özgür yazılım topluluğu tarafından geliştirilmiş ve başta Sebastian Bergmann olmak üzere birçok katkıda bulunan geliştirici tarafından desteklenmektedir. 2004 yılında başlatılan bu proje, PHP uygulamalarının test edilmesini kolaylaştırmak ve kaliteli yazılım geliştirmeye katkıda bulunmak amacıyla ortaya çıkmıştır.
Unit Test Nasıl Yazılır?
Unit Test yazarken bazı kurallara uymamız gerekecek. Bu kuralları yazalım.
- Testlerimiz için projemiz altında tests adında bir dizin oluşturmalıyız.
- Oluşturacağımız her test dosyasının ismini StudlyCaps yöntemiyle isimlendirmeliyiz (ClassNameTest.php)
- Test sınıflarını PHPUnit_Framework_TestCase sınıfından türetmeliyiz.
- Test metodlarımız public erişim belirtecine sahip olmalıdır.
- Test sınıfları test kelimesi ile bitmelidir.
- Test metodları test kelimesi ile başlamalıdır.
- Son olarak genel geçer bir kuralı daha yazmak istiyorum test metodlarına verilen isimeler Snake Case isimlendirme yöntemiyle verilmelidir. Sıralama su şekilde olmalıdır.
- “Test Edilen Metodun Adıyla” başlanmalı,
- Devamında “Test Konusu” ilave edilmeli
- Son olarak “Senaryo Açıklamasıyla” bitirilmelidir
Yukarıda Birim Testler yazılırken assert kullanıldığına değinmiştik. Şimdi bu assert metodlarının çeşitlerine ve nasıl kullanıldıklarına kısaca değinelim. Tabii PHP Unit Test çatısı altında bir çok assert mevcut biz burada şimdilik en çok kullanılanları inceleyeceğiz. Fakat öncesinde PHP de “annotation” yapısına ve Birim Testlerde “annotation” kullanımına değinelim.
Annotation kelimesinin Türkçe‘ye karşılığı “ek açıklama” veya, “bilgi notu” şeklinde yapılabilir.
Birim testlerde annotation ifadeleriyle bazı metodlarımız standart dışı davranışlarda bize akıllıca hizmet etmelerini sağlayabiliyoruz.
Mesela, ilgili test sınıfı çalıştığında, test metodları çalıştırılmadan önce bir kez çalışması kaydıyla statik bir beforeClass() metodunun çalışmasını sağlayabiliyoruz. Bunu @beforeClass annotation sayesinde yapabiliyoruz.
/**
* @beforeClass
*/
public static function beforeClass()
{
print "beforeClass Call";
}
Yukarıdaki örneğe benzer olarak @afterClass ek açıklamasıyla ilgili test sınıfı çalıştığında, test metodları çalıştırılıp bittikten sonra bir kez çalışması kaydıyla statik bir afterClass() metodunun çalışmasını sağlayabiliyoruz.
/**
* @afterClass
*/
public static function afterClass()
{
print "afterClass call";
}
Yine yukarıdaki örneklere benzer fakat her test metodunun çalışması ve bitmesinde önce ve sonra çalışacak after, before metodları kullanabiliyoruz. Bunu için @before, @after bilgi notlarını kullanmamız gerekiyor.
/**
* @before
*/
public function before()
{
print "before call";
}
/**
* @after
*/
public function after()
{
print "after call";
}
PHP Unit Test için kullanılabilir annotation listesine buradan ulaşabilirsiniz. https://docs.phpunit.de/en/9.6/annotations.html
Şimdi assertion kısmına giriş yapabiliriz. Assertion kelimesinin iddia etmek anlamına geldiğine değinmiştik. Aslında onaylama ifadeleri de diyebiliriz. Bu onaylama metodlarını kullanarak beklediğimiz sonuçların doğruluğundan emin oluyoruz.
Genellikle onaylama metodları üç tane parametre alırlar.
- expected yani beklenen,
- actual yani gerçekte olan,
- sonuncusuda isteğe bağlı olarak kullanılan string $message yani hata durumunda gösterilecek olan hata mesajıdır.
Bir ve ikinci parametrelerin isimleri kullanılan assert metoduna göre değişiklik gösterebilir
PHP Unit Test için kullanılabilir bir çok assertion var burada yaygın olarak kullanılalara değineceğim, isterseniz diğerlerine linkten ulaşabilirsiniz. https://docs.phpunit.de/en/9.6/assertions.html
- assertTrue() ⇒ Gelen değerin doğruluğunu kontrol eder
- assertEquals() ⇒ Dönen değer ile beklediğimiz değerin bir birine eşit olması durumunu kontrol eder.
- assertNotEquals() ⇒ Dönen değer ile beklediğimiz değerin bir birine eşit olmaması durumunu kontrol eder.
- assertContains() ⇒ Özellikle bir dizinin belirli bir öğeyi içerip içermediğini doğrularken veya bir dize içinde belirli bir alt dizenin bulunup bulunmadığını kontrol etmek için kullanılır.
- assertStringContainsString() ⇒ Metin işleme veya metin karşılaştırmaları yaparken kullanılır. Belirli bir metin içinde aranan bir alt metni doğrulamak için kullanılır.
- assertContainsOnlyInstancesOf() ⇒ Bir dizinin yalnızca belirli bir sınıfa ait nesneler içerip içermediğini doğrulamak için kullanılır.
- assertCount() ⇒ Bir dizinin veya koleksiyonun içindeki öge sayısını doğrulamak için kullanılır
- assertArrayHasKey() ⇒ Bir dizi içinde belirli bir anahtarın bulunup bulunmadığını kontrol etmek için kullanılır.
- assertGreaterThan() ⇒ Bir değerin belirli bir sınırdan daha büyük olduğunu doğrulamak için
- assertLessThan() ⇒ Bir değerin belirli bir sınırdan daha küçük olduğunu doğrulamak için
Devam yazımızda assertions kullanımlarını örnek kodlarla zenginleştireceğiz. Ek olarak Mock nedir? Kullanmak gerekli midir? Nasıl Kullanılır sorularına cevaplar bulacağız…
Görüşmek dileğiyle…
Kaynaklar:
https://docs.phpunit.de/en/9.6/
https://github.com/sebastianbergmann
https://sebastian-bergmann.de/