Ξεκινώντας με το 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. Η χρήση ήταν απλή: