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çti
  • s – 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ı.