Nette Documentation Preview

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

<div class=perex>

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

</div>

PHP'de hiç aşağıdaki kodu yazdınız mı?

```php
$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? .[#toc-what-makes-tester-unique]
================================================================

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 .{file:ArrayTest.php}
<?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 |Assertions], 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:

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

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

Testteki ifadeyi `Assert::contains('XXX', $stack);` olarak değiştirmeyi deneyin ve çalıştırıldığında ne olacağını izleyin:

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

<span style="color: #FFF">Failed: </span><span style="color: #FF0">['foo']</span><span style="color: #FFF"> should contain </span><span style="color: #FF0">'XXX'</span>

<span style="color: #CCC">in </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">FAILURE</span>
\--

Yazma [Testleri |Writing Tests] bölümünde yazma konusuna devam ediyoruz.


Kurulum ve Gereksinimler .[#toc-installation-and-requirements]
==============================================================

Tester tarafından istenen minimum PHP sürümü 7.1'dir (daha fazla ayrıntı için [desteklenen PHP sürümleri |#supported PHP versions] tablosuna bakın). Tercih edilen kurulum yöntemi [Composer'dır |best-practices:composer]:

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

/--pre .[terminal]
vendor/bin/tester
\--


Çalışan Testler .[#toc-running-tests]
=====================================

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.

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

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

Çıktı şu şekilde görünebilir:

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

Note: No php.ini is used.
PHP 8.3.2 (cli) | php -n | 8 threads

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

<span style="color: #F00">-- FAILED: greeting.phpt</span>
<span style="color: #CCC">   </span><span style="color: #FFF">Failed: </span><span style="color: #FF0">'Hello John'</span><span style="color: #FFF"> should be</span>
<span style="color: #FFF">       ... </span><span style="color: #FF0">'Hello Peter'</span>

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

<span style="color: #FFF; background-color: #900">FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)</span>
\--

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

[Çalıştırma testleri |Running tests] bölümünde devam ediyoruz.


İzleme Modu .[#toc-watch-mode]
==============================

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 |running-tests#w-watch-path] parametresi kullanılarak başlatılır.


CodeCoverage Raporları .[#toc-codecoverage-reports]
===================================================

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":https://files.nette.org/tester/coverage.html bakın.


Desteklenen PHP sürümleri .[#toc-supported-php-versions]
========================================================

| 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 |https://hhvm.com] 3.3.0 veya daha yenisini destekliyordu ( `tester -p hhvm` adresini kullanarak). Tester 2.0'dan beri destek kesilmiştir. Kullanımı basitti:

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