23
Globalcode – Open4education Ruby in Tests Júlio de Lima Especialista em Testes na RSI @juliodelimas

[TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

Embed Size (px)

Citation preview

Page 1: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

Globalcode – Open4education

Ruby in TestsJúlio de Lima

Especialista em Testes na RSI @juliodelimas

Page 2: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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.

Page 3: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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

Page 4: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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

Page 5: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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

Page 6: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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

Page 7: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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

Page 8: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

Globalcode – Open4education

Você pode assistir esse passo a passo no YouTube através do link abaixo:

bit.ly/RubyInTestInstalacao

Page 9: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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.

Page 10: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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:

Page 11: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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"

Page 12: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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]

Page 13: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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'

Page 14: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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")

Page 15: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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

Page 16: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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:

Page 17: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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

Page 18: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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.

Page 19: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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

Page 20: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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'

Page 21: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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

Page 22: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

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

Page 23: [TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)

Globalcode – Open4education

@juliodelimas slideshare.net/juliodelimas

github.com/juliodelimas/rubyintests medium.com/@juliodelimas

[email protected]

Obrigado!