Palestra sobre automação de testes funcionais utilizando a ferramenta Selenium, realizada em 12/07/2017 para alunos e professores do Instituto Federal da Paraíba(IFPB)
Tópicos cobertos:
- Importância dos testes no desenvolvimento de software
- Selenium IDE
- Selenium WebDriver
- Padrão de projeto Page Object
- Boas práticas
6. 1. Introdução
O que são testes funcionais?
“Teste baseado na análise de
especificação da funcionalidade de
um componente ou sistema”
7. 1. Introdução
Por que é importante automatizar testes?
Testes executados de forma mais rápida e mais barata
Feedback sobre qualidade do código
Permite aumentar a cobertura dos testes
Racionalização de recursos
Fiel reprodução do teste executado
Aumentar qualidade do produto final
Redução de custos(médio e longo prazo)
9. 2. Visão Geral do Selenium
O que é Selenium?
“Selenium Automatiza navegadores”
10. 2. Visão Geral do Selenium
Realizar ações, comandos, entradas de valores em páginas
exibidas no navegador, executando tarefas como se fosse um
usuário real.
Open Source(Licença Apache 2.0)
Dois Sabores:
Selenium Web Driver
Selenium IDE
11. 2. Visão Geral do Selenium
Selenium IDE
Permite “gravar” testes usando um plugin do Firefox
Os testes são salvos como arquivos HTML
Podem ser exportados para linguagens de programação:
O código exportado é geralmente frágil
Difícil manutenção
12. 2. Visão Geral do Selenium
Script de Teste
em HTML
Selenium IDE
Plugin Firefox
13.
14. 2. Visão Geral do Selenium
Quando usar?
Deve ser usado apenas para criar scripts simples, para testes
exploratórios e possivelmente descartáveis
Não devem ser usados para automação de grandes sistemas
16. 3. Selenium Web Driver
Testes são codificados utilizando alguma linguagem de
programação
Testes mais robustos e escaláveis
Permite que o teste seja distribuído em várias máquinas,
executado em diferentes tipos de navegadores e/ou
sistemas operacionais
17. 3. Selenium Web Driver
Os comandos são enviados para um driver que os
executa no navegador
Cada navegador tem um driver específico
Os testes podem ser executados na máquina local ou em
uma máquina remota (Selenium-Server)
Os testes podem ser executados de forma distribuída
(Selenium-Grid)
19. 3. Selenium Web Driver
Etapas simplificadas de um script Selenium:
1. Inicializar o driver do navegador
2. Acessar(obter) a página do sistema que será testado
3. Obter um(alguns) elemento(s) da página
4. Executar alguma ação com esse(s) elemento(s)
5. Verificar o resultado da ação
20. 3. Selenium Web Driver
1. Inicializar o driver do navegador
Firefox:
Chrome:
Drivers disponíveis no site do Selenium
System.setProperty("webdriver.chrome.driver", “c:/chromedriver.exe");
WebDriver driver = new ChromeDriver();
System.setProperty("webdriver.gecko.driver", “c:/geckodriver.exe");
WebDriver driver = new FirefoxDriver();
http://www.seleniumhq.org/
21. 3. Selenium Web Driver
2. Acessar(obter) a página do sistema que será testado
driver.get("http://www.ifpb.edu.br");
3. Obter um(alguns) elemento(s) da página
WebElement caixaBusca = driver.findElement(By.name("SearchableText"));
WebElement botaoPesquisar =
driver.findElement(By.className("searchButton"));
22. 3. Selenium Web Driver
4. Executar alguma ação com esse(s) elemento(s)
5. Verificar o resultado da ação
caixaBusca.sendKeys("vestibular");
botaoPesquisar.click();
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
List<WebElement> resultados =
driver.findElements(By.xpath("//div[@id='search-results']/dl/dt"));
Assert.assertTrue(resultados.size() > 1);
23. 3. Selenium Web Driver
Formas de obter elementos de interação na página Web:
XPath
ID(atributo id do HTML)
Nome da Classe CSS (atributo class do HTML)
Seletor CSS
Nome(atributo name do HTML)
Conteúdo de um Link
Nome da Tag
24. 3. Selenium Web Driver
Muitas vezes é necessário sincronizar a execução do teste
com a dinâmica do site
Tipos de sincronização:
Sincronização implícita
Sincronização explícita
25. 3. Selenium Web Driver
Sincronização implícita:
O Selenium esperará uma certa quantidade de tempo, se o
elemento procurado na página não estiver disponível
Se após o tempo configurado o elemento ainda não estiver
disponível na página, o teste falhará
Vantagens: mais prático e menos linhas de código nos testes
Desvantagem: tempo uniforme de espera
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
26. 3. Selenium Web Driver
Sincronização explícita:
O desenvolvedor controla o tempo de espera(sincronização) do
teste a cada etapa
Deve-se informar uma condição de espera
Ex: Elemento visível na tela, texto presente na tela, valor de um
atributo de um elemento HTML, etc.
Mais flexível que a sincronização implícita.
WebDriverWait wait = new WebDriverWait(driver, timeout);
wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath("//div[@id='search-results']/dl/dt")));
27. 3. Selenium Web Driver
Resumindo os principais métodos da API:
driver.get()
driver.findElement(By)
webElement.click()
webElement.sendKeys()
driver.switchTo().window()
driver.switchTo().alert().accept();
webDriverWait.until()
driver.navigate()
29. 4. Padrão Page Object
Testes funcionais automáticos de sistemas Web são suscetíveis
à mudanças na interface
Uma alteração em um componente da tela pode quebrar
todos os testes
Se o código que interage com esse componente for
repetido em vários testes, todos irão quebrar
Manutenção dos testes ficará mais custosa
30. 4. Padrão Page Object
Solução: Padrão de projeto Page Object
Crie uma classe para cada tela do sistema usadas nos testes
As classes devem abstrair o código Selenium que interage
com os elementos da tela.
Único ponto de mudança
31. 4. Padrão Page Object
Forneça uma API fácil de usar e que permita fazer tudo
aquilo que um humano poderia fazer usando a tela
Ex: Se a tela possui dos campos de texto e um botão, a
API deve fornecer métodos para
preencher/limpar/recuperar o valor desses dois campos
e um método para pressionar o botão.
33. 4. Padrão Page Object
Use page object:
PaginaPrincipalPO paginaPrincipal = new PaginaPrincipalPO();
PageFactory.initElements(driver, paginaPrincipal);
paginaPrincipal.setCampoBusca(("vestibular");
paginaPrincipal.pesquisar();
PaginaResultadosPO paginaResultados = new PaginaResultadosPO();
PageFactory.initElements(driver, paginaResultados);
int totalResultados = paginaResultados.getTotalResultados();
Assert.assertTrue(totalResultados > 1);
Os métodos do
PageObjects
abstraem o código
do Selenium
Inicializa uma
instância de page
object
34. 4. Padrão Page Object
public class PaginaPrincipalPO {
@FindBy(name="SearchableText")
private WebElement campoBusca;
@FindBy(className="searchButton")
private WebElement botaoPesquisar;
public String getCampoBusca(){
return campoBusca.getAttribute("value");
}
public void setCampoBusca(String valor){
campoBusca.sendKeys(valor);
}
public void pesquisar(){
botaoPesquisar.click();
}
}
36. 5. Boas Práticas
Escolha bem a forma como localizar os elementos da tela
Isso definirá o quão “forte” seu teste será em relação às
mudanças de interface
Prefira localizar elementos HTML pelo seu ID (atributo id do
HTML) ou nome(atributo name)
Não use ID quando eles forem gerados automaticamente
Um mesmo valor de name pode ser utilizado em vários
elementos
37. 5. Boas Práticas
Se não for possível utilizar ID ou nome, use Xpath ou um
seletor CSS
Monte uma expressão Xpath ou seletor CSS que seja
resistente em relação à mudanças na interface
Exemplo de Xpath fraco:
driver.findElements(By.xpath("//div[1]/div/div/div[2]/form/input"));
38. 5. Boas Práticas
Exemplo de Xpath forte:
Use o inspetor de elementos do Chorme/Firefox para auxiliar
na criação do Xpath ou do seletor CSS
Use plug-ins disponíveis para o Chrome e Firefox
driver.findElements(By.xpath("//*[@id='search-results']/ol/li"));
40. 5. Boas Práticas
Mantenha o código de seus testes limpo e organizado
Trate o código dos testes da mesma forma que o código de
produção
Baixo acoplamento
Alta coesão
Evite repetições de código
Use PageObjects
41. 5. Boas Práticas
Sempre coloque ID nos elementos HTML de suas páginas Web
Lembre-se: o código de seus testes também será mantido por
outros desenvolvedores