automaçãoweb - chaordic academy

Post on 12-Aug-2015

84 Views

Category:

Documents

9 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Alex Warmling | alex@chaordic.com.brFausto Siqueira | siqueira@chaordic.com.br

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 - alex@chaordic.com.br

○ 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 - siqueira@chaordic.com.br

○ 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?

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

● 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 | alex@chaordic.com.brFausto Siqueira | siqueira@chaordic.com.br

top related