Back-End

21 set, 2011

Usando PHP+Selenium para fazer testes unitários

Publicidade

Quando falamos de desenvolvimento ágil, logo pensamos em programação pareada, quadros de rendimento com tickets e, é claro, testes unitários com integração contínua. E é sobre esses testes unitários que o artigo de hoje vai tratar. No caso, o PHPUnit será abordado para fazer testes em cima de uma navegação web de verdade e com navegador de verdade, seja ele Safari, Internet Explorer, Firefox, ou outro qualquer. Para isso, integrarei Selenium ao PHPUnit, o que é mais fácil do que parece.

Selenium funciona como um servidor que você manda comandos pela sua aplicação e ele redireciona para os navegadores

Em um projeto que estamos desenvolvendo, estamos preparando um novo ambiente e decidimos trabalhar com teste unitários. Como já falei antes, eu gosto muito do SimpleTest, uma ferramenta de testes que, como o próprio nome diz, é simples e não precisa de nenhum adicional para funcionar. Ele ainda consegue fazer testes de navegação sobre as ações básicas, como acessar uma página, clicar em um link, escrever algum dado em campos do formulário, submeter o formulário e verificar se tudo saiu como o planejado. Sempre que preciso, opto por SimpleTest, por ser uma ferramenta simples e rápida.

Desta vez, optamos por usar PHPUnit por ser mais integrado a outras bibliotecas do Pear, ou sistemas que geram relatórios mais completos do que simplesmente verificar se o código funcionou conforme o esperado. Com o PHPUnit, por exemplo, conseguimos verificar qual parte do código ainda não foi testada, passando apenas um parâmetro na linha de comando. Isso se chama code coverage (mas isso é assunto para outro artigo).

Outra ferramenta interessante que é integrada no PHPUnit é o Selenium. O Selenium é um programa/servidor que manipula diversos servidores. Com ele, podemos, por exemplo, abrir um navegador e acessar uma URL, escrever um determinado valor em um campo de texto, ou selecionar determinada opção em um campo do tipo select e verificar se realmente foi feito conforme o plano. A diferença para o SimpleTest, neste caso, é que no Selenium temos um navegador de verdade executando as ações, portanto, conseguimos fazer testes em cima do que pode ser alterado via JavaScript, ou mesmo ver o resultado tanto no Firefox, como no google Chrome, no Opera ou mesmo no Internet Explorer.

Eu sempre relutei para trabalhar com o PHPUnit + Selenium, porque o SimpleTest costumava resolver todos os meus problemas sem que fosse preciso instalar o módulo Pear – e nem sempre tenho como fazer isso em alguns servidores de clientes. Mas, neste caso, temos um controle total sobre o servidor e podemos nos arriscar e testar novas tecnologias, o que nos permite ter uma maior confiança sobre o que escrevemos no código.

Para instalar e executar o Selenium no meu Linux, eu precisei baixar o código binário e escrever a seguinte linha de comando:

java -jar selenium-server-standalone-2.0rc3.jar

O mesmo deve acontecer com o Windows, uma vez que Java é multiplataforma. Fazendo isso, um servidor é levantado e posso mandar comandos para que ele os repita no navegador de minha escolha. Por exemplo, abra o Firefox e vá até a URL do projeto. Coloque o usuário e a senha do admin e, por fim, clique no botão “entrar”, e verifique se a página que abriu tem o texto “Bem vindo, Michael”.

O interessante de o Selenium abrir um servidor é que podemos trabalhar com qualquer linguagem para enviar-lhe os dados. O que a linguagem server side precisa fazer, seja ela Python, PHP, Java, ASP ou qualquer outra, é enviar requisições para o servidor do Selenium, que, por sua vez, pode ser executado em qualquer plataforma. Sendo um servidor, você pode tê-lo em um ambiente Windows e enviar comandos de um Linux. Ou ter o Selenium rodando em um Mac e fazer testes no Safari, da Mac, a partir de um Windows. E isso é realmente um grande facilitador!

O Selenium é bom, mas e o PHPUnit?

O PHPUnit é um framework de testes feito para PHP que já vem com módulo de conexão com o Selenium. Assim, você não precisa saber como deve ser feita a requisição para o server, ou os detalhes de transação.

Após instalar o Pear – que roda em sistemas Unix e Windows – e o Selenium, você só precisa criar uma classe de testes estendendo a classe PHPUnit_Extensions_SeleniumTestCase. Veja como é simples um código escrito para se conectar ao Selenium:

require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class NavegadorTest extends PHPUnit_Extensions_SeleniumTestCase
{
protected function setUp()
{
$this->setBrowser('*firefox'); // indicando qual browser ele vai usar
$this->setBrowserUrl('http://localhost/projeto'); // Qual é a URL que ele vai usar
}

public function testTitle()
{
$this->open('/'); // Com base no setBrowserURL
$this->assertTitle('Isto é um teste'); // Verificando se o títuo é este
}
}

Se você quiser fazer testes mais complexos, verifique a lista de comandos possíveis para o Selenium. Agora, se você precisar, pode passar uma lista de servidores, ou navegadores que você quer fazer os testes. Veja como fica o código, definindo mais navegadores:

require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class NavegadorTest extends PHPUnit_Extensions_SeleniumTestCase
{
protected function setUp()
{
array (
'name' => 'Firefox on Linux',
'browser' => '*firefox',
),
array(
'name' => 'Safari on MacOS X',
'browser' => '*safari',
'host' => '192.168.0.12', // IP da máquina do mac
'port' => 4444,
'timeout' => 30000,
),
array(
'name' => 'Internet Explorer on Windows XP',
'browser' => '*iexplore',
'host' => 'my.windowsxp.box',
'port' => 4444,
'timeout' => 30000,
)
);

protected function setUp()
{
$this->setBrowserUrl('http://192.168.0.1/'); // Servidor acessivel pelas três máquinas
}

public function testTitle()
{
$this->open('/');
$this->assertTitle('Página de exemplo');
}

Para mais informações, veja outros detalhes sobre o PHPUnit com Selenium no site oficial do PHPUnit.