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.
//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
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
Verificandosoma 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
39.
Produtos
Cadastrandonovo 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
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 somados 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
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
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
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
Resumindo…
* Codigo deteste 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
#5 Camilo: Explica ThoughtWorks e seus projetos Carlos: Por que um Dev nessa talk?
#6 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
#7 Carlos: Boas práticas existem. Não são a solução para todos os problemas, não é pecado não usá-las.
#8 Carlos: Boas práticas existem. Não são a solução para todos os problemas, não é pecado não usá-las.
#51 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