SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
Automação de Testes de Software com:Automação de Testes de Software com:
DemoiselleDemoiselle BehaveBehave
IV Workshop de Testes do SERPROIV Workshop de Testes do SERPRO
Julian Cesar dos SantosJulian Cesar dos Santos
Vanderson Botêlho da SilvaVanderson Botêlho da Silva
2
Uma técnica de desenvolvimento ágiltécnica de desenvolvimento ágil
criado por Dan North que integra regras de negócio com
automação de testes.
Evolução TDD:
Por onde começa o processo?
O que testar e o que não testar?
O que chamamos de teste?
Como analisar falhas?
BDDBDDBehavior Driven Development
Demoiselle BehaveDemoiselle Behave
MotivaçãoMotivação
Porque usar BDD?Porque usar BDD?
Demoiselle BehaveDemoiselle Behave
MotivaçãoMotivação

Especificação de ComportamentoEspecificação de Comportamento
 Um dos grandes problemas na construção de um software é
não entender exatamente o que ele deve fazer
Demoiselle BehaveDemoiselle Behave
MotivaçãoMotivação
UseUse histórias concretashistórias concretas
para ilustrar o que separa ilustrar o que se
deseja do softwaredeseja do software
Demoiselle BehaveDemoiselle Behave
MotivaçãoMotivação
Cenários de uso são maisCenários de uso são mais eficienteseficientes
na comunicaçãona comunicação do que descrições.do que descrições.
Demoiselle BehaveDemoiselle Behave
MotivaçãoMotivação Exemplos reaisExemplos reais
nosnos mantêm conectadosmantêm conectados
com a visão dos nossoscom a visão dos nossos
stakeholdersstakeholders
Demoiselle BehaveDemoiselle Behave
MotivaçãoMotivação
Como isso Funciona na Práticana Prática
Demoiselle BehaveDemoiselle Behave
FuncionamentoFuncionamento
Funcionalidade: Operar a Calculadora
Narrativa:
Para obter as operações básicas da calculadora
Como um usuário qualquer
Desejo resolver problemas matemáticos de forma mais rápida
Cenário: Somar
Dado que inicio a Calculadora
Quando adiciono "5"
E adiciono "7"
Então seu valor será "12" Escreva suas histórias
Demoiselle BehaveDemoiselle Behave
FuncionamentoFuncionamento
Cenário: Somar
Dado que inicio a Calculadora
Quando adiciono "5"
E adiciono "7"
Então seu valor será "12"
@When("Quando inicio a Calculadora")
public void goToWithName(String local) {
}
@When("adiciono "$valor"")
public void whenAdiciono(double valor) {
}
@Then("seu valor será "$valor"")
public void thenSeuValorSera(double valor) {
}
Suas frases devem ser
mapeadas em métodos
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

ObjetivoObjetivo
 Para testes sob interfaces gráficas o mapeamento de tela visa
desacoplar os elementos de tela ao script de automação.

BenefíciosBenefícios
 Evita duplicação de código;
 Maior manutenibilidade: se houver mudanças na tela a
correção deverá ser aplicada em um único lugar.
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

Diferenças para um Page ObjectDiferenças para um Page Object
 Os mapeamentos não possuem
comportamento;
 Os comportamento são
implementados nos steps;
 Podemos reusar comportamentos
para vários objetos e vice-e-versa;
 Melhor manutenção, devido a
redução de código.
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

ExemploExemplo
@ScreenMap(name = "Tela de Busca", location = "http://www.google.com.br")
public class MyPage {
@ElementMap(
name = "Campo de Busca",
locatorType = ElementLocatorType.Id,
locator = "gbqfq")
private TextField searchField;
@ElementMap(
name = "Estou com sorte",
locatorType = ElementLocatorType.Id,
locator = "gbqfbb")
private Button buttonLuckSearch;
}
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

@ScreenMap@ScreenMap
@ScreenMap(
name = "Tela de Busca",
location = "http://www.google.com.br")
Identificação amigável
da tela
Identificação amigável
da tela
Localização da telaLocalização da tela
@ScreenMap(
name = "Tela de Busca",
base="http://www.google.com.br",
location = "/")
Atributo opcional que define o prefixo
do localizador. Importante quando deseja-se
parametrizar os localizadores
Atributo opcional que define o prefixo
do localizador. Importante quando deseja-se
parametrizar os localizadores
Neste caso a localização da tela
É a concatenação da base + location
Neste caso a localização da tela
É a concatenação da base + location
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

@ElementMap@ElementMap
@ElementMap(
name = "Campo de Busca",
locatorType = ElementLocatorType.Id,
locator = "gbqfq")
Identificação amigável
do elemento de tela
Identificação amigável
do elemento de tela
Tipo de localizador:
ClassName; CssSelector
Id; LinkText; Name;
TagName; XPath
Tipo de localizador:
ClassName; CssSelector
Id; LinkText; Name;
TagName; XPathValor de LocalizadorValor de Localizador
@ElementMap(
name = "Menu Superior",
locatorType = ElementLocatorType.Id,
locator = { "gbztm", "gbmm" })
private Select menuLivros;
Pode ser necessário
Mais de um localizador
Pode ser necessário
Mais de um localizador
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

Interface ElementInterface Element
 Especificação que provê abstrações para elementos de tela:
 Button.java
 CheckBox.java
 Grid.java
 Label.java
 Link.java
 ListBox.java
 Loading.java
 Menu.java
 MenuItem.java
 PickList.java
 Radio.java
 Screen.java
 Select.java
 TextField.java
@ElementMap(
name = "Pesquisar",
locatorType = ElementLocatorType.Id,
locator = "gbqfb")
private Button botaoPesquiar
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

Interface ElementInterface Element
 Cada projeto do tipo Runner deve implementar estas
especificações
public class WebButton extends
WebBase implements Button {
public void click() {
waitElement(0);
getElements().get(0).click();
}
}
public class WebButton extends
WebBase implements Button {
public void click() {
waitElement(0);
getElements().get(0).click();
}
}
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

Design DBehave - CompositeDesign DBehave - Composite
 O design Page Object equivale ao refatoramento do
 Vantagens:
 Reuso de comportamentos;
 Polimorfismo para tipos de telas (Web, Desktop, Mobile, ...)
Dados
ScreeMapScreeMap
Comportamento
ElementElement+ =
Dados com
Comportamento
Page ObjectPage Object
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

Integração BDDIntegração BDD
 O DBehave implementa passos comunspassos comuns para interação com
aplicações Web
Cenário: Procurando uma Alma Gemea
Dado que vou para a página "Alma Gemea"
Quando clico em "Pesquisar"
Quando informo "36" no campo "idade"
Quando seleciono a opção "Solteiro"
Então será exibido na "Caixa ao lado" o valor "Você está com sorte"
Dado que estou na página "Buscar Alma Gemea"
Então será exibido "Ricardão"
Vai para a tela
mapeada
Vai para a tela
mapeada
Execute a operação
de click
Execute a operação
de click
Informa o valor
de um campo de edição
Informa o valor
de um campo de edição
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

Integração BDDIntegração BDD
 O DBehave implementa passos comunspassos comuns para interação com
aplicações Web
Cenário: Procurando uma Alma Gemea
Dado que vou para a página "Alma Gemea"
Quando clico em "Pesquisar"
Quando informo "36" no campo "idade"
Quando seleciono a opção "Solteiro"
Então será exibido na "Caixa ao lado" o valor "Você está com sorte"
Dado que estou estou na página "Buscar Alma Gemea"
Quando clico em "Procurar"
Então será exibido "Ricardão"
Selecione um campo de
escolha (radio, check ou link)
Selecione um campo de
escolha (radio, check ou link)
Verifica se um elemento
Possui um determinado valor
Verifica se um elemento
Possui um determinado valor
Verifica se um elemento
Possui um determinado valor
Verifica se um elemento
Possui um determinado valor
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

Integração BDDIntegração BDD
 O DBehave implementa passos comunspassos comuns para interação com
aplicações Web
Cenário: Procurando uma Alma Gemea
Dado que vou para a página "Alma Gemea"
Quando clico em "Pesquisar"
Quando informo "36" no campo "idade"
Quando seleciono a opção "Solteiro"
Então será exibido na "Caixa ao lado" o valor "Você está com sorte"
Dado que estou na página "Buscar Alma Gemea"
Quando clico em "Procurar"
Então será exibido "Ricardão"
Selecione um campo de
escolha (radio, check ou link)
Selecione um campo de
escolha (radio, check ou link)
Informa qual a página
Atual sem executar ação
de navegação
Informa qual a página
Atual sem executar ação
de navegação
Verifica em toda a tela
a presença e um texto
Verifica em toda a tela
a presença e um texto
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

Integração BDDIntegração BDD
Funcionalidade: Acesso
Como um: visitante
Eu quero: acessar o Google
De modo que: a página inicial apareceça para mim
Cenário: Acesso ao Google
Dado que vou para a página "Tela de Busca"
Então será exibido "Google"
Demoiselle BehaveDemoiselle Behave
Mapeamento de TelaMapeamento de Tela

Integração BDDIntegração BDD
 Inclua na classe MyPage o botão de pesquisa:
Cenário: Utilização da funcionalidade de pesquisa
Dado que vou para a página "Tela de Busca"
Quando informo "Demoiselle Behave" no campo "Campo de Busca"
Quando clico em "Pesquisar"
Então será exibido "Demoiselle Behave"
@ElementMap( name = "Pesquisar", locatorType =
ElementLocatorType.Id, locator = "gbqfb")
private Button botaoPesquisar;
Demoiselle BehaveDemoiselle Behave
NecessidadeNecessidade
Especificação FormalEspecificação Formal Especificação FormalEspecificação Formal
Funcionalidade: Acessa ao Sistema
Cenário: Acessa sistema com usuário válido
Dado que vou para a página "Tela de Login"
Quando informo "joao" no campo "Usuário"
E informo "123" no campo "Campo Senha"
Quando clico em "Entrar"
Então estou autenticado
Especificação TestávelEspecificação Testável
representa
WebDriver driver = new FirefoxDriver();
driver.get("http://localhost:8080/treino/");
WebElement login =
driver.findElement(By.xpath("(//input[contai
ns(@id, 'formLogin')][contains(@type,
'text')])"));
login.clear();
login.sendKeys("joao");
WebElement senha =
driver.findElement(By.xpath("(//input[contai
ns(@id, 'formLogin')][contains(@type,
'password')])"));
senha.sendKeys("123");
WebElement botaoOk =
driver.findElement(By.xpath("(//button[conta
ins(@type, 'submit')])"));
botaoOk.click();
Linguagem de ProgramaçãoLinguagem de Programação
representa
Demoiselle BehaveDemoiselle Behave
WebDriver driver = new FirefoxDriver();
driver.get("http://localhost:8080/treino/");
WebElement login =
driver.findElement(By.xpath("(//input[contai
ns(@id, 'formLogin')][contains(@type,
'text')])"));
login.click();
login.clear();
login.sendKeys("joao");
WebElement senha =
driver.findElement(By.xpath("(//input[contai
ns(@id, 'formLogin')][contains(@type,
'password')])"));
senha.clear();
senha.sendKeys("123");
WebElement botaoOk =
driver.findElement(By.xpath("(//button[conta
ins(@type, 'submit')])"));
botaoOk.click();
Funcionalidade: Acessa ao Sistema
Cenário: Acessa sistema com usuário válido
Dado que vou para a página "Tela de Login"
Quando informo "joao" no campo "Usuário"
E informo "123" no campo "Campo Senha"
Quando clico em "Entrar"
Então estou autenticado
BenefíciosBenefícios
HojeHoje – Redução de Custo– Redução de Custo
ManutençãoManutenção
AprendizagemAprendizagem
ProdutividadeProdutividade
Demoiselle BehaveDemoiselle Behave
WebDriver driver = new FirefoxDriver();
driver.get("http://localhost:8080/treino/");
WebElement login =
driver.findElement(By.xpath("(//input[contai
ns(@id, 'formLogin')][contains(@type,
'text')])"));
login.click();
login.clear();
login.sendKeys("joao");
WebElement senha =
driver.findElement(By.xpath("(//input[contai
ns(@id, 'formLogin')][contains(@type,
'password')])"));
senha.clear();
senha.sendKeys("123");
WebElement botaoOk =
driver.findElement(By.xpath("(//button[conta
ins(@type, 'submit')])"));
botaoOk.click();
Funcionalidade: Acessa ao Sistema
Cenário: Acessa sistema com usuário válido
Dado que vou para a página "Tela de Login"
Quando informo "joao" no campo "Usuário"
E informo "123" no campo "Campo Senha"
Quando clico em "Entrar"
Então estou autenticado
BenefíciosBenefícios
FuturoFuturo – Colaboração– Colaboração
Demoiselle BehaveDemoiselle Behave
IntroduçãoIntrodução

Demoiselle BehaveDemoiselle Behave
 O que é?
 É um framework de integração de ferramentas para uso de técnicas de
Desenvolvimento Orientada a Comportamento - Behaviour-Driven
Development (BDD).
 Além de uma ferramenta BDD:
 Abstração de ferramentas BDD
 Abstração de ferramentas de automação de testes
 Abstração de ferramentas de gestão de testes
 É um subprojeto do Framework Demoiselle
(http://www.frameworkdemoiselle.gov.br/)
Demoiselle BehaveDemoiselle Behave
IntroduçãoIntrodução

Visão GeralVisão Geral
Teste um sistemaTeste um sistema
Behave
Selecione um DriverSelecione um Driver
Execute seus testesExecute seus testes
EscrevaEscreva estóriasestórias
Mapei telasMapei telas
Registre seus resultadosRegistre seus resultados
Escolha uma ferramentaEscolha uma ferramenta
(1)(1)
(2)(2)
(3)(3)
(4)(4)
(5)(5)
Demoiselle BehaveDemoiselle Behave
JulhoJulho AgoAgo SetSet OutOut NovNov DezDez
20132013
JunhoJunhoMaioMaioAbrilAbril
RoadMapRoadMap
6/14
VersãoVersão 1.0.01.0.0
Plataforma WebPlataforma Web
ProspecçãoProspecção
Demoiselle BehaveDemoiselle Behave
JulhoJulho AgoAgo SetSet OutOut NovNov DezDez
20132013
JunhoJunhoMaioMaioAbrilAbril
VersãoVersão 1.0.01.0.0
Plataforma WebPlataforma Web
RoadMapRoadMap
VersãoVersão 1.1.01.1.0
Integração ALMIntegração ALM
11/14
ProspecçãoProspecção
Demoiselle BehaveDemoiselle Behave
JulhoJulho AgoAgo SetSet OutOut NovNov DezDez
20132013
JunhoJunhoMaioMaioAbrilAbril
VersãoVersão 1.0.01.0.0
Plataforma WebPlataforma Web
VersãoVersão 1.1.01.1.0
Integração ALMIntegração ALM
RoadMapRoadMap
TreinamentoTreinamento
ColaboradoresColaboradoresProspecçãoProspecção
VersãoVersão 1.2.01.2.0
Plataforma DesktopPlataforma Desktop
Demoiselle BehaveDemoiselle Behave
Fim de História!Fim de História!
Mais Informações:Mais Informações:
https://github.com/demoiselle/behavehttps://github.com/demoiselle/behave

Mais conteúdo relacionado

Mais procurados

Curso Básico de Selenium
Curso Básico de SeleniumCurso Básico de Selenium
Curso Básico de SeleniumAutotic
 
98796699 selenium-framework
98796699 selenium-framework98796699 selenium-framework
98796699 selenium-frameworkAndré Caldas
 
Confirurando Dababase Development no Eclipse Luna
Confirurando Dababase Development no Eclipse LunaConfirurando Dababase Development no Eclipse Luna
Confirurando Dababase Development no Eclipse LunaGeorge Mendonça
 
SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidVinícius Thiengo
 
Abrindo a caixa de ferramentas: atirando pedras com Jmeter
Abrindo a caixa de ferramentas: atirando pedras com JmeterAbrindo a caixa de ferramentas: atirando pedras com Jmeter
Abrindo a caixa de ferramentas: atirando pedras com JmeterEvandro Grezeli
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Jaime Neto
 
Cmg falando de testes de desempenho
Cmg falando de testes de desempenhoCmg falando de testes de desempenho
Cmg falando de testes de desempenhoEvandro Grezeli
 
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...JP Clementi
 
Live Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioLive Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioVinícius Thiengo
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasRafael Chinelato Del Nero
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de softwarericardophp
 
Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelManoel Pimentel Medeiros
 
Introdução à Programação em Java - Aula 1 (PT-PT)
Introdução à Programação em Java - Aula 1 (PT-PT)Introdução à Programação em Java - Aula 1 (PT-PT)
Introdução à Programação em Java - Aula 1 (PT-PT)Manoel Campos da Silva Filho
 
Data Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI AndroidData Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI AndroidVinícius Thiengo
 
Java Day 2011 - Reflection: Maximizando a produtividade em Java
Java Day 2011 - Reflection: Maximizando a produtividade em JavaJava Day 2011 - Reflection: Maximizando a produtividade em Java
Java Day 2011 - Reflection: Maximizando a produtividade em JavaFábio Antonelli
 

Mais procurados (20)

Java swingcomponentes
Java swingcomponentesJava swingcomponentes
Java swingcomponentes
 
Curso Básico de Selenium
Curso Básico de SeleniumCurso Básico de Selenium
Curso Básico de Selenium
 
98796699 selenium-framework
98796699 selenium-framework98796699 selenium-framework
98796699 selenium-framework
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Confirurando Dababase Development no Eclipse Luna
Confirurando Dababase Development no Eclipse LunaConfirurando Dababase Development no Eclipse Luna
Confirurando Dababase Development no Eclipse Luna
 
SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView Android
 
Abrindo a caixa de ferramentas: atirando pedras com Jmeter
Abrindo a caixa de ferramentas: atirando pedras com JmeterAbrindo a caixa de ferramentas: atirando pedras com Jmeter
Abrindo a caixa de ferramentas: atirando pedras com Jmeter
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?
 
Cmg falando de testes de desempenho
Cmg falando de testes de desempenhoCmg falando de testes de desempenho
Cmg falando de testes de desempenho
 
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...
 
Live Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioLive Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android Studio
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivas
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
Bada
BadaBada
Bada
 
Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel Pimentel
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Introdução à Programação em Java - Aula 1 (PT-PT)
Introdução à Programação em Java - Aula 1 (PT-PT)Introdução à Programação em Java - Aula 1 (PT-PT)
Introdução à Programação em Java - Aula 1 (PT-PT)
 
Introdução ao JavaFX
Introdução ao JavaFXIntrodução ao JavaFX
Introdução ao JavaFX
 
Data Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI AndroidData Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI Android
 
Java Day 2011 - Reflection: Maximizando a produtividade em Java
Java Day 2011 - Reflection: Maximizando a produtividade em JavaJava Day 2011 - Reflection: Maximizando a produtividade em Java
Java Day 2011 - Reflection: Maximizando a produtividade em Java
 

Semelhante a Demoiselle Behave - Visão Geral

Workshop calabash android
Workshop calabash androidWorkshop calabash android
Workshop calabash androidGislaine Melo
 
Workshop calabash android
Workshop calabash androidWorkshop calabash android
Workshop calabash androidGislaine Melo
 
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...Ricardo Valeriano
 
Seu Cliente no Controle! Testes ágeis
Seu Cliente no Controle! Testes ágeisSeu Cliente no Controle! Testes ágeis
Seu Cliente no Controle! Testes ágeisVanderson Silva
 
Cucumber Best Practices
Cucumber Best PracticesCucumber Best Practices
Cucumber Best PracticesKaroline Leite
 
Desafios no desenvolvimento de uma aplicação real com Flex @ FUGSC
Desafios no desenvolvimento de uma aplicação real com Flex @ FUGSCDesafios no desenvolvimento de uma aplicação real com Flex @ FUGSC
Desafios no desenvolvimento de uma aplicação real com Flex @ FUGSCJoão Zaratine
 
MobileConf 2013: PhoneGap
MobileConf 2013: PhoneGapMobileConf 2013: PhoneGap
MobileConf 2013: PhoneGapLoiane Groner
 
Boas práticas de Automação de Testes
Boas práticas de Automação de TestesBoas práticas de Automação de Testes
Boas práticas de Automação de TestesCamilo Ribeiro
 
Guia rapido total cross studio
Guia rapido total cross studioGuia rapido total cross studio
Guia rapido total cross studioRafael Din
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introduçãoJosino Rodrigues
 
Desenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma AndroidDesenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma AndroidJosé Alexandre Macedo
 
BeagaJS 2013: Sencha Touch + PhoneGap
BeagaJS 2013: Sencha Touch + PhoneGapBeagaJS 2013: Sencha Touch + PhoneGap
BeagaJS 2013: Sencha Touch + PhoneGapLoiane Groner
 
Desenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyDesenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyRodrigo Martins
 
Php women oficina iniciante de php
Php women   oficina iniciante de phpPhp women   oficina iniciante de php
Php women oficina iniciante de phpTais Reis
 
Cucumber e melhores práticas
Cucumber e melhores práticasCucumber e melhores práticas
Cucumber e melhores práticasDalton Teixeira
 
Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2Matheus Calegaro
 

Semelhante a Demoiselle Behave - Visão Geral (20)

Demoiselle Behave
Demoiselle BehaveDemoiselle Behave
Demoiselle Behave
 
Workshop calabash android
Workshop calabash androidWorkshop calabash android
Workshop calabash android
 
Workshop calabash android
Workshop calabash androidWorkshop calabash android
Workshop calabash android
 
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
 
Seu Cliente no Controle! Testes ágeis
Seu Cliente no Controle! Testes ágeisSeu Cliente no Controle! Testes ágeis
Seu Cliente no Controle! Testes ágeis
 
Cucumber Best Practices
Cucumber Best PracticesCucumber Best Practices
Cucumber Best Practices
 
Desafios no desenvolvimento de uma aplicação real com Flex @ FUGSC
Desafios no desenvolvimento de uma aplicação real com Flex @ FUGSCDesafios no desenvolvimento de uma aplicação real com Flex @ FUGSC
Desafios no desenvolvimento de uma aplicação real com Flex @ FUGSC
 
MobileConf 2013: PhoneGap
MobileConf 2013: PhoneGapMobileConf 2013: PhoneGap
MobileConf 2013: PhoneGap
 
Tutorial de site de Ramalhovieira
Tutorial de site de RamalhovieiraTutorial de site de Ramalhovieira
Tutorial de site de Ramalhovieira
 
Boas práticas de Automação de Testes
Boas práticas de Automação de TestesBoas práticas de Automação de Testes
Boas práticas de Automação de Testes
 
Guia rapido total cross studio
Guia rapido total cross studioGuia rapido total cross studio
Guia rapido total cross studio
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introdução
 
Desenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma AndroidDesenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma Android
 
BeagaJS 2013: Sencha Touch + PhoneGap
BeagaJS 2013: Sencha Touch + PhoneGapBeagaJS 2013: Sencha Touch + PhoneGap
BeagaJS 2013: Sencha Touch + PhoneGap
 
Desenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyDesenvolvimento Mobile com Ruby
Desenvolvimento Mobile com Ruby
 
Php women oficina iniciante de php
Php women   oficina iniciante de phpPhp women   oficina iniciante de php
Php women oficina iniciante de php
 
Android 2303
Android 2303Android 2303
Android 2303
 
Cucumber e melhores práticas
Cucumber e melhores práticasCucumber e melhores práticas
Cucumber e melhores práticas
 
Cucumber-QA_Night
Cucumber-QA_NightCucumber-QA_Night
Cucumber-QA_Night
 
Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2
 

Demoiselle Behave - Visão Geral

  • 1. Automação de Testes de Software com:Automação de Testes de Software com: DemoiselleDemoiselle BehaveBehave IV Workshop de Testes do SERPROIV Workshop de Testes do SERPRO Julian Cesar dos SantosJulian Cesar dos Santos Vanderson Botêlho da SilvaVanderson Botêlho da Silva
  • 2. 2 Uma técnica de desenvolvimento ágiltécnica de desenvolvimento ágil criado por Dan North que integra regras de negócio com automação de testes. Evolução TDD: Por onde começa o processo? O que testar e o que não testar? O que chamamos de teste? Como analisar falhas? BDDBDDBehavior Driven Development
  • 4. Demoiselle BehaveDemoiselle Behave MotivaçãoMotivação  Especificação de ComportamentoEspecificação de Comportamento  Um dos grandes problemas na construção de um software é não entender exatamente o que ele deve fazer
  • 5. Demoiselle BehaveDemoiselle Behave MotivaçãoMotivação UseUse histórias concretashistórias concretas para ilustrar o que separa ilustrar o que se deseja do softwaredeseja do software
  • 6. Demoiselle BehaveDemoiselle Behave MotivaçãoMotivação Cenários de uso são maisCenários de uso são mais eficienteseficientes na comunicaçãona comunicação do que descrições.do que descrições.
  • 7. Demoiselle BehaveDemoiselle Behave MotivaçãoMotivação Exemplos reaisExemplos reais nosnos mantêm conectadosmantêm conectados com a visão dos nossoscom a visão dos nossos stakeholdersstakeholders
  • 9. Demoiselle BehaveDemoiselle Behave FuncionamentoFuncionamento Funcionalidade: Operar a Calculadora Narrativa: Para obter as operações básicas da calculadora Como um usuário qualquer Desejo resolver problemas matemáticos de forma mais rápida Cenário: Somar Dado que inicio a Calculadora Quando adiciono "5" E adiciono "7" Então seu valor será "12" Escreva suas histórias
  • 10. Demoiselle BehaveDemoiselle Behave FuncionamentoFuncionamento Cenário: Somar Dado que inicio a Calculadora Quando adiciono "5" E adiciono "7" Então seu valor será "12" @When("Quando inicio a Calculadora") public void goToWithName(String local) { } @When("adiciono "$valor"") public void whenAdiciono(double valor) { } @Then("seu valor será "$valor"") public void thenSeuValorSera(double valor) { } Suas frases devem ser mapeadas em métodos
  • 11. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  ObjetivoObjetivo  Para testes sob interfaces gráficas o mapeamento de tela visa desacoplar os elementos de tela ao script de automação.  BenefíciosBenefícios  Evita duplicação de código;  Maior manutenibilidade: se houver mudanças na tela a correção deverá ser aplicada em um único lugar.
  • 12. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  Diferenças para um Page ObjectDiferenças para um Page Object  Os mapeamentos não possuem comportamento;  Os comportamento são implementados nos steps;  Podemos reusar comportamentos para vários objetos e vice-e-versa;  Melhor manutenção, devido a redução de código.
  • 13. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  ExemploExemplo @ScreenMap(name = "Tela de Busca", location = "http://www.google.com.br") public class MyPage { @ElementMap( name = "Campo de Busca", locatorType = ElementLocatorType.Id, locator = "gbqfq") private TextField searchField; @ElementMap( name = "Estou com sorte", locatorType = ElementLocatorType.Id, locator = "gbqfbb") private Button buttonLuckSearch; }
  • 14. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  @ScreenMap@ScreenMap @ScreenMap( name = "Tela de Busca", location = "http://www.google.com.br") Identificação amigável da tela Identificação amigável da tela Localização da telaLocalização da tela @ScreenMap( name = "Tela de Busca", base="http://www.google.com.br", location = "/") Atributo opcional que define o prefixo do localizador. Importante quando deseja-se parametrizar os localizadores Atributo opcional que define o prefixo do localizador. Importante quando deseja-se parametrizar os localizadores Neste caso a localização da tela É a concatenação da base + location Neste caso a localização da tela É a concatenação da base + location
  • 15. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  @ElementMap@ElementMap @ElementMap( name = "Campo de Busca", locatorType = ElementLocatorType.Id, locator = "gbqfq") Identificação amigável do elemento de tela Identificação amigável do elemento de tela Tipo de localizador: ClassName; CssSelector Id; LinkText; Name; TagName; XPath Tipo de localizador: ClassName; CssSelector Id; LinkText; Name; TagName; XPathValor de LocalizadorValor de Localizador @ElementMap( name = "Menu Superior", locatorType = ElementLocatorType.Id, locator = { "gbztm", "gbmm" }) private Select menuLivros; Pode ser necessário Mais de um localizador Pode ser necessário Mais de um localizador
  • 16. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  Interface ElementInterface Element  Especificação que provê abstrações para elementos de tela:  Button.java  CheckBox.java  Grid.java  Label.java  Link.java  ListBox.java  Loading.java  Menu.java  MenuItem.java  PickList.java  Radio.java  Screen.java  Select.java  TextField.java @ElementMap( name = "Pesquisar", locatorType = ElementLocatorType.Id, locator = "gbqfb") private Button botaoPesquiar
  • 17. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  Interface ElementInterface Element  Cada projeto do tipo Runner deve implementar estas especificações public class WebButton extends WebBase implements Button { public void click() { waitElement(0); getElements().get(0).click(); } } public class WebButton extends WebBase implements Button { public void click() { waitElement(0); getElements().get(0).click(); } }
  • 18. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  Design DBehave - CompositeDesign DBehave - Composite  O design Page Object equivale ao refatoramento do  Vantagens:  Reuso de comportamentos;  Polimorfismo para tipos de telas (Web, Desktop, Mobile, ...) Dados ScreeMapScreeMap Comportamento ElementElement+ = Dados com Comportamento Page ObjectPage Object
  • 19. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  Integração BDDIntegração BDD  O DBehave implementa passos comunspassos comuns para interação com aplicações Web Cenário: Procurando uma Alma Gemea Dado que vou para a página "Alma Gemea" Quando clico em "Pesquisar" Quando informo "36" no campo "idade" Quando seleciono a opção "Solteiro" Então será exibido na "Caixa ao lado" o valor "Você está com sorte" Dado que estou na página "Buscar Alma Gemea" Então será exibido "Ricardão" Vai para a tela mapeada Vai para a tela mapeada Execute a operação de click Execute a operação de click Informa o valor de um campo de edição Informa o valor de um campo de edição
  • 20. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  Integração BDDIntegração BDD  O DBehave implementa passos comunspassos comuns para interação com aplicações Web Cenário: Procurando uma Alma Gemea Dado que vou para a página "Alma Gemea" Quando clico em "Pesquisar" Quando informo "36" no campo "idade" Quando seleciono a opção "Solteiro" Então será exibido na "Caixa ao lado" o valor "Você está com sorte" Dado que estou estou na página "Buscar Alma Gemea" Quando clico em "Procurar" Então será exibido "Ricardão" Selecione um campo de escolha (radio, check ou link) Selecione um campo de escolha (radio, check ou link) Verifica se um elemento Possui um determinado valor Verifica se um elemento Possui um determinado valor Verifica se um elemento Possui um determinado valor Verifica se um elemento Possui um determinado valor
  • 21. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  Integração BDDIntegração BDD  O DBehave implementa passos comunspassos comuns para interação com aplicações Web Cenário: Procurando uma Alma Gemea Dado que vou para a página "Alma Gemea" Quando clico em "Pesquisar" Quando informo "36" no campo "idade" Quando seleciono a opção "Solteiro" Então será exibido na "Caixa ao lado" o valor "Você está com sorte" Dado que estou na página "Buscar Alma Gemea" Quando clico em "Procurar" Então será exibido "Ricardão" Selecione um campo de escolha (radio, check ou link) Selecione um campo de escolha (radio, check ou link) Informa qual a página Atual sem executar ação de navegação Informa qual a página Atual sem executar ação de navegação Verifica em toda a tela a presença e um texto Verifica em toda a tela a presença e um texto
  • 22. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  Integração BDDIntegração BDD Funcionalidade: Acesso Como um: visitante Eu quero: acessar o Google De modo que: a página inicial apareceça para mim Cenário: Acesso ao Google Dado que vou para a página "Tela de Busca" Então será exibido "Google"
  • 23. Demoiselle BehaveDemoiselle Behave Mapeamento de TelaMapeamento de Tela  Integração BDDIntegração BDD  Inclua na classe MyPage o botão de pesquisa: Cenário: Utilização da funcionalidade de pesquisa Dado que vou para a página "Tela de Busca" Quando informo "Demoiselle Behave" no campo "Campo de Busca" Quando clico em "Pesquisar" Então será exibido "Demoiselle Behave" @ElementMap( name = "Pesquisar", locatorType = ElementLocatorType.Id, locator = "gbqfb") private Button botaoPesquisar;
  • 24. Demoiselle BehaveDemoiselle Behave NecessidadeNecessidade Especificação FormalEspecificação Formal Especificação FormalEspecificação Formal Funcionalidade: Acessa ao Sistema Cenário: Acessa sistema com usuário válido Dado que vou para a página "Tela de Login" Quando informo "joao" no campo "Usuário" E informo "123" no campo "Campo Senha" Quando clico em "Entrar" Então estou autenticado Especificação TestávelEspecificação Testável representa WebDriver driver = new FirefoxDriver(); driver.get("http://localhost:8080/treino/"); WebElement login = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'text')])")); login.clear(); login.sendKeys("joao"); WebElement senha = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'password')])")); senha.sendKeys("123"); WebElement botaoOk = driver.findElement(By.xpath("(//button[conta ins(@type, 'submit')])")); botaoOk.click(); Linguagem de ProgramaçãoLinguagem de Programação representa
  • 25. Demoiselle BehaveDemoiselle Behave WebDriver driver = new FirefoxDriver(); driver.get("http://localhost:8080/treino/"); WebElement login = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'text')])")); login.click(); login.clear(); login.sendKeys("joao"); WebElement senha = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'password')])")); senha.clear(); senha.sendKeys("123"); WebElement botaoOk = driver.findElement(By.xpath("(//button[conta ins(@type, 'submit')])")); botaoOk.click(); Funcionalidade: Acessa ao Sistema Cenário: Acessa sistema com usuário válido Dado que vou para a página "Tela de Login" Quando informo "joao" no campo "Usuário" E informo "123" no campo "Campo Senha" Quando clico em "Entrar" Então estou autenticado BenefíciosBenefícios HojeHoje – Redução de Custo– Redução de Custo ManutençãoManutenção AprendizagemAprendizagem ProdutividadeProdutividade
  • 26. Demoiselle BehaveDemoiselle Behave WebDriver driver = new FirefoxDriver(); driver.get("http://localhost:8080/treino/"); WebElement login = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'text')])")); login.click(); login.clear(); login.sendKeys("joao"); WebElement senha = driver.findElement(By.xpath("(//input[contai ns(@id, 'formLogin')][contains(@type, 'password')])")); senha.clear(); senha.sendKeys("123"); WebElement botaoOk = driver.findElement(By.xpath("(//button[conta ins(@type, 'submit')])")); botaoOk.click(); Funcionalidade: Acessa ao Sistema Cenário: Acessa sistema com usuário válido Dado que vou para a página "Tela de Login" Quando informo "joao" no campo "Usuário" E informo "123" no campo "Campo Senha" Quando clico em "Entrar" Então estou autenticado BenefíciosBenefícios FuturoFuturo – Colaboração– Colaboração
  • 27. Demoiselle BehaveDemoiselle Behave IntroduçãoIntrodução  Demoiselle BehaveDemoiselle Behave  O que é?  É um framework de integração de ferramentas para uso de técnicas de Desenvolvimento Orientada a Comportamento - Behaviour-Driven Development (BDD).  Além de uma ferramenta BDD:  Abstração de ferramentas BDD  Abstração de ferramentas de automação de testes  Abstração de ferramentas de gestão de testes  É um subprojeto do Framework Demoiselle (http://www.frameworkdemoiselle.gov.br/)
  • 28. Demoiselle BehaveDemoiselle Behave IntroduçãoIntrodução  Visão GeralVisão Geral Teste um sistemaTeste um sistema Behave Selecione um DriverSelecione um Driver Execute seus testesExecute seus testes EscrevaEscreva estóriasestórias Mapei telasMapei telas Registre seus resultadosRegistre seus resultados Escolha uma ferramentaEscolha uma ferramenta (1)(1) (2)(2) (3)(3) (4)(4) (5)(5)
  • 29. Demoiselle BehaveDemoiselle Behave JulhoJulho AgoAgo SetSet OutOut NovNov DezDez 20132013 JunhoJunhoMaioMaioAbrilAbril RoadMapRoadMap 6/14 VersãoVersão 1.0.01.0.0 Plataforma WebPlataforma Web ProspecçãoProspecção
  • 30. Demoiselle BehaveDemoiselle Behave JulhoJulho AgoAgo SetSet OutOut NovNov DezDez 20132013 JunhoJunhoMaioMaioAbrilAbril VersãoVersão 1.0.01.0.0 Plataforma WebPlataforma Web RoadMapRoadMap VersãoVersão 1.1.01.1.0 Integração ALMIntegração ALM 11/14 ProspecçãoProspecção
  • 31. Demoiselle BehaveDemoiselle Behave JulhoJulho AgoAgo SetSet OutOut NovNov DezDez 20132013 JunhoJunhoMaioMaioAbrilAbril VersãoVersão 1.0.01.0.0 Plataforma WebPlataforma Web VersãoVersão 1.1.01.1.0 Integração ALMIntegração ALM RoadMapRoadMap TreinamentoTreinamento ColaboradoresColaboradoresProspecçãoProspecção VersãoVersão 1.2.01.2.0 Plataforma DesktopPlataforma Desktop
  • 32. Demoiselle BehaveDemoiselle Behave Fim de História!Fim de História! Mais Informações:Mais Informações: https://github.com/demoiselle/behavehttps://github.com/demoiselle/behave