Eseguire dei test su porzioni di codice di un'applicazione con PHPUnit

Testare un'applicazione tramite l'utilizzo di un framework di test è molto importante, soprattutto quando il progetto cambia nel tempo aumentando di complessità.

Pubblicato da ,
Ultima modifica

PHPUnit è una suite di test molto usata per testare applicazioni software PHP

Documentazione PHPUnit

In questo articolo vedremo come creare un semplice test, partendo dall'installazione di PHPUnit tramite Composer, la disposizione delle cartelle supponiamo ad esempio sia la seguente:

  • root/
    •     src/
    •     tests/
    •     composer.json

apriamo il prompt dei comandi e posizioniamoci nella cartella della root del progetto, usiamo il comando

$ cd "percorso cartella root"

e poi eseguiamo il seguente comando per installare PHPUnit

$ composer require --dev phpunit/phpunit

in questo esempio utilizzo una versione >=7 e <8 di PHPUnit poichè la versione di PHP che utilizzo è la 7.1.

Alla fine del processo di download verrà creata una cartella vendor all'interno della quale ci sono tutti i file necessari per effettuare i test e il file autoload.php che utilizzeremo per l'autoload delle classi.

Per verificare che l'installazione è andata a buon fine usiamo il seguente comando per verificare la versione PHPUnit installata

$ ./vendor/bin/phpunit --version

il risultato è il seguente

PHPUnit 3.7.21 by Sebastian Bergmann.

Adesso creiamo un semplice test per la verifica dell'Indirizzo Ip.

La classe IpAddress.php nella cartella src del progetto

src/IpAddress.php

<?php
namespace IpAddress;

class IpAddress
{

    public function IsValidIp(string $ip)
    {
        if (!filter_var($ip, FILTER_VALIDATE_IP))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

questa classe è costituita da un'unica funzione IsValidIp che effettua un controllo dell'indirizzo ip, se è valido restituisce TRUE altrimenti FALSE.

Nella cartella tests salveremo tutti i file per esegiure i test, creiamo la classe IpAddressTest per testare la classe definita prima IpAddress

tests/IpAddressTest.php

<?php
use PHPUnit\Framework\TestCase;
use IpAddress\IpAddress;

class IpAddressTest extends TestCase
{
    protected $ipAddress;

    public function setUp()
    {
        $this->ipAddress = new IpAddress();
    }

    public function testValidIp()
    {

        $this->assertTrue($this
            ->ipAddress
            ->IsValidIp('127.0.0.1'));
    }

    public function testInvalidIp()
    {
        $this->assertFalse($this
            ->ipAddress
            ->IsValidIp('127'));
    }

}

ogni classe che viene creata per effettuare un test deve estendere la classe TestCase, la funzione setUp viene eseguita prima di ogni test, quindi prima di testValidIp e testInvalidIp, l'oggetto da testare è memorizzato all'interno della variabile protetta $ipAddress, evitando così di doverla instanziare in ogni test, la funzione testValidIp verifica se l'ip è valido, questa funzione usa il metodo assertTrue della classe TestCase che verifica se

$this->ipAddress->IsValidIp('127.0.0.1') 

è un valore TRUE, la funzione testInvalidIp verifica se l'ip non è valido, questa funzione usa il metodo assertFalse che verifica se

$this->ipAddress->IsValidIp('127')

è un valore FALSE.

A questo punto per eseguire il test appena creato eseguiamo il comando nel prompt

$ ./vendor/bin/phpunit tests/IpAddressTest.php

il risultato è il seguente

PHPUnit 7.0.0 by Sebastian Bergmann and contributors.

..                                                   2 / 2 (100%)

Time: 197 ms, Memory: 4.00 MB

OK (2 tests, 2 assertions)

in particolare se abbiamo altri test da eseguire usiamo il comando 

$ ./vendor/bin/phpunit tests

in questo modo verranno eseguiti tutti i test contenuti nella cartella tests.