Ξεκινώντας με το Nette Tester
Ακόμα και οι καλοί προγραμματιστές κάνουν λάθη. Η διαφορά μεταξύ ενός καλού και ενός κακού προγραμματιστή είναι ότι ο καλός το κάνει μόνο μία φορά και την επόμενη φορά το εντοπίζει με αυτοματοποιημένες δοκιμές.
- “Όποιος δεν δοκιμάζει, είναι καταδικασμένος να επαναλαμβάνει τα λάθη του.” (παροιμία)
- “Μόλις απαλλαγούμε από ένα λάθος, εμφανίζεται ένα άλλο.” (Νόμος του Murphy)
- “Κάθε φορά που έχετε την ανάγκη να εκτυπώσετε μια μεταβλητή στην οθόνη, γράψτε καλύτερα μια δοκιμή.” (Martin Fowler)
Έχετε γράψει ποτέ παρόμοιο κώδικα σε PHP;
$obj = new MyClass;
$result = $obj->process($input);
var_dump($result);
Δηλαδή, εκτυπώσατε το αποτέλεσμα της κλήσης της συνάρτησης μόνο για να επαληθεύσετε με το μάτι ότι επιστρέφει αυτό που πρέπει; Σίγουρα το κάνετε πολλές φορές την ημέρα. Με το χέρι στην καρδιά: στην περίπτωση που όλα λειτουργούν σωστά, διαγράφετε αυτόν τον κώδικα; Περιμένετε ότι η κλάση δεν θα χαλάσει στο μέλλον; Οι νόμοι του Murphy εγγυώνται το αντίθετο :-)
Βασικά, γράψατε μια δοκιμή. Απλά πρέπει να την τροποποιήσετε ελαφρώς, ώστε να μην απαιτεί οπτικό έλεγχο, αλλά να ελέγχεται μόνη της. Και αν δεν διαγράψετε τη δοκιμή, μπορείτε να την εκτελέσετε οποιαδήποτε στιγμή στο μέλλον και να επαληθεύσετε ότι όλα εξακολουθούν να λειτουργούν όπως πρέπει. Με τον καιρό θα δημιουργήσετε μεγάλο αριθμό τέτοιων δοκιμών, οπότε θα ήταν χρήσιμο να τις εκτελείτε αυτοματοποιημένα.
Και σε όλα αυτά θα σας βοηθήσει ακριβώς το Nette Tester.
Τι κάνει τον Tester μοναδικό;
Η συγγραφή δοκιμών για το Nette Tester είναι μοναδική στο ότι κάθε δοκιμή είναι ένα συνηθισμένο PHP script που μπορεί να εκτελεστεί αυτόνομα.
Δηλαδή, όταν γράφετε μια δοκιμή, μπορείτε απλά να την εκτελείτε και να διαπιστώνετε αν υπάρχει, για παράδειγμα, κάποιο προγραμματιστικό λάθος σε αυτήν. Αν λειτουργεί σωστά. Αν όχι, μπορείτε εύκολα να την κάνετε βήμα-βήμα στο IDE σας και να αναζητήσετε το λάθος. Μπορείτε ακόμη και να την ανοίξετε στον browser.
Και κυρίως – με την εκτέλεσή της, εκτελείτε τη δοκιμή. Διαπιστώνετε
αμέσως αν πέρασε ή απέτυχε. Πώς; Ας το δείξουμε. Θα γράψουμε μια
τετριμμένη δοκιμή εργασίας με έναν πίνακα PHP και θα την αποθηκεύσουμε
στο αρχείο ArrayTest.php
:
<?php
use Tester\Assert;
require __DIR__ . '/vendor/autoload.php'; # φόρτωση του Composer autoloader
Tester\Environment::setup(); # αρχικοποίηση του Nette Tester
$stack = [];
Assert::same(0, count($stack)); # περιμένουμε ότι το count() θα επιστρέψει μηδέν
$stack[] = 'foo';
Assert::same(1, count($stack)); # περιμένουμε ότι το count() θα επιστρέψει ένα
Assert::contains('foo', $stack); # επαληθεύουμε ότι το $stack περιέχει το στοιχείο 'foo'
Όπως βλέπετε, οι λεγόμενες μέθοδοι assertion
όπως 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 (λεπτομερέστερα στον πίνακα podporované verze PHP). Ο προτιμώμενος τρόπος εγκατάστασης είναι μέσω Composer:
composer require --dev nette/tester
Δοκιμάστε να εκτελέσετε τον Nette Tester από τη γραμμή εντολών (χωρίς παραμέτρους εκτυπώνει μόνο τη βοήθεια):
vendor/bin/tester
Εκτέλεση δοκιμών
Καθώς η εφαρμογή μεγαλώνει, ο αριθμός των δοκιμών αυξάνεται μαζί της. Δεν θα ήταν πρακτικό να εκτελούμε τις δοκιμές μία προς μία. Γι' αυτό ο Tester διαθέτει έναν μαζικό εκτελεστή δοκιμών, τον οποίο καλούμε από τη γραμμή εντολών. Ως παράμετρο δίνουμε τον κατάλογο στον οποίο βρίσκονται οι δοκιμές. Η τελεία σημαίνει τον τρέχοντα κατάλογο.
vendor/bin/tester .
Ο εκτελεστής δοκιμών θα σαρώσει τον καθορισμένο κατάλογο και όλους
τους υποκαταλόγους και θα αναζητήσει δοκιμές, οι οποίες είναι αρχεία
*.phpt
και *Test.php
. Θα βρει έτσι και τη δοκιμή μας
ArrayTest.php
, καθώς ταιριάζει με τη μάσκα.
Στη συνέχεια, θα ξεκινήσει τις δοκιμές. Κάθε δοκιμή την εκτελεί ως νέα διεργασία PHP, οπότε εκτελείται εντελώς απομονωμένα από τις άλλες. Τις εκτελεί παράλληλα σε πολλαπλά νήματα και χάρη σε αυτό είναι εξαιρετικά γρήγορος. Και ως πρώτες εκτελεί τις δοκιμές που απέτυχαν στην προηγούμενη εκτέλεση, οπότε μαθαίνετε αμέσως αν καταφέρατε να διορθώσετε το σφάλμα.
Κατά την εκτέλεση των δοκιμών, ο Tester εκτυπώνει συνεχώς τα αποτελέσματα στο τερματικό ως χαρακτήρες:
.
– η δοκιμή πέρασεs
– η δοκιμή παραλείφθηκε (skipped)F
– η δοκιμή απέτυχε (failed)
Η έξοδος μπορεί να μοιάζει κάπως έτσι:
_____ ___ ___ _____ ___ ___ |_ _/ __)( __/_ _/ __)| _ ) |_| \___ /___) |_| \___ |_|_\ 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 δοκιμές, μία απέτυχε, μία παραλείφθηκε.
Περαιτέρω συνεχίζουμε στο κεφάλαιο Εκτέλεση δοκιμών.
Λειτουργία Watch
Κάνετε refactoring στον κώδικα; Ή μήπως αναπτύσσετε σύμφωνα με τη μεθοδολογία TDD (Test Driven Development); Τότε θα σας αρέσει η λειτουργία watch. Ο Tester σε αυτήν παρακολουθεί τους πηγαίους κώδικες και κατά την αλλαγή εκτελείται μόνος του.
Κατά την ανάπτυξη, έχετε λοιπόν στη γωνία της οθόνης ένα τερματικό, όπου σας φωτίζει μια πράσινη γραμμή κατάστασης, και όταν ξαφνικά αλλάξει σε κόκκινη, ξέρετε ότι μόλις κάνατε κάτι όχι εντελώς καλά. Είναι στην πραγματικότητα ένα υπέροχο παιχνίδι, όπου προγραμματίζετε και προσπαθείτε να κρατήσετε το χρώμα.
Η λειτουργία Watch ξεκινά με την παράμετρο –watch.
Αναφορές CodeCoverage
Ο Tester μπορεί να δημιουργήσει αναφορές με επισκόπηση του πόσο πηγαίου κώδικα καλύπτουν οι δοκιμές. Η αναφορά μπορεί να είναι είτε σε μορφή 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 |
Ισχύει για την τελευταία έκδοση patch.
Ο Tester μέχρι την έκδοση 1.7 υποστήριζε επίσης το HHVM
3.3.0 ή νεότερη (μέσω tester -p hhvm
). Η υποστήριξη διακόπηκε από την
έκδοση Tester 2.0.