Um dos objetivos do PHPUnit é que os testes devem ser combináveis: queremos ser capazes de executar qualquer quantidade ou combinação de testes juntos, por exemplo todos os testes para um projeto inteiro, ou os testes para todas as classes de um ambiente que é parte do projeto, ou apenas os testes para uma só classe.
O PHPUnit suporta diferentes formas de organizar testes e combiná-los em uma suíte de testes. Este capítulo mostra as abordagens mais comuns.
Provavelmente o jeito mais fácil de compor uma suíte de testes é manter todos os arquivos-fonte dos casos de teste em um diretório de testes. O PHPUnit pode descobrir automaticamente e executar os testes atravessando recursivamente o diretório de testes.
Vamos dar uma olhada na suíte de testes da biblioteca Object_Freezer
Observando a estrutura de diretórios desse projeto, podemos ver que as classes dos casos de teste no diretório Testes
espelha o pacote e estrutura de classes do Sistema Sob Teste (SST – ou SST: System Under Teste) no diretório
Object
:
Object Tests |-- Freezer |-- Freezer | |-- HashGenerator | |-- HashGenerator | | `-- NonRecursiveSHA1.php | | `-- NonRecursiveSHA1Test.php | |-- HashGenerator.php | | | |-- IdGenerator | |-- IdGenerator | | `-- UUID.php | | `-- UUIDTest.php | |-- IdGenerator.php | | | |-- LazyProxy.php | | | |-- Storage | |-- Storage | | `-- CouchDB.php | | `-- CouchDB | | | | |-- WithLazyLoadTest.php | | | | `-- WithoutLazyLoadTest.php | |-- Storage.php | |-- StorageTest.php | `-- Util.php | `-- UtilTest.php `-- Freezer.php `-- FreezerTest.php
Para executar todos os testes para a biblioteca precisamos apenas apontar o executor de testes em linha-de-comando do PHPUnit para o diretório de teste:
phpunit Tests
PHPUnit 4.2.0 by Sebastian Bergmann.
............................................................ 60 / 75
...............
Time: 0 seconds
OK (75 tests, 164 assertions)
Se você apontar o executor de testes em linha-de-comando do PHPUnit para um diretório, ele irá procurar por arquivos *Test.php
.
Para executar apenas os testes declarados na classe de casos de teste Object_FreezerTest
em Tests/FreezerTest.php
, podemos usar o seguinte comando:
phpunit Tests/FreezerTest
PHPUnit 4.2.0 by Sebastian Bergmann.
............................
Time: 0 seconds
OK (28 tests, 60 assertions)
Para um controle mais refinado sobre quais testes executar, podemos usar o comutador
--filter
:
phpunit --filter testFreezingAnObjectWorks Tests
PHPUnit 4.2.0 by Sebastian Bergmann.
.
Time: 0 seconds
OK (1 test, 2 assertions)
Uma desvantagem dessa abordagem é que não temos controle sobre a ordem em que os testes são executados. Isso pode causar problemas com relação às dependências dos testes, veja “Dependências de Testes”. Na próxima seção você vai ver como pode tornar explícita a ordem de execução de testes usando o arquivo de configuração XML.
O arquivo de configuração XML do PHPUnit (Apêndice B)
também pode ser usado para compor uma suíte de testes.
Exemplo 5.1
mostra um exemplo mínimo que adicionará todas as classes *Test
que forem encontradas em arquivos *Test.php
quando os
Tests
forem atravessados recursivamente.
Exemplo 5.1: Compondo uma Suíte de Testes Usando uma Configuração XML
<phpunit> <testsuites> <testsuite name="Object_Freezer"> <directory>Tests</directory> </testsuite> </testsuites> </phpunit>
A ordem de execução dos testes pode ser explicitada:
Exemplo 5.2: Compondo uma Suíte de Testes Usando uma Configuração XML
<phpunit> <testsuites> <testsuite name="Object_Freezer"> <file>Tests/Freezer/HashGenerator/NonRecursiveSHA1Test.php</file> <file>Tests/Freezer/IdGenerator/UUIDTest.php</file> <file>Tests/Freezer/UtilTest.php</file> <file>Tests/FreezerTest.php</file> <file>Tests/Freezer/StorageTest.php</file> <file>Tests/Freezer/Storage/CouchDB/WithLazyLoadTest.php</file> <file>Tests/Freezer/Storage/CouchDB/WithoutLazyLoadTest.php</file> </testsuite> </testsuites> </phpunit>