Visão Geral da Arquitetura
Para estabelecer uma suíte de testes automatizados robusta para aplicações web, a combinação de Selenium, JUnit, Apache Ant e Coverlipse oferece uma solução integrada. Esta abordagem permite a gravação de interações, execução de testes, geração de relatórios detalhados e análise de cobertura de código, garantindo maior confiabilidade nas entregas de software.
Componentes do Framework
| Componente | Função no Framework |
|---|---|
| JUnit | Framework de testes unitários para estruturar, organizar e executar as suítes de teste em Java. |
| Selenium IDE | Extensão de navegador para gravação de fluxos de usuário e exportação de código base. |
| Selenium Server | Serviço central que traduz comandos da API Java para ações nativas no navegador de destino. |
| Coverlipse | Plugin para IDE que mapeia e exibe visualmente a cobertura de código exercitada pelos testes. |
| Apache Ant | Ferramenta de automação de build utilizada para compilação, execução em lote e geração de relatórios. |
Configuração do Ambiente
1. Preparação do JUnit e Ant
O JUnit geralmente já está disponível no classpath de IDEs como o Eclipse. Para integração com o Ant, certifique-se de que o arquivo junit.jar esteja presente no diretório lib do Ant ou no classpath do projeto. O Ant, utilizado para orquestração, requer apenas a configuração da variável de ambiente ANT_HOME no sistema operacional.
2. Instalação do Selenium
O ecossistema Selenium é dividido em ferramentas de gravação e execução:
- Selenium IDE: Instalado como extensão no Firefox, permite a captura de fluxos de navegação e exportação direta para código Java.
- Selenium Server: O servidor central que gerencia a comunicação entre os testes e os navegadores. Inicie-o via linha de comando:
java -jar selenium-server-standalone.jar -multiWindow.
No seu projeto Java, adicione as dependências do cliente Selenium e do JUnit ao build path para ter acesso às APIs de automação.
3. Integração do Coverlipse
Para visualizar a cobertura de testes diretamente no editor, o plugin Coverlipse pode ser instalado através do gerenciador de atualizações do Eclipse. Adicione a URL do repositório oficial do Coverlipse nas configurações de "Available Software Sites". Após a instalação, crie uma nova "Run Configuration" do tipo Coverlipse, selecionando a classe de teste JUnit alvo. A execução destacará visualmente as linhas de código exercitadas, facilitando a identificação de trechos não testados antes do commit.
Fluxo de Trabalho: Gravação e Execução
O ciclo de desenvolvimento de testes inicia-se no Selenium IDE. Após gravar as ações na aplicação web, exporte o script no formato "Java / JUnit 4". Este código servirá como base para a classe de teste, onde você poderá refinar asserções, implementar lógicas comlpexas e organizar os dados de entrada.
Geração e Análise de Logs
O framework produz dois tipos principais de relatórios: relatórios de execução do JUnit (via Ant) e logs de comandos do Selenium.
Relatórios do JUnit com Ant
O script de build do Ant compila os testes, executa as suítes e consolida os resultados em formatos HTML e XML para análise posterior.
<project name="web-automation-suite" default="execute-tests" basedir=".">
<property name="src.dir" value="src/test/java"/>
<property name="build.dir" value="target/classes"/>
<property name="reports.dir" value="target/reports/junit"/>
<property name="xml.results.dir" value="target/results/xml"/>
<property name="libs.dir" value="lib"/>
<path id="test.classpath">
<pathelement location="${build.dir}"/>
<fileset dir="${libs.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
<target name="clean-environment">
<delete dir="${build.dir}"/>
<delete dir="${reports.dir}"/>
<delete dir="${xml.results.dir}"/>
<mkdir dir="${build.dir}"/>
<mkdir dir="${reports.dir}"/>
<mkdir dir="${xml.results.dir}"/>
</target>
<target name="compile-sources" depends="clean-environment">
<javac srcdir="${src.dir}" destdir="${build.dir}" includeantruntime="false">
<classpath refid="test.classpath"/>
</javac>
</target>
<target name="execute-tests" depends="compile-sources">
<junit printsummary="yes" haltonfailure="no">
<classpath refid="test.classpath"/>
<formatter type="xml"/>
<batchtest todir="${xml.results.dir}">
<fileset dir="${build.dir}">
<include name="**/*Test.class"/>
</fileset>
</batchtest>
</junit>
<junitreport todir="${xml.results.dir}">
<fileset dir="${xml.results.dir}">
<include name="TEST-*.xml"/>
</fileset>
<report todir="${reports.dir}" format="frames"/>
</junitreport>
</target>
</project>
Logs Detalhados do Selenium
Os logs nativos do Selenium Server são extensos e de difícil leitura. Para contornar isso, utilizamos a biblioteca logging-selenium, que intercepta os comandos e gera um relatório HTML interativo, incluindo capturas de tela de cada etapa.
private LoggingDefaultSelenium browserSession;
private Writer reportWriter;
@Before
public void initializeBrowserAndLogging() throws Exception {
String outputDirectory = System.getProperty("user.dir") + "/target/selenium-reports";
String reportFilePath = outputDirectory + "/execution_log.html";
String characterEncoding = "UTF-8";
reportWriter = LoggingUtils.createWriter(reportFilePath, characterEncoding);
LoggingResultsFormatter htmlReportFormatter =
new HtmlResultFormatter(reportWriter, characterEncoding);
htmlReportFormatter.setAutomaticScreenshotPath(outputDirectory);
htmlReportFormatter.setScreenShotBaseUri("");
HttpCommandProcessor baseProcessor =
new HttpCommandProcessor("localhost", 4444, "*firefox", "http://my-application.com");
LoggingCommandProcessor loggingProcessor =
new LoggingCommandProcessor(baseProcessor, htmlReportFormatter);
browserSession = new LoggingDefaultSelenium(loggingProcessor);
browserSession.start();
}
@After
public void teardownBrowserAndLogging() {
if (browserSession != null) {
browserSession.stop();
}
if (reportWriter != null) {
try {
reportWriter.close();
} catch (IOException ex) {
System.err.println("Falha ao fechar o writer do relatório: " + ex.getMessage());
}
}
}
Avaliação Técnica da Solução
Pontos Fortes
- Flexibilidade de Scripting: A capacidade de gravar e exportar testes acelera significativamente a criação de casos base e a prototipagem de fluxos.
- Independência de Plataforma: Suporte nativo a múltiplos sistemas operacionais e navegadores web.
- Poliglotismo: A API do Selenium possui bindings oficiais para Java, C#, Python, Ruby, JavaScript, entre outras linguagens.
Limitações
- Dependência de Navegadores para Gravação: O Selenium IDE é restrito a navegadores específicos (historicamente Firefox e Chrome). Para aplicações que exigem testes em ambientes ou navegadores legados não suportados pela IDE, a escrita manual dos scripts é mandatória.