Prev Next

Capítulo 17. PHPUnit e Selenium

Servidor Selenium

Servidor Selenium é uma ferramenta de testes que permite a você escrever testes automatizados de interface de usuário para aplicações web em qualquer linguagem de programação contra qualquer website HTTP usando um dos principais navegadores. Ele realiza tarefas automatizadas no navegador guiando seu processo através do sistema operacional. O Selenium executa os testes diretamente em um navegador, exatamente como os usuários reais fazem. Esses testes podem ser usados para ambos testes de aceitação (realizando testes de alto-nível no sistema integrado em vez de apenas testar cada unidade do sistema independentemente) e testes de compatibilidade de navegador (testando a aplicação web em diferentes sistemas operacionais e navegadores).

O único cenário suportado do PHPUnit_Selenium é o do servidor Selenium 2.x. O servidor pode ser acessado através da Api clássica Selenium RC, já presente no 1.x, ou com a API WebDriver (parcialmente implementada) do PHPUnit_Selenium 1.2.

A razão por trás dessa decisão é que o Selenium 2 é compatível e o Selenium RC não é mais mantido.

Instalação

Primeiro, instale o Servidor Selenium:

  1. Baixe um arquivo de distribuição do Servidor Selenium.
  2. Descompacte o arquivo de distribuição e copie o selenium-server-standalone-2.9.0.jar (verifique o sufixo da versão) para /usr/local/bin, por exemplo.
  3. Inicie o Servidor Selenium executando java -jar /usr/local/bin/selenium-server-standalone-2.9.0.jar.

Segundo, instale o pacote PHPUnit_Selenium, necessário para acessar nativamente o Servidor Selenium do PHPUnit:

pear install phpunit/PHPUnit_Selenium

Agora podemos enviar comandos para o Servidor Selenium usando seu protocolo cliente/servidor.

PHPUnit_Extensions_Selenium2TestCase

O caso de teste PHPUnit_Extensions_Selenium2TestCase permite a você usar a API WebDriver (parcialmente implementada).

Exemplo 17.1 mostra como testar os conteúdos do elemento <title> do site http://www.example.com/.

Exemplo 17.1: Exemplo de uso para PHPUnit_Extensions_Selenium2TestCase

<?php
class WebTest extends PHPUnit_Extensions_Selenium2TestCase
{
protected function setUp()
{
$this->setBrowser('firefox');
$this->setBrowserUrl('http://www.exemplo.com/');
}

public function testTitle()
{
$this->url('http://www.exemplo.com/');
$this->assertEquals('Página WWW de Exemplo', $this->title());
}

}
?>
phpunit WebTest
PHPUnit 3.6.10 by Sebastian Bergmann.

F

Time: 28 seconds, Memory: 3.00Mb

There was 1 failure:

1) WebTest::testTitle
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'Página WWW de Exemplo'
+'IANA — Domínio de Exemplo'

/home/giorgio/WebTest.php:13

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

Os comandos do Selenium2TestCase são implementados via __call(). Por favor, recorra ao teste de ponta a ponta para o PHPUnit_Extensions_Selenium2TestCase para uma lista de cada característica suportada.

PHPUnit_Extensions_SeleniumTestCase

A extensão de caso de teste PHPUnit_Extensions_SeleniumTestCase implementa o protocolo cliente/servidor para conversar com o Servidor Selenium assim como métodos de asserção especializados para testes web.

Exemplo 17.2 mostra como testar os conteúdos do elemento <title> para o site http://www.exemplo.com/.

Exemplo 17.2: Exemplo de uso para PHPUnit_Extensions_SeleniumTestCase

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
protected function setUp()
{
$this->setBrowser('*firefox');
$this->setBrowserUrl('http://www.exemplo.com/');
}

public function testTitle()
{
$this->open('http://www.exemplo.com/');
$this->assertTitle('Página WWW de Exemplo');
}
}
?>
phpunit WebTest
PHPUnit 3.7.0 by Sebastian Bergmann.

F

Time: 9 seconds, Memory: 6.00Mb

There was 1 failure:

1) WebTest::testTitle
Current URL: http://www.iana.org/dominios/exemplo/

Failed asserting that 'IANA — Domínios de Exemplo' matches PCRE pattern "/Página WWW de Exemplo/".


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

Diferente da classe PHPUnit_Framework_TestCase classes de caso de teste que estendem o PHPUnit_Extensions_SeleniumTestCase têm que prover um método setUp(). Esse método é usado para configurar a sessão do Servidor Selenium. Veja Tabela 17.1 para uma lista de métodos que estão disponíveis para isso.

Tabela 17.1. API do Servidor Selenium: Setup

Método Significado
void setBrowser(string $browser) Define o navegador a ser usado pelo Servidor Selenium.
void setBrowserUrl(string $browserUrl) Define a URL base para os testes.
void setHost(string $host) Define o nome do host para a conexão do Servidor Selenium.
void setPort(int $port) Define a porta de conexão para o Servidor Selenium
void setTimeout(int $timeout) Define o timeout para a conexão do Servidor Selenium.
void setSleep(int $seconds) Define o número de segundos que o cliente do Servidor Selenium deve esperar entre cada envio de comandos de ação para o Servidor Selenium.

O PHPUnit pode opcionalmente fazer uma captura de tela quando um teste do Selenium falha. Para habilitar isso, configure $captureScreenshotOnFailure, $screenshotPath e $screenshotUrl em sua classe de caso de teste como mostrado em Exemplo 17.3.

Exemplo 17.3: Capturando a tela quando um teste falha

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
protected $captureScreenshotOnFailure = TRUE;
protected $screenshotPath = '/var/www/localhost/htdocs/screenshots';
protected $screenshotUrl = 'http://localhost/screenshots';

protected function setUp()
{
$this->setBrowser('*firefox');
$this->setBrowserUrl('http://www.exemplo.com/');
}

public function testTitle()
{
$this->open('http://www.exemplo.com/');
$this->assertTitle('Página WWW de Exemplo');
}
}
?>
phpunit WebTest
PHPUnit 3.7.0 by Sebastian Bergmann.

F

Time: 7 seconds, Memory: 6.00Mb

There was 1 failure:

1) WebTest::testTitle
Current URL: http://www.iana.org/dominios/exemplo/
Screenshot: http://localhost/screenshots/334b080f2364b5f11568ee1c7f6742c9.png

Failed asserting that 'IANA — Domínio de Exemplo' matches PCRE pattern "/Página WWW de Exemplo/".


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

Você pode executar cada teste usando um conjunto de navegadores: Em vez de usar setBrowser() para configurar um navegador, você pode declarar um vetor public static chamado $browsers em sua classe de caso de testes. Cada item nesse vetor descreve uma configuração de navegador. Cada um desses navegadores pode ser hospedado em diferentes Servidores Selenium. Exemplo 17.4 mostra um exemplo.

Exemplo 17.4: Definindo configurações de múltiplos navegadores

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
public static $browsers = array(
array(
'name' => 'Firefox no Linux',
'browser' => '*firefox',
'host' => 'my.linux.box',
'port' => 4444,
'timeout' => 30000,
),
array(
'name' => 'Safari no MacOS X',
'browser' => '*safari',
'host' => 'my.macosx.box',
'port' => 4444,
'timeout' => 30000,
),
array(
'name' => 'Safari no Windows XP',
'browser' => '*custom C:\Program Files\Safari\Safari.exe -url',
'host' => 'my.windowsxp.box',
'port' => 4444,
'timeout' => 30000,
),
array(
'name' => 'Internet Explorer no Windows XP',
'browser' => '*iexplore',
'host' => 'my.windowsxp.box',
'port' => 4444,
'timeout' => 30000,
)
);

protected function setUp()
{
$this->setBrowserUrl('http://www.exemplo.com/');
}

public function testTitle()
{
$this->open('http://www.exemplo.com/');
$this->assertTitle('Página Web de Exemplo');
}
}
?>

PHPUnit_Extensions_SeleniumTestCase pode coletar a informação de cobertura de código para execução de testes através do Selenium:

  1. Copie PHPUnit/Extensions/SeleniumTestCase/phpunit_coverage.php 1. para dentro do diretório raiz de documentos do seu servidor web.
  2. Em seu arquivo de configuração php.ini do servidor web, configure PHPUnit/Extensions/SeleniumTestCase/prepend.php e PHPUnit/Extensions/SeleniumTestCase/append.php como o auto_prepend_file e auto_append_file, respectivamente.
  3. Na sua classe de caso de teste que estende PHPUnit_Extensions_SeleniumTestCase, use
    protected $coverageScriptUrl = 'http://host/phpunit_coverage.php';
    
    para configurar a URL para o script phpunit_coverage.php.

Tabela 17.2 lista os vários métodos de asserção que o PHPUnit_Extensions_SeleniumTestCase fornece.

Tabela 17.2. Asserções

Asserção Significado
void assertElementValueEquals(string $locator, string $text) Relata um erro se o valor do elemento identificado por $locator não é igual ao $text informado.
void assertElementValueNotEquals(string $locator, string $text) Relata um erro se o valor do elemento identificado por $locator é igual ao $text informado.
void assertElementValueContains(string $locator, string $text) Relata um erro se o valor do elemento identificado por $locator não contém o $text informado.
void assertElementValueNotContains(string $locator, string $text) Relata um erro se o valor do elemento identificado por $locator contém o $text informado.
void assertElementContainsText(string $locator, string $text) Relata um erro se o elemento identificado por $locator não contém o $text informado.
void assertElementNotContainsText(string $locator, string $text) Relata um erro se o elemento identificado por $locator contém o $text informado.
void assertSelectHasOption(string $selectLocator, string $option) Relata um erro se a opção informada não estiver disponível.
void assertSelectNotHasOption(string $selectLocator, string $option) Relata um erro se a opção informada estiver disponível.
void assertSelected($selectLocator, $option) Relata um erro se o rótulo informado não estiver selecionado.
void assertNotSelected($selectLocator, $option) Relata um erro se o rótulo informado estiver selecionado.
void assertIsSelected(string $selectLocator, string $value) Relata um erro se o valor informado não estiver selecionado.
void assertIsNotSelected(string $selectLocator, string $value) Relata um erro se o valor informado estiver selecionado.

Tabela 17.3 mostra o método modelo de PHPUnit_Extensions_SeleniumTestCase:

Tabela 17.3. Métodos Modelo

Método Significado
void defaultAssertions() Sobreposição para realizar asserções que são compartilhadas por todos os testes de um caso de teste. Este método é chamado após cada comando ser enviado ao Servidor Selenium.

Por favor, verifique a documentação dos comandos do Selenium para uma referência de todos os comandos disponíveis e como eles são utilizados.

Os comandos do Selenium 1 são implementados dinamicamente via __call. Verifique também a documentação API para PHPUnit_Extensions_SeleniumTestCase_Driver::__call() para uma lista de todos os métodos suportados do lado do PHP, juntamente com argumentos e tipos de retorno quando disponíveis.

Usando o método runSelenese($nomearquivo) você também pode executar um teste Selenium a partir de sua especificação Selenese/HTML. Além disso, usando o atributo estático $seleneseDirectory, você pode criar automaticamente objetos de teste a partir de um diretório que contenha arquivos Selenese/HTML. O diretório especificado é pesquisado recursivamente por arquivos .htm que possam conter Selenese/HTML. Exemplo 17.5 mostra um exemplo.

Exemplo 17.5: Usando um diretório de arquivos Selenese/HTML como testes

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class SeleneseTests extends PHPUnit_Extensions_SeleniumTestCase
{
public static $seleneseDirectory = '/caminho/para/arquivos';
}
?>

Desde o Selenium 1.1.1, um recurso experimental foi incluído para permitir ao usuário compartilhar a sessão entre testes. O único caso suportado é compartilhar a sessão entre todos os testes quando um único navegador é usado. Chame PHPUnit_Extensions_SeleniumTestCase::shareSession(true) em seu arquivo bootstrap para permitir o compartilhamento de sessão. A sessão será reiniciada no caso de testes mal-sucedidos (falhos ou incompletos); cabe ao usuário evitar interações entre testes seja resetando cookies ou deslogando da aplicação sob teste (com um método tearDown()).

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