Nette Tester ile Başlarken
İyi programcılar bile hata yapar. İyi ve kötü bir programcı arasındaki fark, iyinin hatayı yalnızca bir kez yapması ve bir dahaki sefere otomatik testlerle tespit etmesidir.
- “Test etmeyen, hatalarını tekrarlamaya mahkumdur.” (atasözü)
- “Bir hatadan kurtulduğumuzda, bir başkası ortaya çıkar.” (Murphy Kanunu)
- “Ne zaman ekrana bir değişken yazdırma dürtüsü hissederseniz, bunun yerine bir test yazın.” (Martin Fowler)
PHP'de hiç böyle bir kod yazdınız mı?
$obj = new MyClass;
$result = $obj->process($input);
var_dump($result);
Yani, fonksiyonun çağrısının sonucunu sadece gözle kontrol etmek için mi yazdınız, olması gerekeni döndürüp döndürmediğini görmek için mi? Eminim bunu günde birçok kez yapıyorsunuzdur. Elinizi vicdanınıza koyun: her şey yolunda giderse, bu kodu siler misiniz? Sınıfın gelecekte bozulmayacağını mı bekliyorsunuz? Murphy Kanunları tersini garanti eder :-)
Aslında bir test yazdınız. Sadece gözle kontrol gerektirmemesi için biraz değiştirmeniz yeterli, böylece kendi kendini kontrol edebilir. Ve testi silmezseniz, gelecekte istediğiniz zaman çalıştırabilir ve her şeyin hala olması gerektiği gibi çalıştığını doğrulayabilirsiniz. Zamanla bu tür testlerden çok sayıda oluşturacaksınız, bu yüzden onları otomatik olarak çalıştırmak iyi olurdu.
Ve tüm bunlarda Nette Tester size yardımcı olacaktır.
Tester'ı Benzersiz Kılan Nedir?
Nette Tester için test yazmak benzersizdir çünkü her test ayrı ayrı çalıştırılabilen normal bir PHP betiğidir.
Yani, bir test yazdığınızda, onu kolayca çalıştırabilir ve örneğin içinde bir programlama hatası olup olmadığını öğrenebilirsiniz. Doğru çalışıp çalışmadığını. Çalışmıyorsa, IDE'nizde kolayca adım adım ilerleyebilir ve hatayı arayabilirsiniz. Hatta tarayıcıda bile açabilirsiniz.
Ve en önemlisi – onu çalıştırarak testi gerçekleştirirsiniz. Geçip geçmediğini veya başarısız olup
olmadığını hemen öğrenirsiniz. Nasıl mı? Hadi gösterelim. PHP dizisiyle çalışmanın basit bir testini yazalım ve
ArrayTest.php
dosyasına kaydedelim:
<?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()'un sıfır döndürmesini bekliyoruz
$stack[] = 'foo';
Assert::same(1, count($stack)); # count()'un bir döndürmesini bekliyoruz
Assert::contains('foo', $stack); # $stack'in 'foo' öğesini içerdiğini doğrula
Gördüğünüz gibi, Assert::same()
gibi sözde doğrulama
ifadesi metotları, gerçek değerin beklenen değere karşılık geldiğini onaylamak için kullanılır.
Testi yazdık ve komut satırından çalıştırabiliriz. İlk çalıştırma olası sözdizimi hatalarını ortaya çıkaracak ve hiçbir yerde yazım hatası yapmadıysanız, şunları yazdıracaktır:
$ php ArrayTest.php
OK
Testte iddiayı yanlış Assert::contains('XXX', $stack);
olarak değiştirmeyi deneyin ve çalıştırmada ne
olacağını izleyin:
$ php ArrayTest.php Başarısız: ['foo'] içermeli 'XXX' içinde ArrayTest.php(17) Assert::contains('XXX', $stack); BAŞARISIZLIK
Yazmaya Test Yazma bölümünde devam ediyoruz.
Kurulum ve Gereksinimler
Tester tarafından gereken minimum PHP sürümü 7.1'dir (daha ayrıntılı olarak podporované verze PHP tablosunda). Tercih edilen kurulum yöntemi Composer kullanmaktır:
composer require --dev nette/tester
Komut satırından Nette Tester'ı çalıştırmayı deneyin (parametre olmadan 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 artar. Testleri tek tek çalıştırmak pratik olmazdı. Bu nedenle Tester, komut satırından çağırdığımız toplu bir test çalıştırıcısına sahiptir. Parametre olarak testlerin bulunduğu dizini belirtiriz. Geçerli dizin için nokta yeterlidir.
vendor/bin/tester .
Test çalıştırıcısı belirtilen dizini ve tüm alt dizinleri tarar ve *.phpt
ve *Test.php
dosyaları olan testleri arar. Böylece maskeye uyduğu için ArrayTest.php
testimizi de bulur.
Ardından test etmeye başlar. Her testi yeni bir PHP süreci olarak çalıştırır, böylece diğerlerinden tamamen izole edilmiş olarak çalışır. Onları birden fazla iş parçacığında paralel olarak çalıştırır ve bu sayede son derece hızlıdır. Ve ilk olarak önceki çalıştırmada başarısız olan testleri çalıştırır, böylece hatayı düzeltip düzeltmediğinizi hemen öğrenirsiniz.
Testlerin yürütülmesi sırasında, Tester sonuçları sürekli olarak terminale karakterler olarak yazdırır:
.
– test geçtis
– test atlandı (skipped)F
– test başarısız oldu (failed)
Çıktı şöyle görünebilir:
_____ ___ ___ _____ ___ ___ |_ _/ __)( __/_ _/ __)| _ ) |_| \___ /___) |_| \___ |_|_\ v2.5.2 Not: php.ini kullanılmıyor. PHP 8.3.2 (cli) | php -n | 8 iş parçacığı ........s................F......... -- BAŞARISIZ: greeting.phpt Başarısız: 'Merhaba John' olmalı ... 'Merhaba Peter' içinde greeting.phpt(19) Assert::same('Merhaba Peter', $o->say('John')); BAŞARISIZLIKLAR! (35 test, 1 başarısızlık, 1 atlandı, 1.7 saniye)
35 test çalıştırıldı, biri başarısız oldu, biri atlandı.
Daha sonra Testleri Çalıştırma bölümünde devam ediyoruz.
İzleme Modu
Kodu yeniden düzenliyor musunuz? Veya TDD (Test Driven Development) metodolojisine göre mi geliştiriyorsunuz? O zaman izleme modunu seveceksiniz. Tester bu modda kaynak kodlarını izler ve değişiklik olduğunda kendini yeniden başlatır.
Geliştirme sırasında monitörünüzün köşesinde yeşil durum çubuğu yanan bir terminaliniz olur ve aniden kırmızıya döndüğünde, bir şeyi tam olarak doğru yapmadığınızı bilirsiniz. Aslında programlama yaparken rengi korumaya çalıştığınız harika bir oyundur.
İzleme modu –watch parametresiyle başlatılır.
Kod Kapsamı Raporları
Tester, testlerin ne kadar kaynak kodunu kapsadığına dair genel bir bakış içeren raporlar oluşturabilir. Rapor, ya insan tarafından okunabilir HTML formatında ya da daha fazla makine işleme için Clover XML formatında olabilir.
Kod kapsamıyla ilgili HTML raporu örneğine bakın.
Desteklenen PHP Sürümleri
sürüm | PHP ile uyumlu |
---|---|
Tester 2.5 | PHP 8.0 – 8.3 |
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 |
Son yama sürümü için geçerlidir.
Tester sürüm 1.7'ye kadar HHVM 3.3.0 veya üstünü de destekliyordu
(tester -p hhvm
aracılığıyla). Destek Tester sürüm 2.0'dan itibaren sonlandırıldı.