Prev Next

Apêndice C. O arquivo de configuração XML

PHPUnit

Os atributos do elemento <phpunit> podem ser usados para configurar a funcionalidade do núcleo do PHPUnit.

<phpunit backupGlobals="true"
backupStaticAttributes="false"
<!--bootstrap="/caminho/para/bootstrap.php"-->
cacheTokens="false"
colors="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
forceCoversAnnotation="false"
mapTestClassNameToCoveredClassName="false"
printerClass="PHPUnit_TextUI_ResultPrinter"
<!--printerFile="/caminho/para/ResultPrinter.php"-->
processIsolation="false"
stopOnError="false"
stopOnFailure="false"
stopOnIncomplete="false"
stopOnSkipped="false"
testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
<!--testSuiteLoaderFile="/caminho/para/StandardTestSuiteLoader.php"-->
strict="false"
verbose="false">
<!-- ... -->
</phpunit>

A configuração XML acima corresponde ao comportamento padrão do executor de teste TextUI documentado na seção chamada “Comutadores de linha-de-comando”.

Opções adicionais que não estão disponíveis como comutadores em linha-de-comando são:

convertNoticesToExceptions, convertWarningsToExceptions, convertErrorsToExceptions

Pode ser usado para desligar a conversão automática de cada notificação/aviso/erro do PHP em uma exceção.

forceCoversAnnotation

A Cobertura de Código só será gravada para testes que usem a anotação @covers documentada na seção chamada @covers.

Suítes de Teste

O elemento <testsuites> e seu(s) um ou mais filhos <testsuite> podem ser usados para compor uma suíte de teste fora das suítes e casos de teste.

<testsuites>
<testsuite name="Minha Suíte de Testes">
<directory>/caminho/para/arquivos/*Test.php</directory>
<file>/caminho/para/MeuTest.php</file>
<exclude>/caminho/para/excluidos</exclude>
</testsuite>
</testsuites>

Usando os atributos phpVersion e phpVersionOperator uma versão exigida do PHP pode ser especificada. O exemplo abaixo só vai adicionar os arquivos /caminho/para/*Test.php e /caminho/para/MeuTest.php se a versão do PHP for no mínio 5.3.0.

 <testsuites>
<testsuite name="Minha Suíte de Testes">
<directory suffix="Test.php" phpVersion="5.3.0" phpVersionOperator=">=">/caminho/para/arquivos</directory>
<file phpVersion="5.3.0" phpVersionOperator=">=">/caminho/para/MeuTest.php</file>
</testsuite>
</testsuites>

O atributo phpVersionOperator é opcional e padronizado para >=.

Grupos

O elemento <groups> e seus filhos <include>, <exclude>, e <group> podem ser usados para selecionar grupos de testes de uma suíte de testes que (não) deveriam ser executadas.

<groups>
<include>
<group>nome</group>
</include>
<exclude>
<group>nome</group>
</exclude>
</groups>

A configuração XML acima corresponde a invocar o executor de testes TextUI com os seguintes comutadores:

  • --group nome

  • --exclude-group nome

Incluindo e Excluindo Arquivos para Cobertura de Código

O elemento <filter> e seus filhos podem ser usados para configurar a lista-negra e lista-branca para o relatório de cobertura de código.

<filter>
<blacklist>
<directory suffix=".php">/caminho/para/arquivos</directory>
<file>/path/to/file</file>
<exclude>
<directory suffix=".php">/caminho/para/arquivos</directory>
<file>/caminho/para/arquivo</file>
</exclude>
</blacklist>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">/caminho/para/arquivos</directory>
<file>/caminho/para/arquivo</file>
<exclude>
<directory suffix=".php">/caminho/para/arquivos</directory>
<file>/caminho/para/arquivo</file>
</exclude>
</whitelist>
</filter>

Registrando

O elemento <logging> e seus filhos <log> podem ser usados para configurar o registro da execução de teste.

<logging>
<log type="coverage-html" target="/tmp/report" charset="UTF-8"
highlight="false" lowUpperBound="35" highLowerBound="70"/>
<log type="coverage-clover" target="/tmp/coverage.xml"/>
<log type="coverage-php" target="/tmp/coverage.serialized"/>
<log type="coverage-text" target="php://stdout" showUncoveredFiles="false"/>
<log type="json" target="/tmp/logfile.json"/>
<log type="tap" target="/tmp/logfile.tap"/>
<log type="junit" target="/tmp/logfile.xml" logIncompleteSkipped="false"/>
<log type="testdox-html" target="/tmp/testdox.html"/>
<log type="testdox-text" target="/tmp/testdox.txt"/>
</logging>

A configuração XML acima corresponde a invocar o executor de teste TextUI com os seguintes comutadores:

  • --coverage-html /tmp/report

  • --coverage-clover /tmp/coverage.xml

  • --coverage-php /tmp/coverage.serialized

  • --coverage-text

  • --log-json /tmp/logfile.json

  • > /tmp/logfile.txt

  • --log-tap /tmp/logfile.tap

  • --log-junit /tmp/logfile.xml

  • --testdox-html /tmp/testdox.html

  • --testdox-text /tmp/testdox.txt

Os atributos charset, highlight, lowUpperBound, highLowerBound, logIncompleteSkipped e showUncoveredFiles não possuem comutador TextUI equivalente.

  • charset: Conjunto de caracteres a ser usado para as páginas HTML geradas.

  • highlight: Quando definidos como true, o código em seus relatórios de cobertura terá a sintaxe destacada.

  • lowUpperBound: Máxima porcentagem de cobertura para ser considerado de "baixamente" coberto.

  • highLowerBound: Mínima porcentagem de cobertura para ser considerado "altamente" coberto.

Ouvintes de Teste

O elemento <listeners> e seus filhos <listener> podem ser usados para anexar ouvintes adicionais de teste para a execução dos testes.

<listeners>
<listener class="MeuOuvinte" file="/caminho/opcional/para/MeuOuvinte.php">
<arguments>
<array>
<element key="0">
<string>Sebastian</string>
</element>
</array>
<integer>22</integer>
<string>Abril</string>
<double>19.78</double>
<null/>
<object class="stdClass"/>
</arguments>
</listener>
</listeners>

A configuração XML acima corresponde a anexar o objeto $ouvinte (veja abaixo) à execução de teste:

$ouvinte = new MeuOuvinte(
array('Sebastian'),
22,
'Abril',
19.78,
NULL,
new stdClass
);

Setting PHP INI settings, Constants and Global Variables

O elemento <php> e seus filhos podem ser usados para definir configurações, constantes e variáveis globais do PHP. Também pode ser usado para preceder o include_path.

<php>
<includePath>.</includePath>
<ini name="foo" value="bar"/>
<const name="foo" value="bar"/>
<var name="foo" value="bar"/>
<env name="foo" value="bar"/>
<post name="foo" value="bar"/>
<get name="foo" value="bar"/>
<cookie name="foo" value="bar"/>
<server name="foo" value="bar"/>
<files name="foo" value="bar"/>
<request name="foo" value="bar"/>
</php>

A configuração XML acima corresponde ao seguinte código PHP:

ini_set('foo', 'bar');
define('foo', 'bar');
$GLOBALS['foo'] = 'bar';
$_ENV['foo'] = 'bar';
$_POST['foo'] = 'bar';
$_GET['foo'] = 'bar';
$_COOKIE['foo'] = 'bar';
$_SERVER['foo'] = 'bar';
$_FILES['foo'] = 'bar';
$_REQUEST['foo'] = 'bar';

Configurando Navegadores para Selenium RC

O elemento <selenium> e seus filhos <browser> podem ser usados para configurar uma lista de servidores Selenium RC.

<selenium>
<browser name="Firefox no Linux"
browser="*firefox /usr/lib/firefox/firefox-bin"
host="my.linux.box"
port="4444"
timeout="30000"/>
</selenium>

O arquivo de configuração XML acima corresponde ao seguinte código PHP:

class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
public static $navegadores = array(
array(
'name' => 'Firefox no Linux',
'browser' => '*firefox /usr/lib/firefox/firefox-bin',
'host' => 'my.linux.box',
'port' => 4444,
'timeout' => 30000
)
);

// ...
}
Prev Next
1. Automatizando Testes
2. Objetivos do PHPUnit
3. Instalando o PHPUnit
PEAR
Composer
PHP Archive (PHAR)
Pacotes opcionais
Atualizando
4. Escrevendo Testes para o PHPUnit
Dependências de Testes
Provedores de Dados
Testando Exceções
Testando Erros PHP
Testando Saídas
Asserções
assertArrayHasKey()
assertClassHasAttribute()
assertClassHasStaticAttribute()
assertContains()
assertContainsOnly()
assertContainsOnlyInstancesOf()
assertCount()
assertEmpty()
assertEqualXMLStructure()
assertEquals()
assertFalse()
assertFileEquals()
assertFileExists()
assertGreaterThan()
assertGreaterThanOrEqual()
assertInstanceOf()
assertInternalType()
assertJsonFileEqualsJsonFile()
assertJsonStringEqualsJsonFile()
assertJsonStringEqualsJsonString()
assertLessThan()
assertLessThanOrEqual()
assertNull()
assertObjectHasAttribute()
assertRegExp()
assertStringMatchesFormat()
assertStringMatchesFormatFile()
assertSame()
assertSelectCount()
assertSelectEquals()
assertSelectRegExp()
assertStringEndsWith()
assertStringEqualsFile()
assertStringStartsWith()
assertTag()
assertThat()
assertTrue()
assertXmlFileEqualsXmlFile()
assertXmlStringEqualsXmlFile()
assertXmlStringEqualsXmlString()
Saída de Erro
Casos Extremos
5. O executor de testes em linha-de-comando
Comutadores de linha-de-comando
6. Ambientes
Mais setUp() que tearDown()
Variantes
Compartilhando Ambientes
Estado Global
7. Organizando Testes
Compondo uma Suíte de Testes usando o Sistema de Arquivos
Compondo uma Suíte de Testes Usando uma Configuração XML
8. Testando Bancos de Dados
Fornecedores Suportados para Testes de Banco de Dados
Dificuldades em Testes de Bancos de Dados
Os quatro estágios dos testes com banco de dados
1. Limpar o Banco de Dados
2. Configurar o ambiente
3–5. Executar Teste, Verificar saída e Teardown
Configuração de Caso de Teste de Banco de Dados do PHPUnit
Implementando getConnection()
Implementando getDataSet()
E quanto ao Esquema do Banco de Dados (DDL)?
Dica: Use seu próprio Caso Abstrato de Teste de Banco de Dados
Entendendo Conjunto de Dados e Tabelas de Dados
Implementações disponíveis
Cuidado com Chaves Estrangeiras
Implementando seus próprios Conjuntos de Dados/ Tabelas de Dados
A API de Conexão
API de Asserções de Banco de Dados
Assertando a contagem de linhas de uma Tabela
Assertando o Estado de uma Tabela
Assertando o Resultado de uma Query
Assertando o Estado de Múltiplas Tabelas
Perguntas Mais Frequentes
O PHPUnit vai (re)criar o esquema do banco de dados para cada teste?
Sou forçado a usar PDO em minha aplicação para que a Extensão para Banco de Dados funcione?
O que posso fazer quando recebo um Erro Too much Connections?
Como lidar com NULL usando Conjuntos de Dados XML Plano / CSV?
9. Testes Incompletos e Pulados
Testes Incompletos
Pulando Testes
Pulando Testes usando @requires
10. Dublês de Testes
Esboços (stubs)
Objetos Falsos
Esboçando e Falsificando Serviços Web
Esboçando o Sistema de Arquivos
11. Práticas de Teste
Durante o Desenvolvimento
Durante a Depuração
12. Desenvolvimento Guiado por Testes
Exemplo da Conta Bancária
13. Desenvolvimento Guiado por Comportamento
Exemplo do Jogo de Boliche
14. Análise de Cobertura de Código
Especificando métodos cobertos
Ignorando Blocos de Código
Incluindo e Excluindo Arquivos
Casos Extremos
15. Outros Usos para Testes
Documentação Ágil
Testes Inter-Equipes
16. Gerador de Esqueleto
Gerando um Esqueleto de Classe de Caso de Teste
Gerando uma Classe Esqueleto de uma Classe de Caso de Teste
17. PHPUnit e Selenium
Servidor Selenium
Instalação
PHPUnit_Extensions_Selenium2TestCase
PHPUnit_Extensions_SeleniumTestCase
18. Registrando
Resultados de Teste (XML)
Resultados de Teste (TAP)
Resultados de Teste (JSON)
Cobertura de Código (XML)
Cobertura de Código (TEXTO)
19. Estendendo o PHPUnit
Subclasse PHPUnit_Framework_TestCase
Escreva asserções personalizadas
Implementando PHPUnit_Framework_TestListener
Subclasse PHPUnit_Extensions_TestDecorator
Implementando PHPUnit_Framework_Test
A. Assertions
B. Anotações
@author
@backupGlobals
@backupStaticAttributes
@codeCoverageIgnore*
@covers
@coversNothing
@dataProvider
@depends
@expectedException
@expectedExceptionCode
@expectedExceptionMessage
@group
@outputBuffering
@requires
@runTestsInSeparateProcesses
@runInSeparateProcess
@test
@testdox
@ticket
C. O arquivo de configuração XML
PHPUnit
Suítes de Teste
Grupos
Incluindo e Excluindo Arquivos para Cobertura de Código
Registrando
Ouvintes de Teste
Setting PHP INI settings, Constants and Global Variables
Configurando Navegadores para Selenium RC
D. Índice
E. Bibliografia
F. Copyright