Nette Documentation Preview

syntax
Ξεκινώντας με το Tester
***********************

<div class=perex>

Ακόμη και οι καλοί προγραμματιστές κάνουν λάθη. Η διαφορά μεταξύ ενός καλού προγραμματιστή και ενός κακού είναι ότι ο καλός θα το κάνει μόνο μία φορά και την επόμενη φορά θα το εντοπίσει χρησιμοποιώντας αυτοματοποιημένες δοκιμές.

- "Αυτός που δεν κάνει δοκιμές είναι καταδικασμένος να επαναλάβει τα ίδια του τα λάθη". (σοφή παροιμία)
- "Όταν ξεφορτωνόμαστε ένα λάθος, εμφανίζεται ένα άλλο". (Νόμος του Μέρφι)
- "Κάθε φορά που μπαίνετε στον πειρασμό να εκτυπώσετε δήλωση, γράψτε την αντ' αυτού ως δοκιμή". (Martin Fowler)

</div>

Έχετε γράψει ποτέ τον ακόλουθο κώδικα σε PHP;

```php
$obj = new MyClass;
$result = $obj->process($input);

var_dump($result);
```

Έτσι, έχετε ποτέ απορρίψει το αποτέλεσμα μιας κλήσης συνάρτησης μόνο και μόνο για να ελέγξετε με το μάτι ότι επιστρέφει αυτό που πρέπει να επιστρέψει; Σίγουρα το κάνετε πολλές φορές την ημέρα. Με το χέρι στην καρδιά, αν όλα δουλεύουν, διαγράφετε αυτόν τον κώδικα και περιμένετε ότι η κλάση δεν θα χαλάσει στο μέλλον; Ο νόμος του Μέρφι εγγυάται το αντίθετο :-)

Στην πραγματικότητα, εσείς γράψατε το τεστ. Χρειάζεται μια μικρή τροποποίηση για να μην απαιτεί τον έλεγχό μας, απλά για να μπορεί να ελέγχει τον εαυτό του. Και αν δεν το διαγράψατε θα μπορούσαμε να το τρέξουμε οποιαδήποτε στιγμή στο μέλλον για να ελέγξουμε ότι όλα εξακολουθούν να λειτουργούν όπως πρέπει. Ενδέχεται να δημιουργήσετε μεγάλο αριθμό τέτοιων δοκιμών με την πάροδο του χρόνου, οπότε θα ήταν καλό αν μπορούσαμε να τις εκτελούμε αυτόματα.

Και το Nette Tester βοηθά ακριβώς σε αυτό.


Τι κάνει το Tester μοναδικό; .[#toc-what-makes-tester-unique]
=============================================================

Η συγγραφή δοκιμών για το Nette Tester είναι μοναδική στο ότι **κάθε δοκιμή είναι ένα τυπικό PHP script που μπορεί να εκτελεστεί αυτόνομα**.

Έτσι, όταν γράφετε μια δοκιμή, μπορείτε απλά να την εκτελέσετε για να δείτε αν υπάρχει κάποιο προγραμματιστικό σφάλμα. Εάν λειτουργεί σωστά. Εάν όχι, μπορείτε εύκολα να περάσετε το πρόγραμμα στο IDE σας και να αναζητήσετε ένα σφάλμα. Μπορείτε ακόμη και να το ανοίξετε σε ένα πρόγραμμα περιήγησης.

Και το πιο σημαντικό - εκτελώντας το, θα εκτελέσετε τη δοκιμή. Θα μάθετε αμέσως αν πέρασε ή απέτυχε. Πώς; Ας εμφανιστεί εδώ. Ας γράψουμε ένα τετριμμένο τεστ για τη χρήση του PHP array και ας το αποθηκεύσουμε στο αρχείο `ArrayTest.php`:

```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'
```

Όπως μπορείτε να δείτε, οι [μέθοδοι ισχυρισμού |Assertions] όπως η `Assert::same()` χρησιμοποιούνται για να βεβαιώσουν ότι μια πραγματική τιμή ταιριάζει με μια αναμενόμενη τιμή.

Η δοκιμή έχει γραφτεί, μπορούμε να την εκτελέσουμε από τη γραμμή εντολών. Η πρώτη εκτέλεση θα αποκαλύψει τυχόν συντακτικά λάθη, και αν δεν κάνατε κάποιο τυπογραφικό λάθος, θα δείτε:

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

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

Δοκιμάστε να αλλάξετε τη δήλωση σε `Assert::contains('XXX', $stack);` στη δοκιμή και παρακολουθήστε τι θα συμβεί κατά την εκτέλεση:

/--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>
\--

Συνεχίζουμε για τη συγγραφή στο κεφάλαιο [Συγγραφή δοκιμών |Writing Tests].


Εγκατάσταση και απαιτήσεις .[#toc-installation-and-requirements]
================================================================

Η ελάχιστη απαιτούμενη έκδοση PHP από τον Tester είναι η 7.1 (για περισσότερες λεπτομέρειες, ανατρέξτε στον πίνακα με τις [υποστηριζόμενες εκδόσεις PHP |#supported PHP versions] ). Ο προτιμώμενος τρόπος εγκατάστασης είναι ο [Composer |best-practices:composer]:

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

Δοκιμάστε να εκτελέσετε το Nette Tester από τη γραμμή εντολών (χωρίς ορίσματα θα εμφανίσει μόνο μια περίληψη βοήθειας):

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


Εκτέλεση δοκιμών .[#toc-running-tests]
======================================

Καθώς η εφαρμογή μας μεγαλώνει, ο αριθμός των δοκιμών μεγαλώνει μαζί της. Δεν θα ήταν πρακτικό να εκτελούμε τις δοκιμές μία προς μία. Για το λόγο αυτό, ο Tester διαθέτει έναν εκτελεστή μαζικών δοκιμών, τον οποίο καλούμε από τη γραμμή εντολών. Η παράμετρος είναι ο κατάλογος στον οποίο βρίσκονται οι δοκιμές. Η τελεία υποδεικνύει τον τρέχοντα κατάλογο.

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

Ο δρομέας Nette Tester αναζητά τον καθορισμένο κατάλογο και όλους τους υποκαταλόγους και αναζητά τις δοκιμές, οι οποίες είναι τα αρχεία `*.phpt` και `*Test.php`. Θα βρει επίσης τη δοκιμή μας `ArrayTest.php`, καθώς ταιριάζει με τη μάσκα.

Στη συνέχεια, ξεκινά τη δοκιμή. Εκτελεί κάθε δοκιμή ως μια νέα διεργασία PHP, έτσι ώστε να εκτελείται εντελώς απομονωμένη από τις άλλες. Τρέχει παράλληλα σε πολλαπλά νήματα, γεγονός που την καθιστά εξαιρετικά γρήγορη. Και εκτελεί πρώτα τις δοκιμές που απέτυχαν κατά την προηγούμενη εκτέλεση, ώστε να γνωρίζετε αμέσως αν διορθώσατε το σφάλμα.

Για κάθε δοκιμή που εκτελείται, ο δρομέας εκτυπώνει έναν χαρακτήρα για να υποδείξει την πρόοδο:

- <code style="color: #CCC; background-color: #000">.</code> - η δοκιμή πέρασε
- <code style="color: #CCC; background-color: #000">s</code> - η δοκιμή έχει παραλειφθεί
- <code style="color: #FFF; background-color: #900">F</code> - η δοκιμή απέτυχε

Η έξοδος μπορεί να μοιάζει ως εξής:

/--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 δοκιμές εκτελέστηκαν, μία απέτυχε, μία παραλείφθηκε.

Συνεχίζουμε στο κεφάλαιο [Εκτέλεση δοκιμών |Running tests].


Λειτουργία παρακολούθησης .[#toc-watch-mode]
============================================

Ανασχεδιάζετε τον κώδικα; Ή μήπως αναπτύσσετε ακόμη και σύμφωνα με τη μεθοδολογία TDD (Test Driven Development); Τότε θα σας αρέσει η λειτουργία παρακολούθησης. Ο Tester παρακολουθεί τους πηγαίους κώδικες και εκτελείται μόνος του όταν αλλάζει.

Κατά τη διάρκεια της ανάπτυξης, έχετε ένα τερματικό στη γωνία της οθόνης, όπου η πράσινη γραμμή κατάστασης ανάβει πάνω σας, και όταν ξαφνικά γίνεται κόκκινη, ξέρετε ότι μόλις κάνατε κάτι ανεπιθύμητο. Είναι στην πραγματικότητα ένα σπουδαίο παιχνίδι όπου προγραμματίζετε και προσπαθείτε να τηρήσετε το χρώμα.

Η λειτουργία παρακολούθησης ξεκινάει με τη χρήση της παραμέτρου [--watch |running-tests#w-watch-path].


Αναφορές CodeCoverage .[#toc-codecoverage-reports]
==================================================

Ο ελεγκτής μπορεί να δημιουργήσει αναφορές με μια επισκόπηση του πόση ποσότητα πηγαίου κώδικα καλύπτουν οι δοκιμές. Η αναφορά μπορεί να είναι είτε σε μορφή HTML αναγνώσιμη από τον άνθρωπο είτε σε μορφή Clover XML για περαιτέρω μηχανική επεξεργασία.

Δείτε το "δείγμα αναφοράς HTML":https://files.nette.org/tester/coverage.html με την κάλυψη κώδικα.


Υποστηριζόμενες εκδόσεις PHP .[#toc-supported-php-versions]
===========================================================

| έκδοση | συμβατή με PHP
|------------------|-------------------
| 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

Ισχύει για τις τελευταίες εκδόσεις διορθώσεων.

Μέχρι την έκδοση 1.7 ο Tester υποστήριζε [το HHVM |https://hhvm.com] 3.3.0 ή νεότερη έκδοση (χρησιμοποιώντας το `tester -p hhvm`). Η υποστήριξη έχει διακοπεί από το Tester 2.0. Η χρήση ήταν απλή:

Ξεκινώντας με το Tester

Ακόμη και οι καλοί προγραμματιστές κάνουν λάθη. Η διαφορά μεταξύ ενός καλού προγραμματιστή και ενός κακού είναι ότι ο καλός θα το κάνει μόνο μία φορά και την επόμενη φορά θα το εντοπίσει χρησιμοποιώντας αυτοματοποιημένες δοκιμές.

  • „Αυτός που δεν κάνει δοκιμές είναι καταδικασμένος να επαναλάβει τα ίδια του τα λάθη“. (σοφή παροιμία)
  • „Όταν ξεφορτωνόμαστε ένα λάθος, εμφανίζεται ένα άλλο“. (Νόμος του Μέρφι)
  • „Κάθε φορά που μπαίνετε στον πειρασμό να εκτυπώσετε δήλωση, γράψτε την αντ' αυτού ως δοκιμή“. (Martin Fowler)

Έχετε γράψει ποτέ τον ακόλουθο κώδικα σε PHP;

$obj = new MyClass;
$result = $obj->process($input);

var_dump($result);

Έτσι, έχετε ποτέ απορρίψει το αποτέλεσμα μιας κλήσης συνάρτησης μόνο και μόνο για να ελέγξετε με το μάτι ότι επιστρέφει αυτό που πρέπει να επιστρέψει; Σίγουρα το κάνετε πολλές φορές την ημέρα. Με το χέρι στην καρδιά, αν όλα δουλεύουν, διαγράφετε αυτόν τον κώδικα και περιμένετε ότι η κλάση δεν θα χαλάσει στο μέλλον; Ο νόμος του Μέρφι εγγυάται το αντίθετο :-)

Στην πραγματικότητα, εσείς γράψατε το τεστ. Χρειάζεται μια μικρή τροποποίηση για να μην απαιτεί τον έλεγχό μας, απλά για να μπορεί να ελέγχει τον εαυτό του. Και αν δεν το διαγράψατε θα μπορούσαμε να το τρέξουμε οποιαδήποτε στιγμή στο μέλλον για να ελέγξουμε ότι όλα εξακολουθούν να λειτουργούν όπως πρέπει. Ενδέχεται να δημιουργήσετε μεγάλο αριθμό τέτοιων δοκιμών με την πάροδο του χρόνου, οπότε θα ήταν καλό αν μπορούσαμε να τις εκτελούμε αυτόματα.

Και το Nette Tester βοηθά ακριβώς σε αυτό.

Τι κάνει το Tester μοναδικό;

Η συγγραφή δοκιμών για το Nette Tester είναι μοναδική στο ότι κάθε δοκιμή είναι ένα τυπικό PHP script που μπορεί να εκτελεστεί αυτόνομα.

Έτσι, όταν γράφετε μια δοκιμή, μπορείτε απλά να την εκτελέσετε για να δείτε αν υπάρχει κάποιο προγραμματιστικό σφάλμα. Εάν λειτουργεί σωστά. Εάν όχι, μπορείτε εύκολα να περάσετε το πρόγραμμα στο IDE σας και να αναζητήσετε ένα σφάλμα. Μπορείτε ακόμη και να το ανοίξετε σε ένα πρόγραμμα περιήγησης.

Και το πιο σημαντικό – εκτελώντας το, θα εκτελέσετε τη δοκιμή. Θα μάθετε αμέσως αν πέρασε ή απέτυχε. Πώς; Ας εμφανιστεί εδώ. Ας γράψουμε ένα τετριμμένο τεστ για τη χρήση του PHP array και ας το αποθηκεύσουμε στο αρχείο 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'

Όπως μπορείτε να δείτε, οι μέθοδοι ισχυρισμού όπως η Assert::same() χρησιμοποιούνται για να βεβαιώσουν ότι μια πραγματική τιμή ταιριάζει με μια αναμενόμενη τιμή.

Η δοκιμή έχει γραφτεί, μπορούμε να την εκτελέσουμε από τη γραμμή εντολών. Η πρώτη εκτέλεση θα αποκαλύψει τυχόν συντακτικά λάθη, και αν δεν κάνατε κάποιο τυπογραφικό λάθος, θα δείτε:

$ php ArrayTest.php

OK

Δοκιμάστε να αλλάξετε τη δήλωση σε Assert::contains('XXX', $stack); στη δοκιμή και παρακολουθήστε τι θα συμβεί κατά την εκτέλεση:

$ php ArrayTest.php

Failed: ['foo'] should contain 'XXX'

in ArrayTest.php(17) Assert::contains('XXX', $stack);

FAILURE

Συνεχίζουμε για τη συγγραφή στο κεφάλαιο Συγγραφή δοκιμών.

Εγκατάσταση και απαιτήσεις

Η ελάχιστη απαιτούμενη έκδοση PHP από τον Tester είναι η 7.1 (για περισσότερες λεπτομέρειες, ανατρέξτε στον πίνακα με τις υποστηριζόμενες εκδόσεις PHP ). Ο προτιμώμενος τρόπος εγκατάστασης είναι ο Composer:

composer require --dev nette/tester

Δοκιμάστε να εκτελέσετε το Nette Tester από τη γραμμή εντολών (χωρίς ορίσματα θα εμφανίσει μόνο μια περίληψη βοήθειας):

vendor/bin/tester

Εκτέλεση δοκιμών

Καθώς η εφαρμογή μας μεγαλώνει, ο αριθμός των δοκιμών μεγαλώνει μαζί της. Δεν θα ήταν πρακτικό να εκτελούμε τις δοκιμές μία προς μία. Για το λόγο αυτό, ο Tester διαθέτει έναν εκτελεστή μαζικών δοκιμών, τον οποίο καλούμε από τη γραμμή εντολών. Η παράμετρος είναι ο κατάλογος στον οποίο βρίσκονται οι δοκιμές. Η τελεία υποδεικνύει τον τρέχοντα κατάλογο.

vendor/bin/tester .

Ο δρομέας Nette Tester αναζητά τον καθορισμένο κατάλογο και όλους τους υποκαταλόγους και αναζητά τις δοκιμές, οι οποίες είναι τα αρχεία *.phpt και *Test.php. Θα βρει επίσης τη δοκιμή μας ArrayTest.php, καθώς ταιριάζει με τη μάσκα.

Στη συνέχεια, ξεκινά τη δοκιμή. Εκτελεί κάθε δοκιμή ως μια νέα διεργασία PHP, έτσι ώστε να εκτελείται εντελώς απομονωμένη από τις άλλες. Τρέχει παράλληλα σε πολλαπλά νήματα, γεγονός που την καθιστά εξαιρετικά γρήγορη. Και εκτελεί πρώτα τις δοκιμές που απέτυχαν κατά την προηγούμενη εκτέλεση, ώστε να γνωρίζετε αμέσως αν διορθώσατε το σφάλμα.

Για κάθε δοκιμή που εκτελείται, ο δρομέας εκτυπώνει έναν χαρακτήρα για να υποδείξει την πρόοδο:

  • . – η δοκιμή πέρασε
  • s – η δοκιμή έχει παραλειφθεί
  • F – η δοκιμή απέτυχε

Η έξοδος μπορεί να μοιάζει ως εξής:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  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 δοκιμές εκτελέστηκαν, μία απέτυχε, μία παραλείφθηκε.

Συνεχίζουμε στο κεφάλαιο Εκτέλεση δοκιμών.

Λειτουργία παρακολούθησης

Ανασχεδιάζετε τον κώδικα; Ή μήπως αναπτύσσετε ακόμη και σύμφωνα με τη μεθοδολογία TDD (Test Driven Development); Τότε θα σας αρέσει η λειτουργία παρακολούθησης. Ο Tester παρακολουθεί τους πηγαίους κώδικες και εκτελείται μόνος του όταν αλλάζει.

Κατά τη διάρκεια της ανάπτυξης, έχετε ένα τερματικό στη γωνία της οθόνης, όπου η πράσινη γραμμή κατάστασης ανάβει πάνω σας, και όταν ξαφνικά γίνεται κόκκινη, ξέρετε ότι μόλις κάνατε κάτι ανεπιθύμητο. Είναι στην πραγματικότητα ένα σπουδαίο παιχνίδι όπου προγραμματίζετε και προσπαθείτε να τηρήσετε το χρώμα.

Η λειτουργία παρακολούθησης ξεκινάει με τη χρήση της παραμέτρου –watch.

Αναφορές CodeCoverage

Ο ελεγκτής μπορεί να δημιουργήσει αναφορές με μια επισκόπηση του πόση ποσότητα πηγαίου κώδικα καλύπτουν οι δοκιμές. Η αναφορά μπορεί να είναι είτε σε μορφή HTML αναγνώσιμη από τον άνθρωπο είτε σε μορφή Clover XML για περαιτέρω μηχανική επεξεργασία.

Δείτε το δείγμα αναφοράς HTML με την κάλυψη κώδικα.

Υποστηριζόμενες εκδόσεις PHP

έκδοση συμβατή με PHP
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

Ισχύει για τις τελευταίες εκδόσεις διορθώσεων.

Μέχρι την έκδοση 1.7 ο Tester υποστήριζε το HHVM 3.3.0 ή νεότερη έκδοση (χρησιμοποιώντας το tester -p hhvm). Η υποστήριξη έχει διακοπεί από το Tester 2.0. Η χρήση ήταν απλή: