Tester ile Başlarken
İyi programcılar bile hata yapar. İyi bir programcı ile kötü bir programcı arasındaki fark, iyi programcının hatayı yalnızca bir kez yapması ve bir sonraki sefer otomatik testler kullanarak tespit etmesidir.
- “Test etmeyen kişi kendi hatalarını tekrarlamaya mahkumdur.” (bilge atasözü)
- “Bir hatadan kurtulduğumuzda, başka bir hata ortaya çıkar.” (Murphy Kanunu)
- “Bir ifadeyi yazdırmak istediğinizde, bunun yerine bir test olarak yazın.” (Martin Fowler)
PHP'de hiç aşağıdaki kodu yazdınız mı?
$obj = new MyClass;
$result = $obj->process($input);
var_dump($result);
Peki, hiç bir fonksiyon çağrısı sonucunu sadece dönmesi gerekeni döndürüp döndürmediğini gözle kontrol etmek için döktünüz mü? Bunu mutlaka her gün birçok kez yapıyorsunuzdur. Elinizi kalbinizin üzerine koyarak, her şey çalışırsa, bu kodu siler ve sınıfın gelecekte bozulmayacağını mı beklersiniz? Murphy Yasası tam tersini garanti eder :-)
Aslında testi siz yazdınız. Bizim denetimimizi gerektirmemesi, sadece kendi kendini kontrol edebilmesi için küçük bir değişikliğe ihtiyacı var. Ve eğer silmediyseniz, her şeyin hala olması gerektiği gibi çalıştığını doğrulamak için gelecekte herhangi bir zamanda çalıştırabiliriz. Zaman içinde bu testlerden çok sayıda oluşturabilirsiniz, bu nedenle bunları otomatik olarak çalıştırabilmemiz iyi olurdu.
Ve Nette Tester tam da bu konuda yardımcı oluyor.
Tester'ı Benzersiz Kılan Nedir?
Nette Tester için test yazmak benzersizdir, çünkü her test bağımsız olarak çalıştırılabilen standart bir PHP betiğidir.
Böylece bir test yazdığınızda, bir programlama hatası olup olmadığını görmek için basitçe çalıştırabilirsiniz. Eğer düzgün çalışıyorsa. Çalışmıyorsa, IDE'nizde programı kolayca adımlayabilir ve bir hata arayabilirsiniz. Hatta bir tarayıcıda bile açabilirsiniz.
Ve en önemlisi – çalıştırarak testi gerçekleştireceksiniz. Geçip geçmediğini veya başarısız olup olmadığını
hemen öğreneceksiniz. Nasıl mı? Burada gösterelim. PHP dizisi kullanmak için önemsiz bir test yazalım ve bunu
ArrayTest.php
dosyasına kaydedelim:
<?php
use Tester\Assert;
require __DIR__ . '/vendor/autoload.php'; # load Composer autoloader
Tester\Environment::setup(); # initialization of Nette Tester
$stack = [];
Assert::same(0, count($stack)); # we expect count() to return zero
$stack[] = 'foo';
Assert::same(1, count($stack)); # we expect count() to return one
Assert::contains('foo', $stack); # verify that the $stack contains the item 'foo'
Gördüğünüz gibi, Assert::same()
gibi onaylama
yöntemleri, gerçek bir değerin beklenen bir değerle eşleştiğini onaylamak için kullanılır.
Test yazıldı, komut satırından çalıştırabiliriz. İlk çalıştırma herhangi bir sözdizimi hatasını ortaya çıkaracaktır ve eğer bir yazım hatası yapmadıysanız, göreceksiniz:
$ php ArrayTest.php
OK
Testteki ifadeyi Assert::contains('XXX', $stack);
olarak değiştirmeyi deneyin ve çalıştırıldığında ne
olacağını izleyin:
$ php ArrayTest.php Failed: ['foo'] should contain 'XXX' in ArrayTest.php(17) Assert::contains('XXX', $stack); FAILURE
Yazma Testleri bölümünde yazma konusuna devam ediyoruz.
Kurulum ve Gereksinimler
Tester tarafından istenen minimum PHP sürümü 7.1'dir (daha fazla ayrıntı için desteklenen PHP sürümleri tablosuna bakın). Tercih edilen kurulum yöntemi Composer'dır:
composer require --dev nette/tester
Nette Tester'ı komut satırından çalıştırmayı deneyin (herhangi bir argüman olmadan sadece bir yardım özeti gösterecektir):
vendor/bin/tester
Çalışan Testler
Uygulamamız büyüdükçe, test sayısı da onunla birlikte artar. Testleri tek tek çalıştırmak pratik olmayacaktır. Bu nedenle, Tester'ın komut satırından çağırdığımız bir toplu test çalıştırıcısı vardır. Parametre, testlerin bulunduğu dizindir. Nokta geçerli dizini gösterir.
vendor/bin/tester .
Nette Tester çalıştırıcısı belirtilen dizini ve tüm alt dizinleri arar ve *.phpt
ve *Test.php
dosyaları olan testleri arar. Maske ile eşleştiği için ArrayTest.php
testimizi de bulacaktır.
Sonra test etmeye başlar. Her testi yeni bir PHP süreci olarak çalıştırır, böylece diğerlerinden tamamen yalıtılmış olarak çalışır. Birden fazla iş parçacığında paralel olarak çalışır, bu da onu son derece hızlı hale getirir. Ve ilk olarak önceki çalıştırma sırasında başarısız olan testleri çalıştırır, böylece hatayı düzeltip düzeltmediğinizi hemen anlarsınız.
Tamamlanan her test için, çalıştırıcı ilerlemeyi göstermek için bir karakter yazdırır:
.
– test geçtis
– test atlandıF
– test başarısız
Çıktı şu şekilde görünebilir:
_____ ___ ___ _____ ___ ___ |_ _/ __)( __/_ _/ __)| _ ) |_| \___ /___) |_| \___ |_|_\ v2.5.2 Note: No php.ini is used. PHP 8.3.2 (cli) | php -n | 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ı.
Çalıştırma testleri bölümünde devam ediyoruz.
İzleme Modu
Kodu yeniden düzenliyor musunuz? Ya da TDD (Test Güdümlü Geliştirme) metodolojisine göre mi geliştiriyorsunuz? O zaman izleme modunu seveceksiniz. Tester kaynak kodlarını izler ve değiştirildiğinde kendini çalıştırır.
Geliştirme sırasında, monitörün köşesinde bir terminaliniz vardır, burada yeşil durum çubuğu yanar ve aniden kırmızıya döndüğünde, istenmeyen bir şey yaptığınızı bilirsiniz. Aslında programladığınız ve renge sadık kalmaya çalıştığınız harika bir oyun.
İzleme modu –watch parametresi kullanılarak başlatılır.
CodeCoverage Raporları
Test Uzmanı, testlerin ne kadar kaynak kodu kapsadığına dair genel bir bakış içeren raporlar oluşturabilir. Rapor, insan tarafından okunabilir HTML biçiminde veya daha fazla makine işlemi için Clover XML biçiminde olabilir.
Kod kapsamıyla birlikte örnek HTML raporuna 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 |
En son yama sürümleri için geçerlidir.
Tester 1.7 sürümüne kadar HHVM 3.3.0 veya daha yenisini destekliyordu (
tester -p hhvm
adresini kullanarak). Tester 2.0'dan beri destek kesilmiştir. Kullanımı basitti: