[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver

Download [38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver

Post on 20-Mar-2017

1.461 views

Category:

Technology

1 download

Embed Size (px)

TRANSCRIPT

<ul><li><p>www.qualister.com.br </p><p>(48) 4052-9536 / 9540 contato@qualister.com.br </p><p>Automao de Testes Web em Ruby com </p><p>Cucumber e Webdriver </p><p>por Jlio de Lima @juliodelimas</p><p>38 encontro do Guru-SP | So Paulo, 07 de novembro de 2015</p></li><li><p>Palestrante</p><p>Jlio de LimaEspecialista em teste de software com nfase em automao de testes de software, possui formao em Tecnologia da Informao e certificaes internacionais (CTFL e CTAL-TM pelo ISTQB) e nacional (CBTS pela ALATS) relacionada a testes de software alm de ser certificado na ferramenta SoapUI Pro pela SmartBear Software. Atualmente consultor de automao de testes e instrutor na Qualister e professor de disciplina de teste de software em cursos de ps-graduao no Paran e em Santa Catarina.</p><p>julio.lima@qualister.com.br </p><p>twitter.com/juliodelimasbr.linkedin.com/in/juliodelimas </p><p>goldtips.by/juliodelimas</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>3</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo CincoCucumber </p><p>Especificao dos Testes </p><p>Frameworks utilizados</p><p>4</p><p>Selenium Webdriver </p><p>Driver </p><p>RSpec Expectativas </p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>Cucumber um framework escrito em Ruby utilizado para automao de testes de aceitao. Testes escritos com Cucumber descrevem como a aplicao deve se comportar. </p><p>A descrio dos comportamentos da aplicao pode ser feitos em diversos idiomas, inclusive em Portugus. Cucumber escrito em Ruby, mas pode ser utilizado em diversas linguagens de programao, como: Java, C# e Python. </p><p>A descrio dos comportamentos da aplicao composta basicamente por Funcionalidade, Cenrios e Passos do cenrio. Esta descrio feita utilizando Gherkin, um modelo de escrita compreendida pelo Cucumber.</p><p>Cucumber</p><p>5</p><p>Cucumber Especificao </p><p>dos Testes </p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>O que o Cucumber pode fazer </p><p> Escrever comportamentos do sistema em texto puro, em diversos idiomas Testar classes e mtodos Ruby, Java, C# e Python Executar testes a partir de linha de comando Integrar-se com ferramentas de integrao contnua Gerar documentao dos comportamentos da aplicao Gerar relatrios de execuo dos testes </p><p>Cucumber</p><p>6</p><p>Cucumber Especificao </p><p>dos Testes </p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>Gherkin a sintaxe utilizada para escrever funcionalidades no Cucumber. um domnio especfico de linguagem para escrever regras de negcio de fcil leitura </p><p>Sintaxe criada para ser utilizada por usurio tcnicos e no tcnicos. Funcionalidades escritas no formato Gherkin tambm so usadas como documentao do sistema. Elas no detalham como a funcionalidade dever ser implementada. </p><p>Cada linha da descrio da funcionalidade iniciada por uma palavra chave e o escopo definido utilizando indentao. Funcionalidades em Gherkin podem ser escritas em portugus ou em mais de 30 idiomas. Linhas podem ser comentadas utilizando # no incio da linha</p><p>Gherkin</p><p>7</p><p>Gherkin DSL </p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>Exemplo: # language: ptFuncionalidade: Descrio da funcionalidade desejada Sendo algum que ser beneficiado Posso utilizar uma funcionalidade do sistema Para que possa alcanar um benefcio para o negcio Cenrio: Uma situao de negcio Dado que tenho uma precondio Quando eu executo alguma ao E executo alguma outra ao Ento recebo uma sada resultante das aes executadas Mas algo muda no estado atual do sistema</p><p>Gherkin</p><p>8</p><p>Gherkin DSL </p><p>Daniel Wildt e Rafael Helm - Histrias de Usurio 3a Ed.(www.wildtech.com.br/historias-de-usuario/)</p><p>Introducing BDD | Dan North &amp; Associates (dannorth.net/introducing-bdd/)</p><p>http://www.wildtech.com.br/historias-de-usuario/http://dannorth.net/introducing-bdd/</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>Os arquivos so salvos com a extenso .feature. </p><p>Funcionalidades podem ter mltiplos cenrios e cada cenrio iniciado pela palavra chave Cenrio. </p><p>Cada cenrio possui passos, sempre iniciados pelas palavras chave: Dado, Quando, Ento, E e Mas. </p><p>Gherkin</p><p>9</p><p>Gherkin DSL </p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>Selenium Webdriver um framework de automao de testes originalmente escrito em Java, mas posteriormente disseminado em diversas linguagens de programao. </p><p>Possui uma biblioteca completa de simulao de aes do usurio sobre o browser, permitindo assim automatizar estas aes. </p><p>O WebDriver conversa diretamente com um browser real (Firefox, por padro), por isso, h a necessidade de t-lo instalado na mquina.</p><p>O que ?</p><p>10</p><p>Selenium Webdriver </p><p>Driver </p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>O RSpec um framework BDD (Behavior-Driven Development), escrito em Ruby, utilizado para estruturar os testes em ordem comportamental, utilizando escrita em linguagem natural. </p><p>Ele tambm possui uma potente biblioteca de expectativas e matchers, que utilizada juntamente com outros diversos frameworks de validao de aplicaes. </p><p>Usaremos ele em conjunto com os demais frameworks para validar nossas aplicaes. </p><p>O que ?</p><p>11</p><p>RSpec Especificao </p><p>dos testes </p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>12</p><p>Preparando o projeto</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>Preparando o projeto</p><p>1. Crie o diretrio C:\GURUSP\Cucumber2. Crie o diretrio C:\GURUSP\Cucumber\features3. Crie o diretrio C:\GURUSP\Cucumber\features\step_definitions4. Crie o diretrio C:\GURUSP\Cucumber\features\support5. Instale o Bundler, um gerenciador de dependncias, com gem install bundler6. Execute o comando bundle init dentro do diretrio Cucumber</p><p>Adicione as dependncias ao Gemfile que foi gerado na raiz do projeto:# A sample Gemfile source "http://rubygems.org" # gem "rails" gem 'selenium-webdriver', '~&gt; 2.48.1' gem 'rspec-expectations', '~&gt; 3.3.1' gem 'cucumber', '~&gt; 2.1.0' </p><p>8. Execute o comando "bundle install9. E ento veremos o status abaixo:Bundle complete! 3 Gemfile dependencies, 15 gems now installed. 13</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>14</p><p>Hands-on</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>15</p><p>Hands-on</p><p>Crie dentro do diretrio features um arquivo chamado gerenciarMovimentacoes.feature e adicione a ele o seguinte texto:# language: pt </p><p>Funcionalidade: Gerenciar Movimentaes Sendo o administrador de uma loja Posso gerenciar movimentaes Para que possa ver, de forma simples, as entradas e sadas de valores Cenrio: Gerando uma movimentao de entrada Dado que eu esteja autenticado como administrador E que eu tenha acessado o menu "Movimentaes" E clicado em "Nova movimentao para inserir uma movimentao Quando informar "Entrada" como tipo de movimentao E informar "50,00" como valor da movimentao E Informar "PlayStation e XBox" como itens da movimentao E clicar em "Gravar" Ento verei a mensagem "Sucesso ao inserir a movimentao" como sucesso da operao</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>16</p><p>Hands-on</p><p>Agora, execute o comando cucumber --color na raiz do projeto e ento veremos como foi a execuo dos cenrios:</p><p>1 scenario (1 undefined) </p><p>8 steps (8 undefined) </p><p>0m0.062s </p><p>Sero gerados snippets de cdigo para os cenrios ainda no definidos, veja um exemplo:</p><p>You can implement step definitions for undefined steps with these snippets: </p><p>Dado(/^que eu esteja autenticado como administrador$/) do pending # Write code here end</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>17</p><p>Hands-on</p><p>O que faremos agora criar um arquivo chamado "gerenciarMovimentacoes.rb" no diretrio step_definitions" e ento cole o snippet de cdigo que foi copiado do console:</p><p># encoding: utf-8 Dado(/^que eu esteja autenticado como administrador$/) do pending # Write code here end </p><p>Este mtodo prope que faamos login na aplicao que desejamos testar, ento, escreveremos comandos do Selenium Webdriver, que reproduziro as aes do usurio, comeando por abrir o navegador, maximizar a tela e determinar um tempo mximo de espera:</p><p>@navegador = Selenium::WebDriver.for :firefox @navegador.manage.window.maximize @navegador.manage.timeouts.implicit_wait = 5 </p><p>O @ serve para fazer com que a varivel possa navegar por todos os passos do nosso teste. Agora iremos navegar at a pgina inicial de nossa aplicao:</p><p>@navegador.get http://localhost:4567/quickloja/'</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>18</p><p>Hands-on</p><p>E agora, preencher os campos do formulrio de login e clicar no boto Entrar" para ter acesso ao interior da aplicao, veja:</p><p>@navegador.find_element(:id, 'usuariologin').send_keys("teste") @navegador.find_element(:id, 'usuariosenha').send_keys("123") @navegador.find_element(:css, button[type="submit"]').click </p><p>timo, j escrevemos o primeiro passo, antes de execut-lo precisamos criar um arquivo env.rb no diretrio features/support" e adicionar a ele os requires para o RSpec, Cucumber e Webdriver:</p><p># encoding: utf-8 require 'cucumber/formatter/unicode' require 'rspec/expectations' require selenium-webdriver' </p><p>Agora executaremos os cenrios novamente:</p><p>cucumber --color</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>19</p><p>Hands-on</p><p>O resultado ser a apresentao do primeiro passo em verde:</p><p>Dado que eu esteja autenticado como administrador # features/step_definitions/gerenciarMovimentacoes.rb:3 </p><p>E os demais em amarelo, uma vez que ainda no foram definidos. E o status geral demonstrar o seguinte resultado:</p><p>1 scenario (1 undefined) 8 steps (7 undefined, 1 passed) 0m7.539s </p><p>O prximo passo copiar o segundo passo e automatizar os testes que demonstram que ele pode ser executado com sucesso, logo, copio o snippet para o arquivo gerenciarMovimentacoes.rb" e crio a automao para ele, veja:</p><p>Dado(/^que eu tenha acessado o menu "([^"]*)"$/) do |arg1| pending # Write code here that turns the phrase above into concrete actions</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>20</p><p>Hands-on</p><p>Este passo tem duas caractersticas diferentes, uma expresso regular e uma varivel que receber o valor extrado por ela, veja:</p><p>Dado(/^que eu tenha acessado o menu "([^"]*)"$/) do |arg1| pending # Write code here end </p><p>Vamos renomear a varivel arg1" para menu. A varivel menu possuir o nome do menu a ser clicado, ento nosso cdigo ficar assim:</p><p>Dado(/^que eu tenha acessado o menu "([^"]*)"$/) do |menu| @navegador.find_element(:link_text, menu).click end </p><p>Ao executar o teste agora, veremos que dois casos j foram executados, restando agora 7 passos indefinidos, okay, vamos ao prximo:</p><p>Dado(/^clicado em "([^"]*)" para inserir uma movimentao$/) do |arg1| pending # Write code here end</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>21</p><p>Hands-on</p><p>Que ficar assim:</p><p>Dado(/^clicado em "([^"]*)" para inserir uma movimentao$/) do |botao| @navegador.find_element(:link_text, botao).click end </p><p>Agora restam 5 passos, vamos ao prximo:</p><p>Quando(/^informar "([^"]*)" como tipo de movimentao$/) do |arg1| pending # Write code here end </p><p>Que ficar assim:</p><p>Quando(/^informar "([^"]*)" como tipo de movimentao$/) do |tipo| movimentacaotipo = Selenium::WebDriver::Support::Select.new(@navegador.find_element(:name, "movimentacaotipo")) movimentacaotipo.select_by(:text, "Sada") # ou :index ou :value end </p><p>Agora restam 4 passos, o prximo :</p><p>Quando(/^informar "([^"]*)" como valor da movimentaao$/) do |arg1| pending # Write code here end</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>22</p><p>Hands-on</p><p>Que ficar assim:</p><p>Quando(/^informar "([^"]*)" como valor da movimentao$/) do |valor| @navegador.find_element(:name, "movimentacaovalor").send_keys(valor) end </p><p>Agora restam 3 passos, vamos ao prximo:</p><p>Quando(/^Informar "([^"]*)" como itens da movimentao$/) do |itens| pending # Write code here end </p><p>Que ficar assim:</p><p>Quando(/^Informar "([^"]*)" como itens da movimentao$/) do |itens| @navegador.find_element(:name, "movimentacaoitens").send_keys(itens) end </p><p>Agora restam 2 passos, o prximo :</p><p>Quando(/^clicar em "([^"]*)"$/) do |arg1| pending # Write code here end</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>23</p><p>Hands-on</p><p>Que ficar assim:</p><p>Quando(/^clicar em "([^"]*)"$/) do |botao| @navegador.find_element(:css, ".btn.btn-primary").click end </p><p>Vamos ao ltimo passo:</p><p>Entao(/^verei a mensagem "([^"]*)" como sucesso da operao$/) do |arg1| pending # Write code here end </p><p>Que ficar assim:</p><p>Entao(/^verei a mensagem "([^"]*)" como sucesso da operao$/) do |msg| expect(@navegador.find_element(:css, ".alert").text).to eq(msg) @navegador.quit end </p><p>Obs. Note que usamos o mtodo quit" para fechar o browser ao fim da execuo, agora, ao executar o teste teremos o seguinte resultado:</p><p>1 scenario (1 passed) 8 steps (8 passed) 0m12.360s</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corpo Quatro</p><p> Nvel de Corpo Cinco</p><p>24</p><p>Gerar um relatrio de execuo no formato HTML </p><p>cucumber --format html --out relatorio.html </p><p>Hands-on</p><p>Sada:</p></li><li><p>www.qualister.com.brwww.qualister.com.br</p><p>Texto do Ttulo</p><p> Nvel de Corpo Um Nvel de Corpo Dois</p><p> Nvel de Corpo Trs Nvel de Corp...</p></li></ul>