# Δοκιμές κώδικα PHP: PHPUnit και Pest

> PHPUnit και Pest εξηγημένα: εκδόσεις, πρώτες δοκιμές, χρήσιμα είδη δοκιμών και γιατί οι δοκιμές κάνουν τις ενημερώσεις μετά το PHP2Shell ασφαλέστερες και ταχύτερες.

Πηγή: https://phpsos.de/el/php/php-testen/  
Ημερομηνία: 25/10/2026  
Πάροχος: PHP SOS, Επείγουσα βοήθεια PHP και ασφάλεια διακομιστών. Άμεση βοήθεια μέσω WhatsApp: https://wa.me/491736494914?text=%CE%93%CE%B5%CE%B9%CE%B1%20%CF%83%CE%B1%CF%82%2C%20PHP%20SOS%2C%20%CF%87%CF%81%CE%B5%CE%B9%CE%B1%CE%B6%CF%8C%CE%BC%CE%B1%CF%83%CF%84%CE%B5%20%CE%B2%CE%BF%CE%AE%CE%B8%CE%B5%CE%B9%CE%B1%20%CE%BC%CE%B5%20%CF%84%CE%BF%CE%BD%20%CE%B4%CE%B9%CE%B1%CE%BA%CE%BF%CE%BC%CE%B9%CF%83%CF%84%CE%AE%20PHP%20%CE%BC%CE%B1%CF%82.%20%CE%95%CF%84%CE%B1%CE%B9%CF%81%CE%B5%CE%AF%CE%B1%3A%20%E2%80%A6%20%CE%99%CF%83%CF%84%CF%8C%CF%84%CE%BF%CF%80%CE%BF%CF%82%3A%20%E2%80%A6

**Εν συντομία:** Το PHPUnit είναι το βασικό εργαλείο για την αυτόματη δοκιμή κώδικα PHP· το Pest είναι ένα framework που βασίζεται σε αυτό, με συντομότερη γραφή. Τρέχον είναι το PHPUnit 13 (από τον Φεβρουάριο 2026, από την PHP 8.4), το Pest βρίσκεται στην έκδοση 5. Οι αυτόματες δοκιμές δεν κλείνουν ευπάθειες ασφαλείας στην ίδια την PHP, κάνουν όμως τις ενημερώσεις προγραμματίσιμες: μετά το PHP2Shell και πριν από το τέλος υποστήριξης της PHP 8.2 στις 31.12.2026, αυτό είναι το αποφασιστικό πλεονέκτημα.

## Γιατί να δοκιμάζεται ο κώδικας PHP;

Για τη διοίκηση, το όφελος συνοψίζεται σε μία πρόταση: οι δοκιμές κάνουν τις αλλαγές φθηνότερες και ασφαλέστερες. Μια αυτόματη δοκιμή ελέγχει σε δευτερόλεπτα αν μια συνάρτηση κάνει ακόμη ό,τι πρέπει, για παράδειγμα αν ένα καλάθι υπολογίζει σωστά ή αν μια σύνδεση απορρίπτει λανθασμένους κωδικούς πρόσβασης. Χωρίς δοκιμές, αυτό το ελέγχει κάποιος με το χέρι, ή κανείς.

Η διαφορά φαίνεται ιδιαίτερα στις ενημερώσεις. Όταν η PHP πρέπει να ενημερωθεί σύντομα λόγω κρίσιμης ευπάθειας, πολλοί διαχειριστές διστάζουν, επειδή φοβούνται σφάλματα στο ηλεκτρονικό κατάστημα ή στην πύλη πελατών. Με ένα σύνολο δοκιμών, η ενημέρωση εκτελείται πρώτα σε ένα περιβάλλον δοκιμών, οι δοκιμές δείχνουν τα προβλήματα και μετά η εφαρμογή περνά σε λειτουργία.

## PHPUnit: το πρότυπο για δοκιμές PHP

Το PHPUnit κυκλοφορεί κάθε χρόνο τον Φεβρουάριο με νέα κύρια έκδοση. Κάθε έκδοση προϋποθέτει μια ελάχιστη έκδοση PHP και λαμβάνει περίπου δύο χρόνια διορθώσεις σφαλμάτων. Σύμφωνα με το phpunit.de ισχύει:

| PHPUnit | Κυκλοφόρησε | Προϋπόθεση PHP | Διορθώσεις σφαλμάτων έως |
|---|---|---|---|
| 13 | 06.02.2026 | από PHP 8.4 | 04.02.2028 |
| 12 | 07.02.2025 | από PHP 8.3 | 05.02.2027 |
| 11 | 02.02.2024 | από PHP 8.2 | 06.02.2026 |
| 10 | 03.02.2023 | από PHP 8.1 | 07.02.2025 |

Ο πίνακας δείχνει μια πρακτική σχέση: ένα έργο που χρησιμοποιεί ακόμη το PHPUnit 10, συνήθως εκτελείται και σε παλιά έκδοση PHP. Τα εργαλεία δοκιμών και η έκδοση PHP πρέπει να αναβαθμίζονται μαζί. Το PHPUnit εγκαθίσταται συνήθως μέσω του [Composer](https://phpsos.de/el/php/composer/) ως εξάρτηση ανάπτυξης.

## Μια πρώτη δοκιμή με το PHPUnit

Μια δοκιμή είναι μια κλάση που κληρονομεί από την `PHPUnit\Framework\TestCase`. Οι μέθοδοι δοκιμής είναι δημόσιες και ξεκινούν με `test`, εναλλακτικά σημαίνονται με το χαρακτηριστικό `#[Test]`. Το παράδειγμα ελέγχει μια απλή συνάρτηση υπολογισμού τιμής:

```php
<?php declare(strict_types=1);

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;

final class BruttopreisTest extends TestCase
{
    public static function preise(): array
    {
        return [
            'Normalsatz'   => [10000, 19, 11900],
            'Ermäßigt'     => [10000, 7, 10700],
            'Null bleibt Null' => [0, 19, 0],
        ];
    }

    #[DataProvider('preise')]
    public function testBruttopreisInCent(int $netto, int $satz, int $erwartet): void
    {
        $this->assertSame($erwartet, bruttopreis($netto, $satz));
    }
}
```

Ο data provider παρέχει πολλές περιπτώσεις για την ίδια δοκιμή. Σύμφωνα με την τεκμηρίωση του PHPUnit πρέπει να είναι δημόσιος και στατικός. Οι υπολογισμοί γίνονται σε λεπτά (cent) ως ακέραιος, ώστε να μην προκύπτουν σφάλματα στρογγυλοποίησης από αριθμούς κινητής υποδιαστολής. Το σύνολο εκτελείται με `./vendor/bin/phpunit`, όταν το PHPUnit έχει εγκατασταθεί μέσω Composer.

## Pest: η ίδια βάση, συντομότερη γραφή

Το Pest βασίζεται σύμφωνα με την τεκμηρίωση στο PHPUnit. Οι δοκιμές γράφονται ως συναρτήσεις με `it()` ή `test()` και οι προσδοκίες με `expect()`. Το Pest 5 προϋποθέτει PHP 8.4. Η εγκατάσταση σύμφωνα με την τεκμηρίωση:

```bash
composer remove phpunit/phpunit
composer require pestphp/pest --dev --with-all-dependencies
./vendor/bin/pest --init
```

Η ίδια δοκιμή στη γραφή του Pest:

```php
<?php
it('berechnet den Bruttopreis zum Normalsatz', function () {
    expect(bruttopreis(10000, 19))->toBe(11900);
});
```

Τις υπάρχουσες δοκιμές PHPUnit τις μετατρέπει σε μεγάλο βαθμό αυτόματα το πρόσθετο `pestphp/pest-plugin-drift`. Ποια γραφή θα επιλέξει μια ομάδα είναι θέμα γούστου· το αποφασιστικό είναι οι δοκιμές να εκτελούνται τακτικά.

## Ποια είδη δοκιμών έχουν νόημα

1. **Δοκιμές μονάδας (unit):** ελέγχουν μεμονωμένες συναρτήσεις και κλάσεις χωρίς βάση δεδομένων ή δίκτυο.
2. **Δοκιμές ενσωμάτωσης:** ελέγχουν τη συνεργασία με βάση δεδομένων, σύστημα αρχείων ή διεπαφές.
3. **Λειτουργικές δοκιμές μέσω HTTP:** καλούν σελίδες και φόρμες, όπως θα έκανε ένα πρόγραμμα περιήγησης.
4. **Δοκιμές παλινδρόμησης ασφαλείας:** καταγράφουν διορθωμένα σφάλματα, για παράδειγμα ότι οι έξοδοι μασκάρονται με `htmlspecialchars()` ή ότι μια σύνδεση αποτυγχάνει μετά από λάθος κωδικό.
5. **Smoke tests μετά την ανάπτυξη:** λίγοι γρήγοροι έλεγχοι για το αν ο ζωντανός ιστότοπος ανταποκρίνεται μετά από μια ενημέρωση.

Συμπληρωματικά προς τις δοκιμές, η [στατική ανάλυση με PHPStan και Psalm](https://phpsos.de/el/php/statische-analyse/) εντοπίζει σφάλματα χωρίς να εκτελεί τον κώδικα.

## Οι δοκιμές ως δίχτυ ασφαλείας για ενημερώσεις και PHP2Shell

Το PHP2Shell έδειξε πόσο σύντομος μπορεί να είναι ο χρόνος μεταξύ δημοσίευσης και πίεσης για δράση: ανακοίνωση στις 20.10.2026, patches στις 21.10.2026, προειδοποίηση του BSI (Ομοσπονδιακό Γραφείο Ασφάλειας Πληροφοριών της Γερμανίας) επιπέδου πορτοκαλί. Όποιος είχε σύνολο δοκιμών, μπορούσε να εγκαταστήσει την PHP 8.4.27 ή 8.3.36 σε περιβάλλον δοκιμών, να εκτελέσει τις δοκιμές και να περάσει σε λειτουργία την ίδια μέρα. Χωρίς δοκιμές συχνά έμενε μόνο η επιλογή ανάμεσα σε μια ανέλεγκτη ενημέρωση και μια ανοιχτή ευπάθεια.

Ακόμη μεγαλύτερο είναι το όφελος κατά την αλλαγή κύριας έκδοσης. Για την PHP 8.1 και παλαιότερες δεν υπάρχουν πλέον επίσημες ενημερώσεις και η PHP 8.2 τελειώνει στις 31.12.2026, όπως εξηγεί η σελίδα [Τέλος ζωής της PHP](https://phpsos.de/el/ratgeber/php-end-of-life-risiken/). Μια εκτέλεση δοκιμών απέναντι στην έκδοση-στόχο δείχνει νωρίς ποιες παρωχημένες συναρτήσεις πρέπει να αντικατασταθούν. Έχει νόημα ένα pipeline CI που εκτελεί τις δοκιμές σε πολλές εκδόσεις PHP, μαζί με μια ματιά σε release candidates όπως η PHP 8.6.0, ποτέ όμως στην παραγωγή.

> **Συμβουλή:**
> Γράψτε μια δοκιμή για κάθε διορθωμένο σφάλμα ασφαλείας στην εφαρμογή σας. Έτσι διασφαλίζετε ότι το ίδιο σφάλμα δεν θα επιστρέψει σε μια μεταγενέστερη αλλαγή.

## Πώς βοηθά συγκεκριμένα η PHP SOS;

Στη [μετάβαση από την PHP 8.1 και παλαιότερες](https://phpsos.de/el/leistungen/php-migration-legacy/) και στις τρέχουσες ενημερώσεις υποστηρίζουμε ως εξής:

- **Αξιολόγηση του υπάρχοντος:** Ποιες δοκιμές υπάρχουν, ποια έκδοση PHP και PHPUnit εκτελείται, πού λείπουν δοκιμές για κρίσιμες διαδικασίες;
- **Δημιουργία ελάχιστης κάλυψης:** Μαζί με την ομάδα ανάπτυξης ή το πρακτορείο σας ασφαλίζουμε με δοκιμές τη σύνδεση, τις φόρμες και τις διαδρομές παραγγελιών.
- **Δοκιμή των ενημερώσεων:** Οι νέες εκδόσεις PHP εκτελούνται πρώτα σε περιβάλλον δοκιμών απέναντι στο σύνολο δοκιμών.
- **Τεκμηρίωση του αποτελέσματος:** Λαμβάνετε αποτελέσματα δοκιμών και επίπεδα εκδόσεων ως απόδειξη για το βήμα patch ή μετάβασης.


## Συχνές ερωτήσεις

**Ποια έκδοση PHPUnit χρειάζομαι;**  
Εξαρτάται από την έκδοση PHP σας. Το PHPUnit 13 προϋποθέτει PHP 8.4, το PHPUnit 12 PHP 8.3 και το PHPUnit 11 PHP 8.2. Ο τρέχων πίνακας βρίσκεται στο phpunit.de στις υποστηριζόμενες εκδόσεις.

**Είναι το Pest αντικατάσταση του PHPUnit;**  
Το Pest βασίζεται σύμφωνα με τη δική του τεκμηρίωση στο PHPUnit και προσφέρει συντομότερη γραφή. Οι υπάρχουσες δοκιμές PHPUnit μπορούν να μετατραπούν σε μεγάλο βαθμό αυτόματα με το πρόσθετο Drift, ορισμένες πρέπει να προσαρμοστούν με το χέρι.

**Βοηθούν οι δοκιμές κατά των ευπαθειών ασφαλείας της ίδιας της PHP;**  
Όχι άμεσα. Ευπάθειες όπως το PHP2Shell βρίσκονται στον διερμηνέα και κλείνουν με ενημέρωση της PHP. Οι δοκιμές φροντίζουν όμως ώστε να μπορείτε να εγκαταστήσετε αυτή την ενημέρωση γρήγορα, χωρίς φόβο για απαρατήρητα σφάλματα στην εφαρμογή.

**Πόσες δοκιμές αρκούν;**  
Δεν υπάρχει σταθερός αριθμός. Έχει νόημα να καλύπτονται πρώτα οι κρίσιμες για την επιχείρηση διαδρομές: σύνδεση, παραγγελία, φόρμες, διεπαφές. Στη συνέχεια η κάλυψη δοκιμών αυξάνεται με κάθε αλλαγή και κάθε διορθωμένο σφάλμα.

## Πηγές

- [PHPUnit](https://phpunit.de/)
- [Pest](https://pestphp.com/)
- [php.net: Υποστηριζόμενες εκδόσεις PHP](https://www.php.net/supported-versions.php)
