Agile

11 jul, 2011

PHP + Selenium = fácil e legal!

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.

Neste artigo, falaremos sobre testes unitários. E o PHPUnit será abordado para fazer testes em cima de navegação web de verdade, com navegador de verdade, seja ele Safari, Internet Explorer, Firefox ou qualquer outro. Para isso, integraremos 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

Estamos preparando um novo ambiente no portal em que trabalho e decidimos trabalhar com teste unitários. Particularmente, gosto muito do SimpleTest, que é uma ferramenta de testes bem simples, não precisa de nenhum adicional para funcionar e 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 recorro ao SimpleTest, porém, desta vez, optamos por usar PHPUnit por ser mais integrado às 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 testado passando apenas um parâmetro na linha de comando. Isso se chama code coverage (mas é assunto para outro artigo).

Outra ferramenta interessante integrada no PHPUnit é o Selenium. Trata-se de um programa/servidor que manipula diversos servidores. Com ele, podemos 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 é 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.

Sempre relutei para começar a trabalhar com o PHPUnit + Selenium porque o SimpleTest resolvia todos os meus problemas sem precisar instalar o módulo Pear e nem sempre tenho como fazer isso em alguns servidores de clientes. Mas, no caso deste outro portal, temos um controle total sobre o servidor e podemos nos arriscar e testar 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, é preciso 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 Windows, uma vez que Java é multiplataforma. Fazendo isso, um servidor é levantado e posso mandar comandos para ele a fim de que ele repita o comando no navegador que eu quiser. Por exemplo, abra o Firefox e vá até a URL do projeto, coloque o usuário e a senha do admin. Por fim, clique no botão “entrar”, e verifique se a página que abriu tem o texto “Bem vindo, Michael”.

O bacana de o Selenium abrir um servidor é que podemos trabalhar com qualquer linguagem para enviar os dados para ele. 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. O Selenium, 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. Você pode ter o Selenium rodando em um Mac e fazer testes em Safari (do Mac) a partir de um Windows. Isso é bom pra caramba!

Tá, me convenceu, o selenium é bom… 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 detalhes de tranação.

Após instalar o Pear (roda em sistemas Unix e Windows) e o Selenium em sua máquina, você só precisa criar uma classe de testes estendendo a classe PHPUnit_Extensions_SeleniumTestCase. Veja como é simples um código escrito para se conectar no 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 quiser fazer testes mais complexos, verifique a lista de comandos possíveis para o Selenium. Agora, se precisar, pode passar uma lista de servidores ou navegadores em 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 informações mais completas, veja mais detalhes sobre o PHPUnit com Selenium no site oficial do PHPUnit.

É isso!