Capítulo 5. Organizando Testes

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.

Compondo uma Suíte de Testes usando o Sistema de Arquivos

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)

Nota

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)

Nota

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.

Compondo uma Suíte de Testes Usando uma 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>