Palestra ministrada no The Developers Conference São Paulo 2017 dia 21/07 na Trilha Arquitetura Java.
Nesta apresentação falo da importância de planejar testes em diversos níveis dentro de um processo de desenvolvimento, bem como uma build pipeline ideal pensando em testes e dicas do que devemos ter na nossa arquitetura de teste para uma aplicação em Java.
2. ARQUITETURA DE TESTES
ESTRATÉGIA SOBRE TESTES EM DIFERENTES FASES
Story 1
0 It 1 It 2 It 3 - 5 End Game
Entrega do Time
Tarefa A 8 horas
Tarefa B 5 horas
Tarefa C 6 horas
Tarefa D 8 horas
Release 1 Release 2 Release 3
Entendimento dos
Tipos de Testes
3. ESTRATÉGIA SOBRE TESTES EM DIFERENTES FASES
Story 1
0 It 1 It 2 It 3 - 5 End Game
Entrega do Time
Tarefa A 8 horas
Tarefa B 5 horas
Tarefa C 6 horas
Tarefa D 8 horas
Release 1 Release 2 Release 3
Entendimento dos
Tipos de Testes
Planejamento
dos Tipos de Testes
ARQUITETURA DE TESTES
4. ESTRATÉGIA SOBRE TESTES EM DIFERENTES FASES
Story 1
0 It 1 It 2 It 3 - 5 End Game
Entrega do Time
Tarefa A 8 horas
Tarefa B 5 horas
Tarefa C 6 horas
Tarefa D 8 horas
Release 1 Release 2 Release 3
Entendimento dos
Tipos de Testes
Planejamento
dos Tipos de Testes
Testes e
Execução de
Teste das User
Stories
ARQUITETURA DE TESTES
5. ESTRATÉGIA SOBRE TESTES EM DIFERENTES FASES
Story 1
0 It 1 It 2 It 3 - 5 End Game
Entrega do Time
Tarefa A 8 horas
Tarefa B 5 horas
Tarefa C 6 horas
Tarefa D 8 horas
Release 1 Release 2 Release 3
Entendimento dos
Tipos de Testes
Planejamento
dos Tipos de Testes
Testes e
Execução de
Teste das User
Stories
Testes e Execução de
Testes das Tarefas
ARQUITETURA DE TESTES
6. ESTRATÉGIA SOBRE TESTES EM DIFERENTES FASES
Story 1
0 It 1 It 2 It 3 - 5 End Game
Entrega do Time
Tarefa A 8 horas
Tarefa B 5 horas
Tarefa C 6 horas
Tarefa D 8 horas
Release 1 Release 2 Release 3
Entendimento dos
Tipos de Testes
Planejamento
dos Tipos de Testes
Testes e
Execução de
Teste das User
Stories
Testes e Execução de
Testes das Tarefas
Testes Funcionais
Testes E2E
ARQUITETURA DE TESTES
7. ESTRATÉGIA SOBRE TESTES EM DIFERENTES FASES
Story 1
0 It 1 It 2 It 3 - 5 End Game
Entrega do Time
Tarefa A 8 horas
Tarefa B 5 horas
Tarefa C 6 horas
Tarefa D 8 horas
Release 1 Release 2 Release 3
Entendimento dos
Tipos de Testes
Planejamento
dos Tipos de Testes
Testes e
Execução de
Teste das User
Stories
Testes e Execução de
Testes das Tarefas
Testes Funcionais
Testes E2E
Execução de Testes E2E
Testes em Produção
Testes Não Funcionais
ARQUITETURA DE TESTES
11. MODELOS DE ABSTRAÇÃO
▸ Utilizar Modelos de Abstração
▸ Implementação através de padrões de projeto
▸ Factory | Builder | Singleton
▸ Page Objects [para API | Web | Mobile]
ARQUITETURA DE TESTES
12. EXEMPLO PAGE OBJECTS
// exemplo com Selenium WebDriver
private WebDriver driver;
public LoginPage(WebDriver driver) {
this.driver = driver;
}
public void preencherLogin(String email) {
driver.findElement(By.id("username")).sendKeys(email);
}
public void preencherSenha(String senha) {
driver.findElement(By.id("password")).sendKeys(senha);
}
public void clicarEmLogin() {
driver.findElement(By.name("submit")).click();
}
13. EXEMPLO PAGE OBJECTS
// exemplo com Selenium WebDriver
private WebDriver driver;
public LoginPage(WebDriver driver) {
this.driver = driver;
}
public void preencherLogin(String email) {
driver.findElement(By.id("username")).sendKeys(email);
}
public void preencherSenha(String senha) {
driver.findElement(By.id("password")).sendKeys(senha);
}
public void clicarEmLogin() {
driver.findElement(By.name("submit")).click();
}
14. EXEMPLO PAGE OBJECTS
@Test
public void testeLoginComSenhaErrada() {
LoginPage login = new LoginPage(driver);
login.efetuarLogin("elias@elias.com", "eli@s134");
assertEquals("Usuário ou senha inválido", login.mensagemErro());
}
TESTE FUNCIONAL
15. EXEMPLO PAGE OBJECTS
@Test
public void adicionaProdutosNoEstoque() {
String produto = "iPhone 7 16GB";
LoginPage login = new LoginPage(driver);
login.efetuarLogin("elias@elias.com", "3li@s123!");
MainPage paginaPrincipal = new MainPage(driver);
paginaPrincipal.clicarEmProdutos().clicarEmGestaoDeProdutos();
GestaProdutosPage gestaoProdutos = new GestaProdutosPage(driver);
gestaoProdutos.pesquisaProduto(produto);
gestaoProdutos.clicarEmEditar();
gestaoProdutos.atualizaQuantidadeEstoque(23);
assertEquals(72, gestaoProdutos.obtemEstoqueProduto(produto));
}
16. EXEMPLO PAGE OBJECTS
@Test
public void adicionaProdutosNoEstoque() {
String produto = "iPhone 7 16GB";
LoginPage login = new LoginPage(driver);
login.efetuarLogin("elias@elias.com", "3li@s123!");
MainPage paginaPrincipal = new MainPage(driver);
paginaPrincipal.clicarEmProdutos().clicarEmGestaoDeProdutos();
GestaProdutosPage gestaoProdutos = new GestaProdutosPage(driver);
gestaoProdutos.pesquisaProduto(produto);
gestaoProdutos.clicarEmEditar();
gestaoProdutos.atualizaQuantidadeEstoque(23);
assertEquals(72, gestaoProdutos.obtemEstoqueProduto(produto));
}
17. EXEMPLO PAGE OBJECTS
@Test
public void adicionaProdutosNoEstoque() {
String produto = "iPhone 7 16GB";
LoginPage login = new LoginPage(driver);
login.efetuarLogin("elias@elias.com", "3li@s123!");
MainPage paginaPrincipal = new MainPage(driver);
paginaPrincipal.clicarEmProdutos().clicarEmGestaoDeProdutos();
GestaProdutosPage gestaoProdutos = new GestaProdutosPage(driver);
gestaoProdutos.pesquisaProduto(produto);
gestaoProdutos.clicarEmEditar();
gestaoProdutos.atualizaQuantidadeEstoque(23);
assertEquals(72, gestaoProdutos.obtemEstoqueProduto(produto));
}
18. EXEMPLO PAGE OBJECTS
@Test
public void adicionaProdutosNoEstoque() {
String produto = "iPhone 7 16GB";
LoginPage login = new LoginPage(driver);
login.efetuarLogin("elias@elias.com", "3li@s123!");
MainPage paginaPrincipal = new MainPage(driver);
paginaPrincipal.clicarEmProdutos().clicarEmGestaoDeProdutos();
GestaProdutosPage gestaoProdutos = new GestaProdutosPage(driver);
gestaoProdutos.pesquisaProduto(produto);
gestaoProdutos.clicarEmEditar();
gestaoProdutos.atualizaQuantidadeEstoque(23);
assertEquals(72, gestaoProdutos.obtemEstoqueProduto(produto));
}
TESTE E2E
19. LOGS
▸ Gerar logs da execução de teste em qualquer nível
▸ Em caso de falha [asserts] ou erro [exceptions]
▸ Gerar arquivos .log
▸ Gerar screenshots
▸ Agregar arquivos de resultado em formato xUnit
▸ Ou usar ferramentas de geração de relatórios
▸ Evitar o uso do Cucumber em múltiplas camadas
ARQUITETURA DE TESTES
20. ARQUIVOS DE CONFIGURAÇÃO
▸ Abusar de arquivos de configuração
▸ Eles apoiarão com um menor esforço de testar em diversos
ambientes
▸ Fácil apontamento de endpoints e URLs
▸ .properties
▸ .conf
▸ .xml
ARQUITETURA DE TESTES
21. DIFERENTES ESTRATÉGIAS E NÍVEIS
Web | Mobile
Smoke/Sanity Test
Pequenos testes, de preferência headless [web] para
garantir que o fluxo principal funciona
Functional
Validação de cada funcionalidade de forma singular
Aceitação | E2E
Validação de um fluxo do usuário
ARQUITETURA DE TESTES
22. DIFERENTES ESTRATÉGIAS E NÍVEIS
API
EndPoint
garantir que endpoints estão ativos
Contrato
garantir que existe o retorno esperado
Funcional
validação das regras do próprio endpoint
Aceitação | E2E
validação de regras usando diversos endpoints
ARQUITETURA DE TESTES