Upload
julio-de-lima
View
385
Download
1
Embed Size (px)
Citation preview
Globalcode – Open4education
Ruby in TestsJúlio de Lima
Especialista em Testes na RSI @juliodelimas
Globalcode – Open4education
Objetivo
Ao fim da palestra, você saiba como preparar o ambiente e escrever scripts de teste automatizados de unidade, API e GUI (Web) usando frameworks open-source em Ruby.
Globalcode – Open4education
"RubyInTests"
O nome da palestra baseia-se em uma série de artigos de minha autoria originados de um #desafioAgileTesters feito pelo amigo Diego Blond (@PerdidoNoTeste).
Conheçam mais sobre o desafio e a comunidade Agile Testers:
bit.ly/desafioAgileTesters2016
Globalcode – Open4education
O conceito
Unidade API GUI
Métodos de uma classe que serão testados de
forma isolada
Métodos que utilizam as unidades de forma conjunta para receber, processar e devolver
informações do sistema
Interface gráfica, que consome as APIs, apresentando suas
informações de forma amigável
Application Programming Interface Graphical user interface
Globalcode – Open4education
Frameworks
RSpec Rest-Client WebDriverDocumentação:
relishapp.com/rspecDocumentação:
github.com/rest-client/rest-clientDocumentação:
bit.ly/WebDriverRuby
Unidade API GUI
Globalcode – Open4education
Preparando o ambiente1. Instale o Ruby 2.0
rubyinstaller.org * Adicione o diretório do Ruby às variáveis de ambiente
2. Baixe o DevKit na mesma URL e extraia-o em C:\Ruby200\dk
3. Instale o DevKit executando as linhas abaixo no prompt
ruby C:\Ruby200\dk\dk.rb init ruby C:\Ruby200\dk\dk.rb install
4. Instale a Gem do Bundler
Digite gem install bundler no prompt de comando
Globalcode – Open4education
Preparando o projeto1. Crie o diretório “RubyInTestTDC” e acesse-o via prompt
2. Execute o comando bundle init
3. Agora o arquivo Gemfile foi criado
Adicionaremos a ele todas os frameworks que utilizaremos
4. Abra o Gemfile e substitua seu conteúdo pelas linhas abaixo:
source "http://rubygems.org" gem 'rspec', '~> 3.3.0' gem 'rest-client', '~> 1.8' gem 'selenium-webdriver', '2.48.1' gem 'sinatra' # Para o app de teste
5. Execute o comando bundle install
Globalcode – Open4education
Você pode assistir esse passo a passo no YouTube através do link abaixo:
bit.ly/RubyInTestInstalacao
Globalcode – Open4education
Automatizando testes de unidade
# C:\RubyInTestTDC\avaliacao_class.rb
class Avaliacao def avaliar(notaprova, notatrabalho) if (notaprova >= 7) if (notatrabalho >= 7)
return "Aprovado" else
return "Exame" end
else return "DP"
end endend
Para demonstrar este tipo de teste, usaremos a class Avaliação, que possui um método chamado “avaliar”, que recebe dois parâmetros: notaprova e notatrabalho.
Globalcode – Open4education
Automatizando testes de unidade
# C:\RubyInTestTDC\spec\unit\avaliacao_spec.rb
require_relative "../../avaliacao_class"
describe Avaliacao do it "alunos com notas maiores ou iguais a 7 são aprovados" do # Arrange avaliacao = Avaliacao.new() # Act resultado = avaliacao.avaliar(7, 7)
# Assert expect(resultado).to eq("Aprovado") endend
Teríamos que desenvolver três testes de unidade para testar o método avaliar, eles seguem a mesma estrutura do método abaixo:
Globalcode – Open4education
Automatizando testes de unidadeA execução dos testes de unidade se dá através do comando:
rspec C:\RubyInTestTDC\spec\unit\avaliacao_spec.rb --color
Veremos o resultado semelhante ao abaixo:
.
Finished in 0 seconds (files took 0.1716 seconds to load) 1 example, 0 failures
Digamos que tenhamos esquecido que a nota de corte era 7 e então mudamos no código para 8. Ao rodar, veremos o erro abaixo:
Failure/Error: expect(resultado).to eq("Aprovado")
expected: "Aprovado" got: "DP"
Globalcode – Open4education
Automatizando testes de API
Para demonstrar este tipo de teste, usaremos uma API REST chamada “escola”, que consome a classe e método que testamos anteriormente.
Ela está disponível no endereço:
http://localhost:4567/escola/api/
Essa API possui apenas um recurso e um método:
POST avaliar
@notaprova (String) @notatrabalho (String)
Resposta:
@status (String) [fail/success] @message (String)[Aprovado/Exame/DP]
Globalcode – Open4education
Automatizando testes de API
O RSpec fornece suporte a todos os métodos utilizados em API Rest, dentre eles: GET, POST, PUT, DELETE.
Veremos aqui um exemplo utilizando o método POST, para avaliar o aluno
A resposta proveniente da API, obtido através da propriedade “body" do objeto "resposta", geralmente vem em formato JSON, semelhante à que temos abaixo:
{"status":"success","message":"Aprovado"}
# Executando a requisição
resposta = RestClient.post('http://localhost:4567/escola/api/avaliar', :notaprova => '7', :notatrabalho => '7'
)
# Chamando o framework Rest-Clientrequire 'rest-client'
Globalcode – Open4education
Automatizando testes de API
Então é necessário converte-la em objeto estruturado para que possamos ter acesso à resposta como um objeto, veja:
E, por fim, executamos as validações:
# Executando a requisição
resposta = RestClient.post('http://localhost:4567/escola/api/avaliar', :notaprova => '7', :notatrabalho => '7'
)
# Convertendo o resultado de JSON para Objectcorpo = JSON.parse(resposta.body, object_class: OpenStruct)
# Validando resultadosexpect(corpo.status).to eq("success")expect(corpo.message).to eq("Aprovado")
Globalcode – Open4education
Automatizando testes de API
Agora já sabemos como interagir com a API e validar os resultados. O próximo passo é criar a estrutura do teste usando RSpec, já sabemos como fazer isso:
Observações:
• O require é necessário para podermos utilizar o framework Rest-Client; • Os contextos facilitam a visualização dos resultados;
require 'rest-client'
describe "Gerenciar API Escola" do context "/avaliar" do context "GET" do it "alunos com notas maiores ou iguais a 7 são aprovados" do # Interações com a API e validações end end endend
Globalcode – Open4education
Automatizando testes de API
# C:\RubyInTestTDC\spec\api\escola_spec.rbrequire 'rest-client'describe "Gerenciar API Escola" do context "/avaliar" do context "GET" do it "alunos com notas maiores ou iguais a 7 são aprovados" do # Executando a requisição resposta = RestClient.post( 'http://localhost:4567/escola/api/avaliar', :notaprova => '7', :notatrabalho => '7' ) # Convertendo o resultado de JSON para Object corpo = JSON.parse(resposta.body, object_class: OpenStruct # Validando resultados expect(corpo.status).to eq("success") expect(corpo.message).to eq("Aprovado") end end endend
Código completo:
Globalcode – Open4education
Automatizando testes de API
A execução dos testes de API também podem ser executado com o mesmo comando que usamos para executar os testes de unidade:
rspec C:\RubyInTestTDC\spec\api\escola_spec.rb --color
Mas, como usamos contextos, podemos usar o parâmetro --format documentation, após o parâmetro --color para que vejamos os resultados no formato de documentação:
rspec C:\RubyInTestTDC\spec\api\escola_spec.rb --color --format documentation
E então os resultados aparecerão da seguinte forma:
Gerenciar API Escola /avaliar GET alunos com notas maiores ou iguais a 7 sao aprovados
Finished in 0.0468 seconds (files took 0.5148 seconds to load) 1 example, 0 failures
Globalcode – Open4education
Automatizando testes de GUI
Para demonstrar este tipo de teste, usaremos uma aplicação web chamada “escola”, que consome a API que testamos anteriormente.
Ela está disponível no endereço:
http://localhost:4567/escola/web/
Esta aplicação permite que informemos duas notas e, após clicar no botão “Avaliar”, nos devolve o status atual do aluno.
Iremos automatizar o seguinte cenário:
1. Abrir e maximizar o browser Firefox; 2. Acessar a aplicação web; 3. Preencher o formulário; 4. Clicar no botão “Avaliar”; 5. Validar que a mensagem “Aprovado" foi apresentada.
Globalcode – Open4education
Automatizando testes de GUI
1. Abrir e maximizar o browser Firefox
navegador = Selenium::WebDriver.for :firefox navegador.manage.window.maximize()
2. Acessar a aplicação web
navegador.get('http://localhost:4567/escola/web/')
3. Preencher o formulário
navegador.find_element(:name, 'notaprova').send_keys("7") navegador[:name => 'notatrabalho'].send_keys("7")
4. Clicar no botão “Avaliar”;
navegador.find_element(:id, 'avaliar').click()
Outra forma de fazer find_element
Globalcode – Open4education
Automatizando testes de GUI
5. Validar que a mensagem “Aprovado" foi apresentada
expect(navegador.find_element(:id, 'message').text).to eq("Aprovado")
# Fechar o browser navegador.close()
Observação:
Não esqueça de adicionar o require ‘selenium-webdriver’ no topo do arquivo para que seja usado o valor transporte.
require 'selenium-webdriver'
Globalcode – Open4education
Automatizando testes de GUICódigo completo:# C:\RubyInTestTDC\spec\gui\escola_spec.rb
require 'selenium-webdriver'
describe "Gerenciar Site Escola" do context "Avaliar" do it "alunos com notas maiores ou iguais a 7 são aprovados" do navegador = Selenium::WebDriver.for :firefox navegador.manage.window.maximize()
# Acessando a página inicial do QuickLoja navegador.get('http://localhost:4567/escola/web/') # Preenchendo o formulário navegador.find_element(:name, 'notaprova').send_keys("7") navegador[:name => 'notatrabalho'].send_keys("7") navegador.find_element(:id, 'avaliar').click() # Validando que entrou expect(navegador.find_element(:id, 'message').text).to eq("Aprovado") # Fechar o browser navegador.close() end end end
Globalcode – Open4education
Relatório em HTMLUma vez que já automatizamos os testes em todas as camadas, podemos rodar os testes e obter os resultados em formato HTML. Para isso, executaremos o comando abaixo:
O resultado será semelhante ao apresentado abaixo:
rspec C:\RubyInTestTDC\spec --format html --out
C:\RubyInTestTDC\relatorio.html
Globalcode – Open4education
@juliodelimas slideshare.net/juliodelimas
github.com/juliodelimas/rubyintests medium.com/@juliodelimas
Obrigado!