Nette Documentation Preview

syntax
Nette Tester ile Başlarken
**************************

<div class=perex>

İ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)

</div>

PHP'de hiç böyle bir kod yazdınız mı?

```php
$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 .{file:ArrayTest.php}
<?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ı|assertions], 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:

/--pre .[terminal]
$ php ArrayTest.php

<span style="color:#FFF; background-color:#090">OK</span>
\--

Testte iddiayı yanlış `Assert::contains('XXX', $stack);` olarak değiştirmeyi deneyin ve çalıştırmada ne olacağını izleyin:

/--pre .[terminal]
$ php ArrayTest.php

<span style="color: #FFF">Başarısız: </span><span style="color: #FF0">['foo']</span><span style="color: #FFF"> içermeli </span><span style="color: #FF0">'XXX'</span>

<span style="color: #CCC">içinde </span><span style="color: #FFF">ArrayTest.php(17)</span><span style="color: #808080"> Assert::contains('XXX', $stack);</span>

<span style="color: #FFF; background-color: #900">BAŞARISIZLIK</span>
\--

Yazmaya [Test Yazma|writing-tests] 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 [#Desteklenen PHP Sürümleri] tablosunda). Tercih edilen kurulum yöntemi [Composer |best-practices:composer] kullanmaktır:

/--pre .[terminal]
composer require --dev nette/tester
\--

Komut satırından Nette Tester'ı çalıştırmayı deneyin (parametre olmadan yalnızca yardımı yazdırır):

/--pre .[terminal]
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.

/--pre .[terminal]
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:

- <code style="color: #CCC; background-color: #000">.</code> – test geçti
- <code style="color: #CCC; background-color: #000">s</code> – test atlandı (skipped)
- <code style="color: #FFF; background-color: #900">F</code> – test başarısız oldu (failed)

Çıktı şöyle görünebilir:

/--pre .[terminal]
 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

Not: php.ini kullanılmıyor.
PHP 8.3.2 (cli) | php -n | 8 iş parçacığı

........s................<span style="color: #FFF; background-color: #900">F</span>.........

<span style="color: #F00">-- BAŞARISIZ: greeting.phpt</span>
<span style="color: #CCC">   </span><span style="color: #FFF">Başarısız: </span><span style="color: #FF0">'Merhaba John'</span><span style="color: #FFF"> olmalı</span>
<span style="color: #FFF">       ... </span><span style="color: #FF0">'Merhaba Peter'</span>

<span style="color: #CCC">   içinde </span><span style="color: #FFF">greeting.phpt(19)</span><span style="color: #808080"> Assert::same('Merhaba Peter', $o->say('John'));</span>

<span style="color: #FFF; background-color: #900">BAŞARISIZLIKLAR! (35 test, 1 başarısızlık, 1 atlandı, 1.7 saniye)</span>
\--

35 test çalıştırıldı, biri başarısız oldu, biri atlandı.

Daha sonra [Testleri Çalıştırma|running-tests] 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 |running-tests#-w --watch path] 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":https://files.nette.org/tester/coverage.html 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 |https://hhvm.com] 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ı.

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 Desteklenen PHP Sürümleri 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ı.