Este documento apresenta como preparar o ambiente e escrever scripts de teste automatizados de unidade, API e GUI (Web) usando frameworks open-source em Ruby. O documento explica como instalar as ferramentas necessárias, como RSpec, Rest-Client e WebDriver, e fornece exemplos passo a passo de como automatizar testes de unidade, API e interface gráfica.
2. 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.
3. 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
4. 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
6. Globalcode – Open4education
Preparando o ambiente
1. 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:Ruby200dk
3. Instale o DevKit executando as linhas abaixo no prompt
ruby C:Ruby200dkdk.rb init
ruby C:Ruby200dkdk.rb install
4. Instale a Gem do Bundler
Digite gem install bundler no prompt de comando
7. Globalcode – Open4education
Preparando o projeto
1. 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
9. Globalcode – Open4education
Automatizando testes de
unidade
# C:RubyInTestTDCavaliacao_class.rb
class Avaliacao
def avaliar(notaprova, notatrabalho)
if (notaprova >= 7)
if (notatrabalho >= 7)
return "Aprovado"
else
return "Exame"
end
else
return "DP"
end
end
end
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.
10. Globalcode – Open4education
Automatizando testes de
unidade
# C:RubyInTestTDCspecunitavaliacao_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")
end
end
Teríamos que desenvolver três testes de unidade para testar o método
avaliar, eles seguem a mesma estrutura do método abaixo:
11. Globalcode – Open4education
Automatizando testes de
unidade
A execução dos testes de unidade se dá através do comando:
rspec C:RubyInTestTDCspecunitavaliacao_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"
12. 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]
13. 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-Client
require 'rest-client'
14. 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 Object
corpo = JSON.parse(resposta.body, object_class: OpenStruct)
# Validando resultados
expect(corpo.status).to eq("success")
expect(corpo.message).to eq("Aprovado")
15. 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
end
end
16. Globalcode – Open4education
Automatizando testes de API
# C:RubyInTestTDCspecapiescola_spec.rb
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
# 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
end
end
Código completo:
17. 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:RubyInTestTDCspecapiescola_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:RubyInTestTDCspecapiescola_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
18. 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.
19. 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
20. 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'
21. Globalcode – Open4education
Automatizando testes de GUI
Código completo:
# C:RubyInTestTDCspecguiescola_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
22. Globalcode – Open4education
Relatório em HTML
Uma 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:RubyInTestTDCspec --format html --out
C:RubyInTestTDCrelatorio.html