Testando API com HTTParty e Rspec

emotion da biblioteca HTTParty

O que é HTTParty?

HTTParty nada mais é do que uma gem(Biblioteca) do ruby que simplifica a manipulação de requisições e respostas REST, utilizada para realizar requisições HTTP através dos verbos(Post, Get, Put e Delete) de forma simples em web services, com sua sintaxe intuitiva e direta, é especialmente popular entre os novatos ruby e nos projetos paralelos.

O que é Rspec?

Rspec é outra biblioteca(gem) de desenvolvimento e testes para ruby e que utiliza o conceito de BDD(behavior-driven development) na criação dos testes das aplicações.

Pré Requisitos

Conhecimento: Nenhum 🙌

  • Ruby instalado ✅

Como instalar as gems

As bibliotecas(gems) podem ser instaladas de duas maneiras, instalando globalmente executando os comandos: ‘gem install httparty’ e ‘gem install rspec’ direto no terminal, ou adicionado as bibliotecas e suas versões dentro do arquivo Gemfile dentro do projeto, podendo assim utilizar diferentes versões em diferentes projetos. Neste artigo vamos abordar como configurar utilizando a segunda maneira, por ser considerada uma boa prática.

Iniciando um novo projeto

👉 Para instalarmos todas as bibliotecas utilizando o arquivo Gemfile, precisamos primeiro instalar o Bundler, que nada mais é que um gerenciador de bibliotecas Ruby. 😎

Para instalar o Bundler, basta executar o seguinte comando:

gem install bundler
  1. Criar uma pasta com o nome desejado do projeto, e acessar dentro da mesma atavés do terminal e executar o seguinte comando:
bundle init

O seguinte retorno deve ser exibido:

‘Writing new Gemfile to /estudos/Gemfile’

Informando que o arquivo Gemfile foi criado 👏.

2. Dentro do arquivo Gemfile, deixar da seguinte forma:

source '<https://rubygems.org>'

gem 'rspec'
gem 'httparty'

💡 Explicando: Na primeira linha estamos informando da onde que o projeto vai “buscar” as bibliotecas para serem instaladas, e na terceira e quarta linha estamos inserindo quais gem queremos instalar, nesse caso ‘rspec’ e ‘httparty’.

3. Com o arquivo Gemfile configurado, executaremos o seguinte comando no terminal da pasta raiz do projeto para instalar todas as bibliotecas configuradas:

bundle install

4. Com todas as bibliotecas instaladas, executar o seguinte comando para criar os arquivos .rspec e a pasta spec com o arquivo spec_helper.rb.

rspec –init

💡 Pode remover todos os comentários da arquivo spec_helper e adicionar os imports do HTTParty. Arquivo deve ficar parecido com a imagem abaixo:

require 'httparty'
require 'httparty/request'
require 'httparty/response/headers'

RSpec.configure do |config|
config.expect_with :rspec do |expectations|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
config.mock_with :rspec do |mocks|
mocks.verify_partial_doubles = true
end
config.shared_context_metadata_behavior = :apply_to_host_groups
end

Conhecendo a API que vamos validar

O site REQ | RES disponibiliza endpoints de API’s gratuitamente, onde podemos nos basear para construir nossos scripts de testes.

Voltando ao código, dentro da pasta raiz do projeto, criar a pasta ‘services’, nela, vamos criar a configuração do serviço que quermos testes para cada parte do crud(CREATE, READ, UPDATE, DELETES), então cria-se um arquivo informando essas características do endpoint ao HTTParty. Como vamos validar a api de usuários, dentro da pasta ‘services’, criar um arquivo chamado ‘user_service.rb’ com o seguinte código:

module User
include HTTParty
base_uri '<https://reqres.in>'
format :json
end

💡 Explicando: Criamos o módulo User, entidade que vamos testar, importamos a gem HTTParty, definimos uma uri base(que no caso é a URL) e informamos que vamos trocar informações através de json.

Com o novo módulo criado, precisamos importar dentro da seção de configuração do RSpec:

require 'httparty'
require 'httparty/request'
require 'httparty/response/headers'

require_relative '../services/user_service.rb'

RSpec.configure do |config|
include User
config.expect_with :rspec do |expectations|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
config.mock_with :rspec do |mocks|
mocks.verify_partial_doubles = true
end
config.shared_context_metadata_behavior = :apply_to_host_groups
end

Listando usuários

  1. Na pasta /spec, criar arquivo chamado get_spec.rb e inserir o seguinte o código:
describe 'agrupando os metodos de verbo GET' do

it 'meu primeiro teste - listando todos usuários' do
@users = User.get('/api/users?page=2')
puts @users
end
end

💡 Explicando: describe nada mais é do que a descricão daquilo que será testado do módulo em sí, o it seria os passos de fato, o que vamos testar, ou seja, no primeiro it vamos listar os usuários, para isso, salvamos as informação da requisicao get do httparty na variavel @user e em seguida imrpimos no terminal através do comando log.

Feito tudo isso, basta executar o comando abaixo através do terminal na raiz do projeto para ver o resultado:

rspec

Deve retornar as seguintes informações:

{"page":2,"per_page":6,"total":12,"total_pages":2,"data":[{"id":7,"email":"michael.lawson@reqres.in","first_name":"Michael","last_name":"Lawson","avatar":"<https://reqres.in/img/faces/7-image.jpg"},{"id":8,"email":"lindsay.ferguson@reqres.in","first_name":"Lindsay","last_name":"Ferguson","avatar":"https://reqres.in/img/faces/8-image.jpg"},{"id":9,"email":"tobias.funke@reqres.in","first_name":"Tobias","last_name":"Funke","avatar":"https://reqres.in/img/faces/9-image.jpg"},{"id":10,"email":"byron.fields@reqres.in","first_name":"Byron","last_name":"Fields","avatar":"https://reqres.in/img/faces/10-image.jpg"},{"id":11,"email":"george.edwards@reqres.in","first_name":"George","last_name":"Edwards","avatar":"https://reqres.in/img/faces/11-image.jpg"},{"id":12,"email":"rachel.howell@reqres.in","first_name":"Rachel","last_name":"Howell","avatar":"https://reqres.in/img/faces/12-image.jpg"}],"support":{"url":"https://reqres.in/#support-heading","text":"To> keep ReqRes free, contributions towards server costs are appreciated!"}}describe 'agrupando os metodos de verbo GET' do

it 'meu primeiro teste - listando todos usuários' do
@users = User.get('/api/users?page=2')
puts @users
end
end

Criando primeiro validação

Remova o puts e adicione uma verificação, validando se o status code retornado é igual a 200 (como combinado previamente) e execute o comando rspec spec/get_spec.rb:

describe 'agrupando os metodos de verbo GET' do

it 'meu primeiro teste - listando todos usuários' do
@users = User.get('/api/users?page=2')
expect(@users.code).to eq(200)
end

end

💡 Explicando: O expect é uma asserção específica do rspec que espera(expect) que no retorno do código(code) da variável de usuário(@user) seja(.to) igual(eq) a 200.

Relembrando as requisições que o HTTParty aceita

  • GET para obter apenas uma informação
  • POST para criação/inserção de uma nova informação
  • PUT para atualização de alguma informação
  • DELETE para remoção de alguma informação

Criando um novo usuário

Documentação api user

Para criar um novo usuário, precisamos inserir os campos nome e job conforme mostra imagem acima, através de um dicionário, que é uma estrutura de dados bastante utilizada em requisições.

  1. Primeiramente vamos criar um arquivo chamado post_spec.rb dentro da pasta spec, pois agora vamos validar a requisição post.
  2. Dentro do arquivo criado, insira o seguinte código:
describe 'agrupando os metodos de verbo POST' do

it 'meu terceiro teste - adicionando usuário' do
@novo_usuario = {
name: "Pedro",
job: "QA"
}

@request = User.post('/api/users', :body => @novo_usuario)
expect(@request.code).to eq(201)
expect(@request["id"]).not_to be nil
expect(@request["name"]).to eq(@novo_usuario[:name])
expect(@request["job"]).to eq(@novo_usuario[:job])

end

end

💡 Explicando: Primeiramente criamos um novo usuário e passamos os valores para os campos obrigatórios(nome e job), montamos a request passando o módulo de usuários que criamos no ínicio desse artigo, o verbo post, com o caminho da requisição'/api/users' e o usuário criado @novo_usuário como corpo da requisição. Depois validamos que o retorno da requisição é igual a 200, que foi gerado um id e o mesmo não é nulo, e que o nome e o job retornado são os mesmo que os que foram passados e criados.

Conclusão

Lembre-se da piramide de testes, os testes de validação de requisição de api são muito importantes, pois ajuda a entregar um produto de qualidade, certificando-se de que qualquer alteração no contrato da api, seja ela pequena ou grande, os testes iram falhar, seja por falta de comunicação entre as equipes, por mudança de regra de negócio ou por ser um erro mesmo.

Extra

Existem vários status code que podem ser retornados em uma requisicão, segue um link bem legal com todos os status code ilustrados com foto de gatos 😹

HTTP CatsAn API for the awesome HTTP Cats! Use it in your website to show funny error messag

Outras bibliotecas HTTP

Cheers! 🍻

Caso tenha alguma dúvida, sugestão de melhoria ou algum problema, deixe seu comentário. 👌

Caso tenha gostado ou tudo tenha ocorrido direitinho, me siga no Medium e deixa seu like. 😘

Referências:

The Best Ruby HTTP clients for 2021

Testando APIs com HTTParty e Rspec | Zup

--

--

--

Engenheiro de teste, cervejeiro, churrasqueiro e pai. Sabe aplicação funcionando, cerveja gelada, churrasco bem-feito e família reunida?Não gosto, eu amo!

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Pedro Henrique Joioso Martins

Pedro Henrique Joioso Martins

Engenheiro de teste, cervejeiro, churrasqueiro e pai. Sabe aplicação funcionando, cerveja gelada, churrasco bem-feito e família reunida?Não gosto, eu amo!

More from Medium

Http spike test with JMeter

All About APIs

Inheritance concept in java

Which is the best, Selenium or Cypress?