Recursos:
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
<?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.
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
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
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':
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:
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:
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