Nette Tester ile Başlangıç
İyi programcılar bile hata yapar. İyi bir programcıyla kötü bir programcı arasındaki fark, iyi olanın bir hatayı yalnızca bir kez yapması ve bir dahaki sefere onu otomatik testlerle saptamasıdır.
- “Test etmeyenler hatalarını yinelemeye mahkûmdur.” (atasözü)
- “Bir hatadan kurtulur kurtulmaz bir başkası ortaya çıkar.” (Murphy Yasası)
- “Ne zaman bir print deyimi yazmak isterseniz, onun yerine bir test yazın.” (Martin Fowler)
PHP'de hiç şöyle bir kod yazdınız mı?
$obj = new MyClass;
$result = $obj->process($input);
var_dump($result);
Yani bir fonksiyon çağrısının sonucunu, olması gerekeni döndürüp döndürmediğini gözle denetlemek için yazdırdınız mı? Bunu muhtemelen günde defalarca yapıyorsunuz. Elinizi vicdanınıza koyun: her şey doğru çalışıyorsa bu kodu siliyor musunuz? Sınıfın gelecekte bozulmayacağını mı bekliyorsunuz? Murphy yasaları bunun tersini güvence altına alır :-)
Aslında bir test yazdınız. Yalnızca, gözle denetim gerektirmemesi ve kendi kendini denetlemesi için küçük bir değişikliğe ihtiyacı var. Ve testi silmezseniz, her şeyin hâlâ olması gerektiği gibi çalıştığını doğrulamak için gelecekte istediğiniz an çalıştırabilirsiniz. Zamanla bu tür çok sayıda test oluşturacaksınız, dolayısıyla onları otomatik çalıştırmak yararlı olurdu.
Ve Nette Tester tüm bunlarda size yardım edecek.
Tester'ı Benzersiz Kılan Ne?
Nette Tester için test yazmak, her testin bağımsız çalıştırılabilen standart bir PHP betiği olması bakımından benzersizdir.
Yani bir test yazdığınızda, onu öylece çalıştırıp içinde örneğin bir programlama hatası olup olmadığını öğrenebilirsiniz. Doğru çalışıp çalışmadığını. Çalışmıyorsa IDE'nizde kolayca adım adım izleyip hatayı arayabilirsiniz. Hatta onu bir tarayıcıda bile açabilirsiniz.
Ve en önemlisi: onu çalıştırarak testi gerçekleştirmiş olursunuz. Geçip geçmediğini hemen öğrenirsiniz. Nasıl
mı? Gösterelim. PHP dizisiyle çalışmayı sınayan basit bir test yazıp ArrayTest.php dosyasına
kaydedeceğiz:
<?php
use Tester\Assert;
require __DIR__ . '/vendor/autoload.php'; # Composer autoloader'ını yükle
Tester\Environment::setup(); # Nette Tester'ı başlat
$stack = [];
Assert::same(0, count($stack)); # count() metodunun sıfır döndürmesini bekliyoruz
$stack[] = 'foo';
Assert::same(1, count($stack)); # count() metodunun bir döndürmesini bekliyoruz
Assert::contains('foo', $stack); # $stack dizisinin 'foo' öğesini içerdiğini doğrula
Gördüğünüz gibi, gerçek değerin beklenen değerle eşleştiğini onaylamak için Assert::same() gibi assertion metotları kullanılır.
Testi yazdık ve onu komut satırından çalıştırabiliriz. İlk çalıştırma olası söz dizimi hatalarını ortaya çıkaracak ve hiçbir yerde yazım hatası yapmadıysanız şunu yazdıracak:
$ php ArrayTest.php
OK
Testteki assertion'ı yanlış olanla değiştirmeyi deneyin, örneğin Assert::contains('XXX', $stack);, ve
çalıştırınca ne olduğunu izleyin:
$ php ArrayTest.php Failed: ['foo'] should contain 'XXX' in ArrayTest.php(17) Assert::contains('XXX', $stack); FAILURE
Test yazmayı Test yazma bölümünde sürdürüyoruz.
Kurulum ve Gereksinimler
Tester'ın gerektirdiği en düşük PHP sürümü 8.0'dır (ayrıntı için Desteklenen PHP Sürümleri tablosuna bakın). Yeğlenen kurulum yolu Composer kullanmaktır:
composer require --dev nette/tester
Nette Tester'ı komut satırından çalıştırmayı deneyin (argümansız yalnızca yardımı yazdırır):
vendor/bin/tester
Testleri Çalıştırma
Uygulama büyüdükçe testlerin sayısı da onunla birlikte büyür. Testleri tek tek çalıştırmak pratik olmazdı. Bu yüzden Tester'ın, komut satırından çağırdığımız bir toplu test çalıştırıcısı vardır. Parametre olarak testlerin bulunduğu dizini belirtiriz. Nokta, geçerli dizin anlamına gelir.
vendor/bin/tester .
Test çalıştırıcısı belirtilen dizini ve tüm alt dizinlerini tarar ve testleri, yani *.phpt ile
*Test.php dosyalarını arar. Maskeye uyduğu için ArrayTest.php testimizi de bulacaktır.
Ardından test etmeye başlar. Her test yeni bir PHP süreci olarak çalıştırılır, dolayısıyla diğerlerinden tümüyle yalıtılmış çalışır. Onları birden çok iş parçacığında paralel çalıştırır, bu da onu son derece hızlı kılar. Ve önce bir önceki çalıştırmada başarısız olan testleri çalıştırır; böylece hatayı düzeltip düzeltmediğinizi hemen öğrenirsiniz.
Testler çalışırken Tester, sonuçları terminale sürekli olarak karakterlerle yazdırır:
.– test geçtis– test atlandıF– test başarısız oldu
Çıktı şöyle görünebilir:
_____ ___ ___ _____ ___ ___ |_ _/ __)( __/_ _/ __)| _ ) |_| \___ /___) |_| \___ |_|_\ v2.6.0 PHP 8.5.2 (cli) | php | 8 threads ........s................F......... -- FAILED: greeting.phpt Failed: 'Hello John' should be ... 'Hello Peter' in greeting.phpt(19) Assert::same('Hello Peter', $o->say('John')); FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)
35 test çalıştırıldı, biri başarısız oldu, biri atlandı.
Testleri çalıştırma bölümünde sürdürüyoruz.
İzleme Kipi
Kodu yeniden mi düzenliyorsunuz? Ya da belki TDD (Test Driven Development) yöntemine göre mi geliştiriyorsunuz? O zaman izleme kipini seveceksiniz. Bu kipte Tester kaynak kodları izler ve değiştiklerinde kendini otomatik çalıştırır.
Geliştirme sırasında monitörünüzün köşesinde, size yeşil bir durum çubuğunun parladığı bir terminal olur; birden kırmızıya döndüğünde, az önce pek de doğru olmayan bir şey yaptığınızı anlarsınız. Aslında bu, programlayıp rengi korumaya çalıştığınız harika bir oyundur.
İzleme kipi --watch parametresiyle
başlatılır.
Kod Kapsamı Raporları
Tester, testlerin kaynak kodun ne kadarını kapsadığına dair özet içeren raporlar üretebilir. Rapor ya insan tarafından okunabilir HTML biçiminde ya da makineyle işlenmek üzere Clover XML biçiminde olabilir.
Kod kapsamı içeren örnek bir HTML raporuna bakın.
Desteklenen PHP Sürümleri
| Sürüm | Uyumlu PHP |
|---|---|
| Tester 2.6 | PHP 8.0 – 8.5 |
| Tester 2.5 | PHP 8.0 – 8.5 |
| Tester 2.4 | PHP 7.2 – 8.2 |
| Tester 2.3 | PHP 7.1 – 8.0 |
| Tester 2.1 – 2.2 | PHP 7.1 – 7.3 |
| Tester 2.0 | PHP 5.6 – 7.3 |
| Tester 1.7 | PHP 5.3 – 7.3 + HHVM 3.3+ |
| Tester 1.6 | PHP 5.3 – 7.0 + HHVM |
| Tester 1.3 – 1.5 | PHP 5.3 – 5.6 + HHVM |
| Tester 0.9 – 1.2 | PHP 5.3 – 5.6 |
En son yama sürümü için geçerlidir.
Tester, 1.7 sürümüne dek HHVM 3.3.0 ya da daha yenisini de destekliyordu
(tester -p hhvm ile). Destek, Tester'ın 2.0 sürümünden itibaren sona erdi.