O documento apresenta boas práticas para automação de testes, incluindo usar page objects, dados-driven testing e manter testes isolados. Também discute técnicas como record and replay, bare sleep e keep pooling.
30. //pseudo-code
click_login_button();
TIMEOUT.times do
break if user_field.present?
sleep 1
end
fill_user(“Mario”);
http://martinfowler.com/articles/nonDeterminism.html
34. Teste 1 – Verifica Soma dos produtos cadastrados:
Produto A = 100,00
Produto B = 50,00
Soma produtos = 150,00
Teste 2 – Cadastra um novo produto:
Cadastra Produto C = 200,00
Verifica se existe um produto chamado “Produto C”
http://martinfowler.com/articles/nonDeterminism.html
35. Ordem dos testes:
Verificando soma dos produtos
Cadastrando novo produto
36. Produtos
Verificando soma dos produtos
A soma dos produtos deve ser 150
Cadastrando novo produto
Devo cadastrar o produto C
37. Ordem dos testes:
Cadastrando novo produto
Verificando soma dos produtos
38.
39. Produtos
Cadastrando novo produto
Devo cadastrar o produto C
Verificando soma dos produtos
A soma dos produtos deve ser 150
ExpectationNotMetError: expected: 4
Experado = 150,00
Resultado = 350,00
41. Cenário: Cadastrar produtos
Dado que eu estou na página de cadastro de produtos
Quando eu cadastro o produto “C”
E salvo
Então eu devo ver o produto cadastrado
Cenário: Verificar soma dos produtos
Dado que os produtos A e B estão cadastrados
Quando eu solicito ver o valor total dos produtos
Então eu devo ver o valor total como 150,00
42. Ordem dos testes:
Verificando soma dos produtos
Cadastrando novo produto
43. Cenário: Verificar soma dos produtos
Dado que os produtos A e B estão cadastrados
Quando eu solicito ver o valor total dos produtos
Então eu devo ver o valor total como 150,00
Cenário: Cadastrar produtos
Dado que eu estou na página de cadastro de produtos
Quando eu cadastro o produto “C”
E salvo
Então eu devo ver o produto cadastrado
44. Ordem dos testes:
Cadastrando novo produto
Verificando soma dos produtos
45. Cenário: Cadastrar produtos
Dado que eu estou na página de cadastro de produtos
Quando eu cadastro o produto “C”
E salvo
Então eu devo ver o produto cadastrado
Cenário: Verificar soma dos produtos
Dado que os produtos A e B estão cadastrados
Quando eu solicito ver o valor total dos produtos
Então eu devo ver o valor total como 150,00
55. var lado1 = 10
var lado2 = 10
var lado3 = 10
mathService.isTriangulo(lado1, lado2, lado3).should().beTruth()
mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘equilatero’)
var lado1 = 3
var lado2 = 4
var lado3 = 5
mathService.isTriangulo(lado1, lado2, lado3).should().beTruth()
mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘isóceles’)
var lado1 = 4
var lado2 = 4
var lado3 = 5
mathService.isTriangulo(lado1, lado2, lado3).should().beTruth()
mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘escaleno’)
…
56. var arquivo = File.read(“dados.csv”)
arquivo.each do
var lado1 = arquivo[‘lado 1’]
var lado2 = arquivo[‘lado 2’]
var lado3 = arquivo[‘lado 3’]
var tipoTriangulo = arquivo[‘tipo esperado’]
mathService.isTriangulo(lado1, lado2, lado3).should().beTruth()
var tipoRetornado = mathService.tipoTriangulo(lado1, lado2, lado3)
tipoRetornado.should().be(tipoTriangulo)
end
59. FactoryGirl.define do
factory :candidate do
name 'Candidato Fulano de Tal'
short_name 'Fulano Legal'
role 'Vereador'
end
factory :candidate_without_role, :parent => :candidate do
after(:build) do |candidate|
candidate.role = nil
end
end
https://github.com/thoughtworks/voto-como-vamos
68. module Search
class HomePage
@url = “www.google.com”
@search_field = “q”
@search_button = “search”
def input_search(value)
@browser.text_field(:name => @search_field).set value
end
def run_search
@browser.button(:class => @search_button).click
return ResultPage.new
end
def visit
@browser
end
end
http://www.bugbang.com.br/?p=2108
69. module Search
class HomePage Elementos da página como atributos
@url = “www.google.com”
@search_field = “q”
@search_button = “search”
def input_search(value)
@browser.text_field(:name => @search_field).set value
end
def run_search
@browser.button(:class => @search_button).click
return ResultPage.new
end
def visit
@browser
end
end
http://www.bugbang.com.br/?p=2108
70. module Search
class HomePage
@url = “www.google.com”
@search_field = “q”
@search_button = “search”
def input_search(value)
@browser.text_field(:name => @search_field).set value
end
def run_search
@browser.button(:class => @search_button).click
return ResultPage.new
end
Comportamentos como contrato
def visit
@browser
end
end
http://www.bugbang.com.br/?p=2108
74. Resumindo…
* Codigo de teste também é código;
- (quase) todas as boas práticas se aplicam
* Don’t Repeat yourself!
* Código de teste deve ser uma represetação
automática da interação do usuário
- Seu sistema pode não dar feedback suficiente
Camilo: Explica ThoughtWorks e seus projetos Carlos: Por que um Dev nessa talk?
Camilo: - Processos tradicionais => Final do processo - Processos ágeis => a cada build => teste manual tomaria demasiado tempo (muito custo) => custo de documentar os testes - Teste manual => muita falha humana - Teste auto => menos falha humana Carlos - MOTO: AUTOMATE EVERYTHING - perder menos tempo (nenhum?) com tarefas repetitivas – não queremos as máquinas rindo da gente a noite
Carlos: Boas práticas existem. Não são a solução para todos os problemas, não é pecado não usá-las.
Carlos: Boas práticas existem. Não são a solução para todos os problemas, não é pecado não usá-las.
Camilo
Camilo
Camilo
Carlos - Código gerado pelo Selenium, deve ser bom, certo?
Carlos
Carlos
Camilo
Carlos: – sleep burro - Segurar nosso super performático teste
Carlos: Teste manual
Carlos
Carlos
Carlos: Reproduzir no código Rodou -> Passou -> Commit
Carlos: CI => FAIL
Camilo: Falhou por que? O Que o selenium faz?
Camilo: O Que o selenium faz?
Camilo: O Teste está mais rápido que a página? Carlos: Já sei, diminuir a velocidade do teste
Carlos
Carlos e Camilo
Camilo: Red/Green tests
Carlos: Adiciona mais tempo e soluciona para “ sempre ” Mesmo se sempre passar, vai ser lento
Camilo: Não use o bare steep
Camilo: Solução
Camilo: Ação assíncrona Feedback da página Mais ação Carlos: O teste é o usuário, ambos precisam de feedback
Camilo: Uma outra solução
Camilo: Agora você está protegido
Carlos
Carlos: Explica Martin Fowler
Carlos:
Carlos:
Carlos:
Carlos:
Carlos: Órdem importa Execução isolada passa
Camilo
Camilo
Camilo
Camilo
Camilo
Camilo
Camilo: Given when then são os passos Não estamos falando de BDD
Carlos: Prepara os dados do teste Nenhuma ação
Carlos: Executa as ações Muda o estado
Carlos: Verifica os resultados
Carlos: Limpe sua bagunça Garante o isolamento Pode ser feito antes de cada teste (garantindo uma base sadia) Final de cada teste (mesmo se falhar) limpando a bagunça
Carlos: - Um pouco mais perto de Fail Proof
Camilo
Camilo
Camilo
Camilo
Camilo
Carlos: - O mesmo padrão pode ser usado nos testes
Carlos: Pra quem não conhece, essa é uma fábrica ….
Camilo: Esse é o Voto Como Vamos uando um factory
Carlos: O código de teste tem que ser bem feito Separação em camadas