Dev/1.X/TDD/InstalandoAsBibliotecasNecessarias

Instalando as bibliotecas necessárias

Índice

  1. PHPUnit
    1. vfsStream
    2. Checkpoint
  2. Selenium
    1. Selenium IDE
    2. Selenium Remote Control
      1. Notas para usuários Debian
      2. Perfil Firefox separado para testes
      3. Proxy
      4. Script de inicialização
      5. Checkpoint

O i-Educar utiliza bibliotecas e softwares livres para a criação e execução de testes unitários e funcionais. Esse guia assume o uso de Linux ou sistemas Unix.

PHPUnit

O  PHPUnit é um framework da família  xUnit de frameworks de testes. Foi desenvolvido para possibilitar o suporte de TDD em projetos que utilizam a linguagem de programação PHP. A escolha do PHPUnit se deu por possuir uma documentação abrangente e pela diversa quantidade de funcionalidades como a integração com ambientes de integração contínua, geração de métricas de cobertura de testes, execução de testes Selenium, entre outras.

O i-Educar utiliza a última versão estável do PHPUnit, a 3.4. A instalação do PHPUnit é bastante simples através do PEAR (PHP Extension and Application Repository).

# pear channel-discover pear.phpunit.de
# pear install phpunit/PHPUnit 

Pronto! Isso é tudo que é necessário para instalar o PHPUnit. Após instalado, você deverá ter registrado no seu path o comando phpunit ao qual lhe possibilitará executar os testes unitários e funcionais criados para o i-Educar:

$ phpunit

Caso o comando não esteja disponível em seu terminal, adicione-o ao seu path (geralmente esse script estará em /usr/bin/phpunit.

vfsStream

 vfsStream é um  stream wrapper que permite a criação de testes que executam comandos de criação de arquivos e diretórios no filesystem, já que cria um filesystem virtual. É muito útil pois evita que os testes criem de fato arquivos e diretórios, tornando os testes unitários lentos de executar.

# pear channel-discover pear.php-tools.net
# pear install pat/vfsStream-alpha

O uso do vfsStream no i-Educar pode ser observado na classe de testes tests/Utils/FileStreamTest.

Checkpoint

Após instalar o PHPUnit e o vfsStream, execute os seguintes comandos para executar os testes unitários do i-Educar:

$ cd /var/www/ieducar/
$ phpunit tests/unit/AllTests.php

Após executar o comando, deverá aparecer um resultado como o seguinte:

 http://farm3.static.flickr.com/2499/3981741855_549262cc1d_o.png

Selenium

O Selenium é um software para a criação e execução de testes funcionais. Ele funciona ao executar testes pré-gravados em um navegador web, o que é ótimo para o teste de casos de uso. É dividido em algumas ferramentas, sendo que, dessas, são usados o  Selenium IDE e o  Selenium Remote Control (RC).

Selenium IDE

O Selenium IDE é uma extension para o Firefox que possibilita a gravação de testes, edição e execução de testes no navegador. Uma das grandes utilidades do Selenium IDE é a possibilidade de exportar um caso de teste gravado para várias linguagens de programação diferentes, entre elas, o PHP.

Para instalar o Selenium IDE, é necessário, antes de tudo, ter o navegador web  Firefox instalado. Após isso, visite a página de  download oficial do projeto Selenium e clique no link Download que está ao lado do nome Selenium IDE (na época desse escrito, a versão era a  1.0.2). Reinicie o Firefox após a instalação e vá até o menu Ferramentas > Selenium IDE para acessar a IDE.

Leia a  documentação oficial para aprender como gravar e executar testes Selenium.

Selenium Remote Control

O Selenium Remote Control é um servidor que permite a execução de testes Selenium em múltiplos navegadores web. Usaremos o RC para executar os testes funcionais das classes PHPUnit. O pré-requisito do Selenium RC é ter o Java instalado.

Na verdade, nenhuma instalação é necessária pois o RC é um JAR executável que possui o servidor Jetty integrado. Faça o download do JAR na página de  download oficial do projeto Selenium, através do link Download que está ao lado do nome Selenium RC (na época desse escrito, a versão era a  1.0.1. Uma sugestão para isso é baixar o jar para /opt:

$ cd /opt
$ wget http://release.seleniumhq.org/selenium-remote-control/1.0.1/selenium-remote-control-1.0.1-dist.zip
$ unzip selenium-remote-control-1.0.1-dist.zip

Após o download, execute o jar:

$ java -jar /opt/selenium-remote-control-1.0.1/selenium-server-1.0.1/selenium-server.jar -interactive

O parâmetro -interactive serve para iniciar o Selenium em modo interativo. Ao executar o comando anterior, você deverá ter o seguinte em seu terminal:

22:12:56.268 INFO - Java: Apple Inc. 11.3-b02-83
22:12:56.270 INFO - OS: Mac OS X 10.5.8 x86_64
22:12:56.271 INFO - v1.0-beta-2 [2571], with Core v1.0-beta-2 [2330]
22:12:56.387 INFO - Version Jetty/5.1.x
22:12:56.388 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
22:12:56.389 INFO - Started HttpContext[/selenium-server,/selenium-server]
22:12:56.390 INFO - Started HttpContext[/,/]
22:12:56.402 INFO - Started SocketListener on 0.0.0.0:4444
22:12:56.402 INFO - Started org.mortbay.jetty.Server@24148662
Entering interactive mode... type Selenium commands here (e.g: cmd=open&1=http://www.yahoo.com)

Como teste, cole o seguinte comando na sessão interativa do Selenium RC:

cmd=getNewBrowserSession&cmd=open&1=*firefox&2=http://www.softwarepublico.gov.br

O comando anterior irá criar uma nova sessão de testes no navegador Firefox e abrirá o endereço http://www.softwarepublico.gov.br. Isso ocorrerá muito rapidamente para ver o site do Portal do Software Público. No entanto, será possível observar a seguinte janela aberta no seu desktop:

 http://farm3.static.flickr.com/2579/3981707481_3c1e1ef62d_o.jpg

Os passos seguintes não são estritamente necessários mas a leitura deles poderá lhe ajudar a evitar problemas que podem causar dor de cabeça para iniciantes:

Notas para usuários Debian

Nas versões mais recentes do Debian, o Firefox fora substituído por um derivado do projeto Debian chamado Iceweasel. Como o Selenium procura pelo Firefox por padrão, é necessário algum trabalho adicional para antes de iniciar o servidor RC e de executar os testes. Para isso, utilize o parâmetro -DfirefoxDefaultPath e informe o caminho do Iceweasel no filesystem:

# java -jar /opt/selenium-remote-control-1.0.1/selenium-server-1.0.1/selenium-server.jar -DfirefoxDefaultPath=/usr/lib/iceweasel/firefox-bin

Perfil Firefox separado para testes

Se você instala extensões Firefox, poderá achar a inicialização do navegador para testes muito lenta em sessões Selenium. Para melhorar a performance durante a execução dos testes no Firefox, crie um perfil Firefox separado. No Linux, isso pode ser feito utilizando o comando firefox -profileManager:

# firefox -profileManager

Uma janela como a seguinte irá aparecer em seu desktop:

 http://farm3.static.flickr.com/2476/3982606210_28d9a6c800_o.png

Clique em novo e dê o nome Selenium para o seu novo perfil. Salve o perfil em um diretório chamado Selenium no home de seu usuário (assim fica fácil copiar o perfil para outros computadores). Assim, você deverá ter o seguinte diretório no seu home:

$ ls ~/Selenium/IceweaselProfile
blocklist.xml      chrome                extensions          foxyproxy.xml   permissions.sqlite  selenium-ide-scripts   xpti.dat
bookmarkbackups    compatibility.ini     extensions.cache    key3.db         places.sqlite       signons3.txt           XUL.mfasl
bookmarks.html     compreg.dat           extensions.ini      localstore.rdf  pluginreg.dat       urlclassifier3.sqlite  ybookmarks.sqlite
Cache              content-prefs.sqlite  extensions.rdf      mimeTypes.rdf   prefs.js            urlclassifierkey3.txt  ybookmarks@yahoo.log
cert8.db           cookies.sqlite        favoriteTags.txt    minidumps       search.sqlite       webappsstore.sqlite
cert_override.txt  downloads.sqlite      formhistory.sqlite  OfflineCache    secmod.db           XPC.mfasl

Feito isso, inicialize o Selenium RC com o parâmetro adicional -firefoxProfileTemplate:

$ java -jar /opt/selenium-remote-control-1.0.1/selenium-server-1.0.1/selenium-server.jar -firefoxProfileTemplate "/home/example/Selenium/IceweaselProfile"

Ao executar os testes funcionais, esse profile separado será utilizado. Mais informações sobre os profiles do Firefox na  documentação de suporte da Mozilla.

Proxy

Caso a rede em que trabalhe tenha um proxy e você precise executar os testes funcionais em uma instalação i-Educar que esteja em um servidor web de sua rede ou até mesmo na Internet, você pode passar as suas credenciais de autenticação no proxy usando os parâmetros -Dhttp.proxyHost, -Dhttp.proxyPort, -Dhttp.proxyUser e -Dhttp.proxyPassword:

java -jar /opt/selenium-remote-control-1.0.1/selenium-server-1.0.1/selenium-server.jar -Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=3128 -Dhttp.proxyUser=proxy_username -Dhttp.proxyPassword=proxy_password

Script de inicialização

Para facilitar a inicialização do Selenium RC Server, crie um script chamado dev_selenium em /usr/bin com o seguinte conteúdo:

#!/bin/bash

java -jar /opt/selenium-remote-control-1.0.1/selenium-server-1.0.1/selenium-server.jar -firefoxProfileTemplate "/home/example/Selenium/IceweaselProfile" -Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=3128 -Dhttp.proxyUser=proxy_username -Dhttp.proxyPassword=proxy_password -interactive -DfirefoxDefaultPath=/usr/lib/iceweasel/firefox-bin

Nota: remova os parâmetros que sejam desnecessários para o seu uso. Por exemplo: caso não utilize um proxy, remova os parâmetros relacionados ou, caso seja usuário Ubuntu, remova o parâmetro firefoxDefaultPath.

Salve o arquivo e dê permissão de execução:

# chmod +x /usr/bin/dev_selenium

Para inicializar o serviço, bastará usar o seguinte comando:

$ dev_selenium

Dessa forma você pode esquecer que os parâmetros supracitados existem, sobrando mais tempo para o que realmente importa!

Checkpoint

Após instalar o Selenium RC, execute os seguintes comandos para executar todos os testes funcionais do i-Educar:

$ cd /var/www/ieducar
$ phpunit tests/functional/AllTests.php

Esses testes demoram um pouco mais para executar do que os testes unitários. Durante a execução dos testes, a janela do Firefox será aberta e fechada algumas vezes; isso ocorre porque o PHPUnit isola cada caso de teste em uma sessão de testes Selenium.