automaçãoweb - chaordic academy
TRANSCRIPT
Alex Warmling | [email protected] Siqueira | [email protected]
Automação de testes WebRuby + Watir + Test::Unit + PageObject
Agenda
● Apresentação
● Expectativas
● Introdução ao teste de software
● Automação de testes, o que devo automatizar?
● Instalando o Ruby
Quem somos
● Alex Warmling - [email protected]
○ 3+ anos de QA
○ Já atuou como DEV
○ Instrutor de teste de software no programa
GeraçãoTEC;
○ FullStack QA na Chaordic
Quem somos
● Fausto Siqueira - [email protected]
○ 8+ anos de QA
○ Trabalhou na EDS e IBM
○ Agile test lead na Chaordic
○ ISTQB Certified Foundation Level Tester
Expectativas
Apresentação dos participantes
● Trabalha em ambiente ágil ou tradicional?
● É QA?
● Sua equipe escreve testes unitários?
● Sua equipe pratica TDD ou outra prática
test-driven?
Teste de software
Por que testar?
Por que testar?
Por que testar?
Por que testar?
Testes consistem na verificação dinâmica do funcionamento de um programa em um conjunto finito de casos de teste, selecionado dentro de domínio infinito de entradas, contra seu funcionamento esperado (SWEBOK, 2004)
● Dinâmico – Execução● Finito – Existem muitos casos de teste● Selecionado – Técnicas diferem na
seleção● Esperado – Funcionamento esperado
deve ser verificado
Definição
● Encontrar e documentar defeitos
● Fornecer base para percepção da qualidade do
software
● Avaliar se o produto de software funciona como
projetado e esperado
● Garantir que os problemas encontrados sejam
corrigidos
Objetivos
● Muitos bugs são gerados e não são encontrados
quando o software ainda esta em desenvolvimento
● Com os sistemas para internet o número de usuários
é milhares de vezes maior
● Necessidade de equipes especializadas em testes
● O custo destes bugs se torna cada vez maior
Cenário atual
Custo de correção
Então, testando eliminamos todos os defeitos?
Segundo MYERS (1979), em seu livro The art of sotware
testing:
● Testes unitários podem remover de 30% a 50% dos
defeitos
● Testes de sistemas podem remover de 30% a 50%
dos defeitos remanescentes
● Revisão de código pode ainda reduzir entre 20% e
30% do restante
● Software em produção ainda com ~40% de defeitos
“Qualidade não é uma fase do ciclo de
desenvolvimento de software, é parte de
todas as fases”
Quando testar?
Quando testar?
Durante todo o ciclo de vida.
Quando testar?
Como faço para saber o que testar primeiro então?
● Identificar componentes e features do software a serem testados:○ Priorizar○ Positivos/negativos○ Os mais graves○ Os mais prováveis○ Falhas anteriores○ …
● Considerar aspectos funcionais e não-funcionais● Considerar tempo, recursos, riscos● Nem tudo pode ser testado, e o que é testado não
pode ser completamente testado.
Por que e o que devo automatizar?
Vantagens de test scripts
● Operações definidas
● Escopo definido
● Resultado esperado definido
● Testes manuais controlados
Vantagens de test scripts
● Re-uso
● Documentação
● Evidências da execução
● Cálculo de métricas como cobertura de testes
Razões para automatizar
● Testes manuais demoram muito
● Processos manuais são mais suscetíveis à erros
● Tester executa casos mais “criativos”
Razões para automatizar
● Documentação ativa
● Testes guiando o código
● Cobertura de teste
Razões para automatizar
● Escalabilidade de execução de testes
● Repetição controlada
● Ambientes controlados e definidos
● Execução rápida e contínua, idealmente robusta
● Entra na Integração Contínua
Integração contínua
● Área de Staging
● Confiança para deploy
● Visibilidade sobre a integridade da build
● Regressão da aceitação evita quebra de regra de
negócios
Integração contínua - Testes candidatos ● Testes de regressão
● Re-teste de bugs
● Testes unitários
● Testes de aceitação
Integração contínua
● Feedback contínuo para a equipe DEV
● Feedback para área de negócios, testes de
aceitação
● Servidores de integração contínua
○ Jenkins Ci
■ Ci-reporter gem
○ Circle Ci
Quadrantes do teste ágil
fonte: lisacrispin.com
Candidatos à automação
● Teste unitários
● Re-teste de bugs
● Testes de aceitação
● Formando suites de regressão
Testes unitários
● Cenários básicos
● Common cases
● Happy paths / Negative paths
● Edge cases
● Bug fix -> automated re-test
● Cobertura > 90%
Frameworks para testes unitários
● xUnit
● JUnit
● TestNG
● Test::Unit
● MiniTest
Notações
fonte: http://www.mkyong.com/unittest/junit-4-vs-testng-comparison/
Test::Unit
● Implementação do framework xUnit para
Ruby
● Test::Unit::Assertions
○ assert
○ assert_equal
○ assert_not_equal
○ assert_raise
Um teste automático por re-teste de bug fix evita a
recorrência do problema
Re-teste de bugs
● Bug fix é validado com um teste script
automático
● Script é adicionado à suite de regressão
● Evitar recorrência de bugs é fundamental
Testes de aceitação
● Feedback contínuo para o cliente
● Visibilidade sobre o status do sistema
● Transparência com o cliente
● Documentação dinâmica e ativa
● Confiança
● Regressão
Bug tracking
Adotar?● Comunicação
● Agilidade em corrigir bugs
● Priorização para correções VS. novas funcionalidades
● Métricas
● Knowledge base
● Auditoria
● Evidências
Bug tracking
Adotar?● Times distribuídos
● Grandes equipes
● Ferramenta de comunicação
● Rastreabilidade entre requisitos
● Bugs em produção
Bug tracking
Urgências● Regressão falhando -> ALERTA VERMELHO
● Bugs em produção
● Bugs reportados pelo cliente
Desafios
● Atitude
● Coragem para codificar
● Conhecimento
● Curva de aprendizado
● Investimento inicial
● Não quer ser DEV
Instalação Ruby em Linux
● RVM - Ruby Version Manager
○ “RVM gives you compartmentalized independent
ruby setups. This means that ruby, gems and irb
are all separate and self-contained - from the
system, and from each other.”
● https://rvm.io/rvm/install
● Linux
$ \curl -sSL https://get.rvm.io | bash -s stable --ruby $ ruby -v
Instalação Ruby em Linux
● $ source /home/siqueira/.rvm/scripts/rvm
● Criar GemSet○ $ rvm create gemset academia_chaordic
Instalação Ruby em Windows
● http://rubyinstaller.org/downloads
Instalação Watir-Webdriver e Test::Unit Gem
● Gemfile
source 'https://rubygems.org'gem 'test-unit'gem 'watir-webdriver’
● $ bundle install
Ruby
Ruby basics
Editor textoSublime Text
Tudo em RUBY é um OBJETO
IRB
● Interpretador Ruby
$ irb
Comentários
● De linha
● De bloco
# for i in 0..5# if i > 2 then# break# end# puts "Valor da variavel local seria #{i}"
# end
=beginfor i in 0..5
if i > 2 then break
endputs "Valor da variavel local seria #{i}"
end =end
Classes e métodos
Require
Escopo de variáveis
● Locaisa. Escopo de métodob. Variáveis locais começam com letra minúscula ou _.
● Instância: a. Escopo de objeto.b. Nome precedido por @
● Classe: a. Escopo de classe. b. Característica de uma classe.c. Disponível para diferentes objetos.d. Precedidas por @@
● Globais: a. Disponível entre classes. b. Nome precedido por $
Strings Operações
Soma
Multiplicação
Strings Concatenação e Comparação
Concatenação
Comparação de tamanho
Strings Regex match
Match regex
Strings Métodos interessantes
capitalize
downcase
empty
gsub
Interpolação de Strings
Curiosidades
Imprimindo na tela
● puts ‘Academia Chaordic’
● print ‘Academia Chaordic’
Array
● a = Array.new
● b = [ ]
● a = [ 1, 2, 3 ]
● b = [ 1, 3, 4 ]
Array push & pop
● a.push 4
● a.pop
● a.pop 2
a << 4
Array shift
● a.shift
● a.unshift 0
Array adição e subtração
Subtração
Adição
Array index
Range inclusivo e exclusivo
Ìndices
Range inválido
Array deletion
delete_at
delete
Array methods
Desafio
Encontre o tamanho das Strings
"test",
"ruby_r0x",
"academia_chaordic"
Pode-se usar um Array e o método collect
Desafio
Encontre o tamanho das Strings
["test", "ruby_r0x", "academia_chaordic"].collect{ |string| string.length }=> [ 4, 8, 17 ]
Desafio 2
Somar os números
1 ,3 ,5 ,7 ,9 ,11 ,13
Pode-se usar um Array e o método inject
Desafio 2
Somar os números
# Sum 1,3,5,7,9,11,13
[1,3,5,7,11,13].inject { |a,b| a+b }
Condicionais
● if...else
if conditional [then] code...
[elsif conditional [then] code...]...
[else code...]
end
Condicionais
● if...else
Condicionais
● unless
Loops
● while
Loops
● while
Loops
● until
Loops
● for
● each
Loops
● break
File I/O
● handle
File I/O
● Imprima em um arquivo o maior e o menor valor de
um array com 10 números inteiros
● Aqui você pode utilizar os conceitos de Array, if e
for
Web Application Testing in Ruby
Automate your web browser beautifully, nicely and
easily with some very sweet syntactic sugar.
What is Watir?
● Open-source web test automation framework
● Bibliotecas Ruby
● Independente de tecnologia da app
● Simula input de usuário no navegador
Watir drives browsers the same way people do. It
clicks links, fills in forms, presses buttons. Watir also
checks results, such as whether expected text
appears on the page. [watir.com]
Re-teste de bugs
Watir-classic
● Somente Internet Explorer
● Manipula o navegador via OLE - Object Linking and Embedding sobre a arquitetura COM - Component Object Model
● IE -> serve objetos, expondo seus métodos
● Ruby -> cliente, manipula os objetos
Watir-webdriver
● Versão moderna da API Watir baseada em Selenium 2.0 com WebDriver
● Jari Bakken implementou
● Construída a partir da especificação HTML
● W3C compatível
Watij
● Web Application Testing in Java
● Simplicidade do Watir com poder do Java
● Pode-se usar JRuby e o interpretador IRB
Vantagens
● Comunidade ativa
● Ruby nativa
● Suporte a multiplos browsers
● Poderosa, leve e fácil de utilizar
● Sem gravadores - Test records
Vantagens
● Sem find_element(s) === menos código;
● Specific methods (divs, buttons, links…);
Selenium: driver.find_element(:class, 'product-title')
Watir: driver.div :class => ‘product-title’
● Explicit waits for AJAX (Selenium :timeout => 10)
● JavaScript alerts
Vantagens
● Fácil de lidar com iFrames
● Utilizar com rubygem PageObject
● Possível medir performance da página com Watir-
WebDriver-Performance gem
Wait explícitosWatir::Wait.until { code block }
object.when_present.method
object.wait_until_present.method
object.wait_while_present.method
Wait explícitos
Wait implícitos
require 'watir-webdriver'browser = Watir::Browser.newbrowser.driver.manage.timeouts.implicit_wait = 3
● Teste pode se tornar mais devagar
● “Vício do uso” polui código
Cookies
add (name, value, opts = {})
cookie.clear
cookies.delete (name)
cookies.to_a
iFrames
browser.frame(: => “content_ifr”).button(:id => ‘button_01’).click
Js alerts();browser.alert.ok
browser.alert.exists?
browser.alert.text
browser.alert.close
Element presence
● exists?
● visible?
● present?
Exemplorequire 'watir-webdriver'
firefox = Watir::Browser.new :firefoxfirefox.goto 'google.com'firefox.text_field(:name => 'q').set 'chaordic'firefox.button(:name => 'btnG').click
beginfirefox.links.each do |link|link.click if link.href == 'http://www.chaordic.com.br/'endrescue Selenium::WebDriver::Error::StaleElementReferenceError
nilend
firefox.quit
●
Performance
● Measure page performance gem
“The Watir-WebDriver-Performance gem aims to provide a set of navigation timing metrics for Watir-WebDriver actions using a W3C page performance standard. This is a perfect solution to capture response time metrics, and it’s very straightforward to do but currently only works in Chrome and IE9l, so there’s no Firefox support.”
Performance● Measure page performance gem
LOC● Lines of Code comparison
● Selenium WebDriver VS. Watir WebDriver
Selenium WebDriver
Selenium WebDriver
Watir WebDriver
Chaordic Mindset to write your Automated scripts
Testing your script
Cenários de Aceitação
1. Usuário do ecommerce fastshop.com.br quer colocar um produto no carrinho e calcula o frete
● Quais seriam as validações a serem feitas?
Test::Unit
xUnit family test automation framework for Ruby
● assert_block
● assert
● assert_equal
● assert_not_nil (exp, msg)
● assert_no_match (regexp, string, msg)
● assert_equal (expected, actual, msg)
http://rubydoc.info/gems/test-unit/2.5.5/frames
● assert_compare (1, “<”, 10)
● assert_inclue ([1..10, 2, msg)
● assert_equal (expected, actual, msg)
http://www.ruby-doc.org/stdlib-2.1.2/libdoc/test/unit/rdoc/Test/Unit/Assertions.html
● Setup and Teardown
● Test suite
● Test case
● Helpers
● Wireframe = Maps web UI elements
● Devs do homework = IDs
● QA creates a class (model) for the page
● Model will support testing
● DRY
● Easy API
● Implementa o padrão Page Object em Watir WebDriver e Selenium WebDriver para Ruby○ https://github.com/cheezy/page-object
Page Object cheezy gem
“...facilitate creating abstraction layers in your tests to decouple the tests from the item they are testing and to provide a simple interface to the elements on a page.”
● ATDD - Acceptance Testing Driven Development
● Linguagem simples para interagir com o conteúdo da página web
● Integração fácil com rspec e cucumber
Page Object cheezy gem
● A Simple way of dealing with Frames and iFrames
● Robust way of dealing with Ajax Calls
● A clean way of handling Javascript Popups
● Support for most html Elements
Page Object cheezy gem
● Accessors
http://rubydoc.info/github/cheezy/page-
object/master/PageObject/Accessors
● Element return
● Checkbox
Acessorsauto methods
● Button
● Link
Acessorsauto methods
exampleclass
script class
UI elements naming update
script class
Links úteis● Ruby
○ http://www.tutorialspoint.com/ruby/○ https://www.ruby-toolbox.com○ https://github.com/watir/watir/wiki/Cheat-Sheet-for-Ruby
● Watir Webdriver○ http://watirwebdriver.com/○ http://www.hiretheworld.com/blog/tech-blog/migrating-unit-tests-
from-selenium-to-watir-webdriver○ http://en.wikipedia.org/wiki/Watir#Watir-webdriver○ https://github.com/watir/watir/wiki/HTML-Elements-Supported-by-
Watir
● PageObject○ http://www.cheezyworld.com/2011/07/29/introducing-page-object-
gem/○ http://martinfowler.com/bliki/PageObject.html
● Integração Contínua○ http://en.wikipedia.
org/wiki/Comparison_of_continuous_integration_software
Alex Warmling | [email protected] Siqueira | [email protected]