IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Instal·lació

Recursos:

Instal·lació amb composer

El podeu trobar a Packagist:

https://packagist.org/packages/phpunit/phpunit

El nom:

phpunit/phpunit

Per tant només cal definir/afegir la dependència al fitxer composer.json:

...
"require-dev": {
       "phpunit/phpunit": "4.5.*"
   }
...

O podeu utilitzar la comanda:

$ composer global require "phpunit/phpunit=4.5.*"

per una instal·lació local o

$ composer require "phpunit/phpunit=4.5.*"

Ara podeu executar:

$ composer update

Recursos

Assertions

Comprovar un text de sortida d'un test. expectOutputString

<?php
class OutputTest extends PHPUnit_Framework_TestCase
{
    public function testExpectFooActualFoo()
    {
        $this->expectOutputString('foo');
        print 'foo';
    }

    public function testExpectBarActualBaz()
    {
        $this->expectOutputString('bar');
        print 'baz';
    }
}
?>
phpunit OutputTest
PHPUnit 4.5.0 by Sebastian Bergmann and contributors.

.F

Time: 0 seconds, Memory: 5.75Mb

There was 1 failure:

1) OutputTest::testExpectBarActualBaz
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'bar'
+'baz'


FAILURES!
Tests: 2, Assertions: 2, Failures: 1.

Fixtures

Fixture (http://dictionary.reference.com/browse/fixture) és el concepte que s'utilitza per definir el estat conegut (o esperat) que ha de tenir el nostre test abans de poder provar-lo (inicialitzacions d'objectes, configuració d'entorn, base de dades, etc). Per facilitar la preparació de cada test tenim el mètode setUp() que s'executa just abans de cada test i per restaurar l'estat tenim el mètode tearDown() que s'executa després de cada test.

NOTA: Si el nostre conjunts de test (aka testSuite) té 5 tests això vol dir que s'executaran les funcions setUp i TearDown 5 vegades és a dir tans cops com testos possibles

Per alguns casos repetir tans cops l'execució de setUp i TearDown pot ser no gaire eficient (per exemple per a preparar una connexió a la base de dades) i en aquest casos es poden utilitzar els mètodes setUpBeforeClass() and tearDownAfterClass() que s'executan només abans d'executar el primer test i després d'executar el últim test.

Recursos

Mètode setUp()

Mètode tearDown()

Anotacions #after i @before

Pot semblar una forma "redundant" d'especificar setUp i tearDown però en alguns casos pot ser interessant (per exemple utilitzant traits de PHP):

http://www.whitewashing.de/2015/02/14/phpunit_before_annotations_and_traits_for_code_reuse.html

setUpBeforeClass() i tearDownAfterClass()

Excepcions

Sintaxi alternativa:

es pot utilitzar el mètode fail per indicar un error en cas NO succeeixi una excepció i return sense valor per passar el test correctament en cas d'exepció!.

<?php
class ExceptionTest extends PHPUnit_Framework_TestCase {
    public function testException() {
        try {
            // ... Code that is expected to raise an exception ...
        }

        catch (InvalidArgumentException $expected) {
            return;
        }

        $this->fail('An expected exception has not been raised.');
    }
}
?>

Recursos':

Errors PHP

IMPORTANT: Cal tenir en compte que PHPUnit converteix els errors en excepcions i per tant el codi després d'un error no s'executa i per tant tot el codi darrera d'un errors no serà testejat [1]

Recursos:

Exemples

Tests amb sistemes de fitxers. Mocking filesystem

https://laracasts.com/lessons/testing-with-virtual-file-systems. Utilitza PHPSpec però explica molt bé vfsStream

Segons la documentació de PHPUnit (vegeu l'apartat Mocking the filesystem) és recomanable sinó imprescindible utilitzar Mocking per a fer tests relacionats amb el sistema de fitxers. És recomana l'ús de la llibreria:

vfsStream

IMPORTANT: Tingueu en compte que provar un sistema de fitxers depèn moltíssim del sistema de fitxers. Us poso alguns exemples: no és el mateix provar el sistema de fitxers amb Windows que amb Linux (o altres SO), no és el mateix fer els testos com a un usuari normal que com a root, no és el mateix al servidor de desenvolupament que a servidor d'explotació, no és el mateix executar els tests en local que executar-los a Travis, etc. Per això existeixen els Mocks i en aquest cas el Mocking del sistema de fitxers

.

Exemple 1. Comprovant que un fitxer, és llegible i té un contingut especific

Imagineu la classe:

class FooBar
{
    public function getArrayFromFile($file)
    {
        if (!is_readable($file)) {
            return [];
        }

        return include $file;
    }
}

I que volem comrpovar que el contingut és:

[
...
];

El test podria ser:

public function testGetArrayFromFile() {
    $root = vfsStream::setup();
    $expectedContent = ['foo' => 'bar'];
    $file = vfsStream::newFile('test')->withContent($expectedContent);
    $root->addChild($file);

    $foo = new FooBar();
    $result = $foo->getArrayFromFile('vfs://test');

    $this->assertEquals($expectedContent, $result);
}

public function testUnreadableFile() {
    $root = vfsStream::setup();

    //2nd parameter sets permission on the file.
    $file = vfsStream::newFile('test', 0000); 
    $root->addChild($file);

    $foo = new FooBar();
    $result = $foo->getArrayFromFile('vfs://test');

    $this->assertEquals([], $result);
}

Recursos:

Exemple bootstrap-app/apache

Vegeu un exemple de com no fer el tests consultant el tag 0.1 del repositori github de:

https://github.com/bootstrap-app/apache

A les següents versions es va afegir el suport per a tests amb vfsStream

Troubleshooting. Resol·lució de problemes

Mostrar errors PHP durant l'execució de phpunit

Vegeu també

Enllaços externs