Arquitetura básica de testes para seu projeto Java

Elias Nogueira
Elias NogueiraLead Software Engineer at Waes
ARQUITETURA BÁSICA DE TESTES
PARA SEU PROJETO JAVA
ELIAS NOGUEIRA
@eliasnogueira
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
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
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
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
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
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
ESTRATÉGIA PARA UM PIPELINE CONTENDO TESTES
ARQUITETURA DE TESTES
Testes	
Manuais
Baseados	
em	Sessão
Testes	Unitários
Testes	de	Componentes
Testes	de	Integração
Testes	de	API
Testes	em	UI
Web	/	Mobile
UI/Aceitação
Regressão	Visual
Performance
Testes	de	Segurança
Mocks
Stubs
Serviços
Testes	de	Unidade
Análise	estática
ESTRATÉGIA PARA FERRAMENTAS EM DIFERENTES NÍVEIS
ARQUITETURA DE TESTES
Pirâmide	de	Automação	de	TesteTestes	
Manuais
Baseados	
em	Sessão
Testes	Unitários
Testes	de	Componentes
Testes	de	Integração
Testes	de	API
Testes	em	UI
Web	/	Mobile Máquinas	para	execução	Web
Servidores	para	teste	das	
integrações	e	APIs
Servidores	para	execução	de	
Testes	Não	Funcionais
Dispositivos	 para	
execução	Mobile
ESTRATÉGIA PARA AMBIENTES EM DIFERENTES NÍVEIS
ARQUITETURA DE TESTES
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
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();
}
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();
}
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
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));
}
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));
}
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));
}
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
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
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
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
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
@eliasnogueira
eliasnogueira.com
github.com/eliasnogueira
fb.com/elias.nogueira.teste
1 of 23

More Related Content

What's hot(20)

Workshop Agile Testing MindsetWorkshop Agile Testing Mindset
Workshop Agile Testing Mindset
Elias Nogueira1.8K views
API Test Automation API Test Automation
API Test Automation
SQALab1.9K views
Testes de ponta a pontaTestes de ponta a ponta
Testes de ponta a ponta
Elias Nogueira1.4K views
API Docs with OpenAPI 3.0API Docs with OpenAPI 3.0
API Docs with OpenAPI 3.0
Fabrizio Ferri-Benedetti835 views
Pirâmide de testes mobile, dividindo seus testes de maneira efetivaPirâmide de testes mobile, dividindo seus testes de maneira efetiva
Pirâmide de testes mobile, dividindo seus testes de maneira efetiva
Frederico Augusto Do Carmo Moreira885 views
API TESTINGAPI TESTING
API TESTING
Sijan Bhandari590 views
Ferramentas para testes de softwareFerramentas para testes de software
Ferramentas para testes de software
Norton Guimarães2.3K views
B4USolution_API-TestingB4USolution_API-Testing
B4USolution_API-Testing
b4usolution .1.3K views
Robot Framework no DevTests #34Robot Framework no DevTests #34
Robot Framework no DevTests #34
Mayara Fernandes375 views

Similar to Arquitetura básica de testes para seu projeto Java(20)

Testes Automatizados e o iOSTestes Automatizados e o iOS
Testes Automatizados e o iOS
Ricardo Valeriano1.6K views
Robotium_SikuliRobotium_Sikuli
Robotium_Sikuli
Lucas Cortazzo400 views
Spring framework 2.5Spring framework 2.5
Spring framework 2.5
Diego Pacheco1.3K views
VRaptor4VRaptor4
VRaptor4
Renan Montenegro818 views
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnit
Robinson Castilho1.5K views
Testes Unitários com GTest e CatchTestes Unitários com GTest e Catch
Testes Unitários com GTest e Catch
Uilian Ries1.6K views
Framework de testes cecomFramework de testes cecom
Framework de testes cecom
lucasbarsand308 views
Android na PráticaAndroid na Prática
Android na Prática
Ramon Ribeiro Rabello1.1K views
Aula JPAAula JPA
Aula JPA
Marco Reis1.3K views
Conexao Java - Sua primeira app AndroidConexao Java - Sua primeira app Android
Conexao Java - Sua primeira app Android
Suelen Carvalho2.2K views
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
Armando Daniel2.2K views
[DevOps Carioca]  Continuous Delivery[DevOps Carioca]  Continuous Delivery
[DevOps Carioca] Continuous Delivery
Samanta Cicilia1.4K views

More from Elias Nogueira(20)

API Testing following the Test PyramidAPI Testing following the Test Pyramid
API Testing following the Test Pyramid
Elias Nogueira1.7K views
Papel do QA na Transformação ÁgilPapel do QA na Transformação Ágil
Papel do QA na Transformação Ágil
Elias Nogueira1.2K views
BDD não é Automação de TestesBDD não é Automação de Testes
BDD não é Automação de Testes
Elias Nogueira5.3K views
Tem que testar mesmo?Tem que testar mesmo?
Tem que testar mesmo?
Elias Nogueira604 views
Coaching the Agile CoachCoaching the Agile Coach
Coaching the Agile Coach
Elias Nogueira1.2K views

Arquitetura básica de testes para seu projeto Java

  • 1. ARQUITETURA BÁSICA DE TESTES PARA SEU PROJETO JAVA ELIAS NOGUEIRA @eliasnogueira
  • 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
  • 8. ESTRATÉGIA PARA UM PIPELINE CONTENDO TESTES 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