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

Το πιο ορατό μέρος του Nette Tester είναι ο εκτελεστής δοκιμών από τη γραμμή εντολών. Είναι εξαιρετικά γρήγορος και στιβαρός, καθώς εκτελεί αυτόματα όλες τις δοκιμές ως ξεχωριστές διεργασίες και μάλιστα παράλληλα σε πολλαπλά νήματα. Μπορεί επίσης να εκτελείται μόνος του στη λεγόμενη λειτουργία watch.

Τον εκτελεστή δοκιμών τον καλούμε από τη γραμμή εντολών. Ως παράμετρο δίνουμε τον κατάλογο με τις δοκιμές. Για τον τρέχοντα κατάλογο αρκεί να δώσουμε μια τελεία:

vendor/bin/tester .

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

Στη συνέχεια εκτελεί τις δοκιμές. Κατά την εκτέλεση των δοκιμών εκτυπώνει συνεχώς τα αποτελέσματα στο τερματικό ως χαρακτήρες:

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

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

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

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

........s..........................

OK (35 tests, 1 skipped, 1.7 seconds)

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

Εάν καμία δοκιμή δεν αποτύχει, ο κωδικός επιστροφής του Tester είναι μηδέν. Διαφορετικά, ο κωδικός επιστροφής είναι μη μηδενικός.

Ο Tester εκτελεί τις διεργασίες PHP χωρίς php.ini. Λεπτομερέστερα στην ενότητα Προσαρμοσμένο php.ini.

Παράμετροι γραμμής εντολών

Μια επισκόπηση όλων των επιλογών της γραμμής εντολών λαμβάνουμε εκτελώντας τον Tester χωρίς παραμέτρους ή με την παράμετρο -h:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

Usage:
    tester [options] [<test file> | <directory>]...

Options:
    -p <path>                    Specify PHP interpreter to run (default: php).
    -c <path>                    Look for php.ini file (or look in directory) <path>.
    -C                           Use system-wide php.ini.
    -d <key=value>...            Define INI entry 'key' with value 'value'.
    -s                           Show information about skipped tests.
    --stop-on-fail               Stop execution upon the first failure.
    -j <num>                     Run <num> jobs in parallel (default: 8).
    -o <console|console-lines|tap|junit|log|none>  (e.g. -o junit:output.xml)
                                 Specify one or more output formats with optional file name.
    -w | --watch <path>          Watch directory.
    -i | --info                  Show tests environment info and exit.
    --setup <path>               Script for runner setup.
    --temp <path>                Path to temporary directory. Default by sys_get_temp_dir().
    --colors [1|0]               Enable or disable colors.
    --coverage <path>            Generate code coverage report to file.
    --coverage-src <path>        Path to source code.
    -h | --help                  This help.

-p <path>

Καθορίζει το PHP binary που θα χρησιμοποιηθεί για την εκτέλεση των δοκιμών. Η προεπιλογή είναι php.

tester -p /home/user/php-7.2.0-beta/php-cgi tests

-c <path>

Καθορίζει ποιο php.ini θα χρησιμοποιηθεί κατά την εκτέλεση των δοκιμών. Στην προεπιλεγμένη κατάσταση, δεν χρησιμοποιείται κανένα php.ini. Περισσότερα στην ενότητα Προσαρμοσμένο php.ini.

-C

Χρησιμοποιείται το php.ini του συστήματος. Στο UNIX, επίσης όλα τα σχετικά αρχεία INI /etc/php/{sapi}/conf.d/*.ini. Περισσότερα στην ενότητα Προσαρμοσμένο php.ini.

-d <key=value>

Ορίζει την τιμή της οδηγίας διαμόρφωσης PHP για τις δοκιμές. Η παράμετρος μπορεί να χρησιμοποιηθεί πολλές φορές.

tester -d max_execution_time=20

-s

Εμφανίζονται πληροφορίες για τις παραλειφθείσες δοκιμές.

--stop-on-fail

Ο Tester σταματά τις δοκιμές στην πρώτη αποτυχημένη δοκιμή.

-j <num>

Καθορίζει πόσες παράλληλες διεργασίες με δοκιμές θα εκκινηθούν. Η προεπιλεγμένη τιμή είναι 8. Αν θέλουμε όλες οι δοκιμές να εκτελεστούν σειριακά, χρησιμοποιούμε την τιμή 1.

-o <console|console-lines|tap|junit|log|none>

Ορίζει τη μορφή εξόδου. Η προεπιλογή είναι η μορφή για την κονσόλα. Μπορείτε να δώσετε το όνομα του αρχείου στο οποίο θα γραφτεί η έξοδος (π.χ. -o junit:output.xml). Η επιλογή -o μπορεί να επαναληφθεί πολλές φορές για να δημιουργηθούν ταυτόχρονα πολλαπλές μορφές.

  • console: πανομοιότυπο με την προεπιλεγμένη μορφή, αλλά σε αυτήν την περίπτωση δεν εμφανίζεται το λογότυπο ASCII
  • console-lines: παρόμοιο με το console, αλλά το αποτέλεσμα κάθε δοκιμής αναφέρεται σε ξεχωριστή γραμμή με περαιτέρω πληροφορίες
  • tap: μορφή TAP κατάλληλη για μηχανική επεξεργασία
  • junit: μορφή XML JUnit, επίσης κατάλληλη για μηχανική επεξεργασία
  • log: Έξοδοι της πορείας των δοκιμών. Όλες οι αποτυχημένες, παραλειφθείσες και επίσης οι επιτυχημένες δοκιμές
  • none: τίποτα δεν εκτυπώνεται

-w | --watch <path>

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

Είναι χρήσιμο κατά το refactoring μιας βιβλιοθήκης ή τον εντοπισμό σφαλμάτων στις δοκιμές.

tester --watch src tests

-i | --info

Εμφανίζει πληροφορίες για το περιβάλλον εκτέλεσης των δοκιμών. Για παράδειγμα:

tester -p /usr/bin/php7.1 -c tests/php.ini --info

PHP binary:
/usr/bin/php7.1

PHP version:
7.1.7-1+0~20170711133844.5+jessie~1.gbp5284f4 (cli)

Code coverage engines:
(not available)

Loaded php.ini files:
/var/www/dev/demo/tests/php.ini

PHP temporary directory:
/tmp

Loaded extensions:
Core, ctype, date, dom, ereg, fileinfo, filter, hash, ...

--setup <path>

Ο Tester κατά την εκκίνηση φορτώνει το καθορισμένο PHP script. Σε αυτό είναι διαθέσιμη η μεταβλητή Tester\Runner\Runner $runner. Ας υποθέσουμε το αρχείο tests/runner-setup.php με περιεχόμενο:

$runner->outputHandlers[] = new MyOutputHandler;

Εκκινούμε τον Tester:

tester --setup tests/runner-setup.php tests

--temp <path>

Ορίζει τη διαδρομή προς τον κατάλογο για τα προσωρινά αρχεία του Tester. Η προεπιλεγμένη τιμή επιστρέφεται από την sys_get_temp_dir(). Εάν η προεπιλεγμένη τιμή δεν είναι έγκυρη, θα ειδοποιηθείτε.

Εάν δεν είμαστε σίγουροι ποιος κατάλογος χρησιμοποιείται, εκκινούμε τον Tester με την παράμετρο --info.

--colors 1|0

Στην προεπιλεγμένη κατάσταση, ο Tester ανιχνεύει το έγχρωμο τερματικό και χρωματίζει την έξοδό του. Αυτή η επιλογή υπερισχύει της αυτόματης ανίχνευσης. Μπορούμε να ορίσουμε τον χρωματισμό καθολικά με τη μεταβλητή περιβάλλοντος συστήματος NETTE_TESTER_COLORS.

--coverage <path>

Ο Tester θα δημιουργήσει μια αναφορά με επισκόπηση του πόσο πηγαίου κώδικα καλύπτουν οι δοκιμές. Αυτή η επιλογή απαιτεί εγκατεστημένη την επέκταση PHP Xdebug, ή PCOV, ή PHP 7 με PHPDBG SAPI, το οποίο είναι ταχύτερο. Η επέκταση του αρχείου προορισμού καθορίζει τη μορφή του. Είτε HTML είτε Clover XML.

tester tests --coverage coverage.html  # Αναφορά HTML
tester tests --coverage coverage.xml   # Αναφορά Clover XML

Η προτεραιότητα επιλογής μηχανισμού είναι η ακόλουθη:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Κατά τη χρήση του PHPDBG, σε εκτενείς δοκιμές μπορεί να συναντήσουμε αποτυχία της δοκιμής λόγω εξάντλησης μνήμης. Η συλλογή πληροφοριών για τον καλυμμένο κώδικα είναι απαιτητική σε μνήμη. Σε αυτήν την περίπτωση, μας βοηθά η κλήση Tester\CodeCoverage\Collector::flush() μέσα στη δοκιμή. Γράφει τα συλλεγμένα δεδομένα στον δίσκο και απελευθερώνει τη μνήμη. Εάν η συλλογή δεδομένων δεν εκτελείται ή χρησιμοποιείται το Xdebug, η κλήση δεν έχει κανένα αποτέλεσμα.

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

--coverage-src <path>

Χρησιμοποιούμε ταυτόχρονα με την επιλογή --coverage. Το <path> είναι η διαδρομή προς τους πηγαίους κώδικες για τους οποίους δημιουργείται η αναφορά. Μπορεί να χρησιμοποιηθεί επανειλημμένα.

Προσαρμοσμένο php.ini

Ο Tester εκτελεί τις διεργασίες PHP με την παράμετρο -n, πράγμα που σημαίνει ότι δεν φορτώνεται κανένα php.ini. Στο UNIX, ούτε αυτά από το /etc/php/conf.d/*.ini. Αυτό εξασφαλίζει ένα ομοιόμορφο περιβάλλον για την εκτέλεση των δοκιμών, αλλά επίσης απενεργοποιεί όλες τις επεκτάσεις PHP που φορτώνονται συνήθως από το PHP του συστήματος.

Αν θέλετε να διατηρήσετε τη φόρτωση των αρχείων php.ini του συστήματος, χρησιμοποιήστε την παράμετρο -C.

Αν χρειάζεστε κάποιες επεκτάσεις ή ειδικές ρυθμίσεις INI για τις δοκιμές, συνιστούμε τη δημιουργία ενός δικού σας αρχείου php.ini, το οποίο θα διανέμεται με τις δοκιμές. Τον Tester τον εκκινούμε τότε με την παράμετρο -c, για παράδειγμα tester -c tests/php.ini tests, όπου το αρχείο INI μπορεί να μοιάζει κάπως έτσι:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Η εκκίνηση του Tester στο UNIX με το php.ini του συστήματος, για παράδειγμα tester -c /etc/php/cli/php.ini δεν φορτώνει τα υπόλοιπα INI από το /etc/php/conf.d/*.ini. Αυτή είναι μια ιδιότητα της PHP, όχι του Tester.