Blog > Automação de Testes em WebServices com SoapUI (Parte 4): Extraindo dados de respostas à requisições REST

06/abr

Neste post falaremos sobre a extração de dados contidos em respostas à requisições feitas a serviços REST, algo muito utilizado, mas pouco documentado. O foco deste post é a versão Open-Source do SoapUI.

Introdução

Através do SoapUI podemos fazer requisições a resources pertencentes a APIs REST e avaliar os dados contidos em respostas. Uma das funcionalidades muito utilizada em testes de serviços REST é extrair os dados de uma resposta com o intuito de utilizá-la posteriormente. A versão Pro do SoapUI oferece uma grande facilidade ao executar esta ação, já na versão Open-Source, demanda de uma pouco mais de trabalho.

Neste post, faremos um tutorial passo a passo apresentando como executar esta atividade usando Groovy e um parser chamado JsonSlurper.

Conhecendo o serviço

A API que iremos testar está disponível na minha conta do GitHub:

github.com/juliodelimas/qualister-restapi-php

Basicamente, possui dois métodos, são eles GET /login e POST /produto. Vejamos eles em detalhe:

GET /login

Parâmetros

@usuariologin (string)
@usuariosenha (string)

Retorno

{
   "status": "sucesso",
   "mensagem": "sucesso ao fazer login",
   "dados":    {
      "usuariodatacadastro": "2015-04-06",
      "usuarioid": "1",
      "usuariologin": "aluno",
      "token": "30154dbe350991cf316ec52b8743137b"
   }
}

Observações

Veja que ao fazer login um token é gerado, este token é dinâmico, ou seja, a cada vez que fazermos login um novo token, diferente do anterior será gerado. Ele tem validade de 20 segundos, depois disso não poderá mais ser utilizado.

POST /produto

Parâmetros

@produtonome (string)
@produtovalor (decimal)
@produtoestoque (integer)
@token (string)

Retorno

{
   "status": "sucesso",
   "mensagem": "sucesso ao adicionar o produto",
   "dados":    {
      "produtoid": "10",
      "produtonome": "Teste",
      "produtovalor": "12.21",
      "produtoestoque": "30",
      "usuariologin": "aluno"
   }
}

Observações

Veja que para conseguir cadastrar um novo produto é necessário passar um token válido por parâmetro, no caso, se eu quero cadastrar um produto, preciso fazer login e utilizar o token que lá é gerado.

Criando um novo projeto a partir do arquivo WADL

O arquivo WADL, é equivalente ao WSDL em serviços Soap, é a documentação dos resources contidos no serviço REST.

Iremos criar um novo projeto no SoapUI a partir do arquivo “index.wadl” contido no projeto que você baixou no GitHub. Para isso:

1) Clique com o botão direito em “Projects” e selecione “New REST Project”

2) Clique em “Import WADL”

3) Selecione o arquivo “index.wadl”

4) E então veremos que os resources foram importados

Criando a suite e o caso de teste

Uma vez que já temos o mapeamento dos resources do nosso serviço, criaremos a suite e o casos de teste que irão exercitá-los, para isso:

1) Clique com o botão direito sobre o serviço “http://localhost:8888” e selecione “Generate TestSuites”

2) Selecione a opção “Single TestCase”, marque os dois resources “Login” e “Adicionar produto” e clique em “Ok”

3) Dê o nome “Suíte de Testes da Qualister” para a TestSuite e pressione “Ok”

4) Altere o nome do TestCase para “Teste de Adição de Produto”

Configurando os parâmetros que serão utilizados nas TestSteps

Agora iremos adicionar os dados às steps, para tal:

1) Abra a TestStep “Login” e informe o usuario login “aluno” e a senha “123”

2) Como a API possui autenticação básica necessitaremos adicionar uma autenticação à requisição, para isso clique na aba “Auth” e selecione “Add new authorization”

3) Escolha a autenticação “Basic”

4) Agora clique na seta verde no canto superior esquerdo, que o botão “Submit requesta” para enviar a requisição e então veremos a resposta à direita, em formato JSON, XML, HTML ou Raw

5) Copie o número do token que foi gerado, no nosso caso “2169af6b51c2b9f102645ed0a8db047b”

6) Abra a TestStep “Adicionar produto” e então informe os valores do produto que queremos adicionar: produtonome “iPhone 6“, produtovalor “9558.00”, produtoestoque “30” e token “2169af6b51c2b9f102645ed0a8db047b"

7) Como esta é uma requisição que utiliza o verbo POST, teremos de marcar a opção “Post query string”

8) Agora adicione novamente a autenticação Basic

9) Envie a requisição e então receberemos uma resposta de sucesso na inserção do produto

10) Adicione uma asserção

11) Ela será do tipo "Contains"

12) Verificaremos se o texto "status":"sucesso" foi apresentado na resposta

13) Agora já temos nosso caso de teste parametrizado

Executando o caso de teste

Para executar todos os passos do caso de teste basta clicar duas vezes sobre ele e então clicar no botão verde do canto superior esquerdo, chamado “Run this TestCase”, e então veremos que o teste falhou:

Veja que o teste falhou por que a mensagem “status”:”sucesso” não foi exibida:

 -> [Contains] Missing token ["status":"sucesso"] in Response

Isso aconteceu porque não estamos enviando o token correto, lembrem-se que é um token dinâmico, e em nossa TestStep “Adicionar produto” estamos enviando sempre o mesmo token:

Sendo que a TestStep “Login” retornou outro token, diferente do anterior:

Extraindo o token da resposta à requisição

Para executar a extração teremos de usar um TestStep do tipo “Groovy Script” em conjunto com uma Property, que é basicamente uma variável global, para isso:

1) Clique duas vezes sobre o TestCase “Teste de Adição de Produto”, clique na aba “Properties” e adicione uma nova property clicando no botão “Adds a property. Chamaremos ela de “token”

2) Agora clique com o botão direito sobre a TestStep “Login” e então clique em “Insert Step” > “Groovy Script”

3) Dê o nome “Extrair token”

4) Vamos importar o JsonSluper, classe que servirá para fazer o parse do formato Json:

import groovy.json.JsonSlurper

5) Utilizaremos a linha abaixo para receber a resposta à requisição “Login” no formato JSON:

def tokenAtual = context.expand(‘${Login#Response}’)

6) Agora iremos instanciar o objeto JsonSlurper e através dele faremos o parse na variável resposta:

def slurper = new JsonSlurper()
def resposta = slurper.parseText(tokenAtual)

7) Agora atribuiremos o token, que está dentro do grupo “dados” à property que criamos anteriormente em nosso TestCase:

testRunner.testCase.setPropertyValue(“token”, resposta.dados.token)

8) Então teremos o seguinte código:

import groovy.json.JsonSlurper
def tokenAtual = context.expand('${Login#Response}')
def slurper = new JsonSlurper()
def json = slurper.parseText(tokenAtual)
testRunner.testCase.setPropertyValue("token", json.dados.token)

9) Agora é só alterar o token fixo (hard-codec) pela propriedade “token” do TestCase. Para isso, clique duas vezes sobre a TestStep “Adicionar produto”, e então adicione o código abaixo no lugar do token:

${#TestCase#token}

Onde “TestCase” é o nível onde foi declarada a property, poderia ser "TestSuite" ou “Project”. Veja como ficou:

10) Execute novamente o TestCase “Teste de Adição de Produto” e então teremos sucesso, uma vez que enviamos agora a requisição “Adicionar produto” com o token que acaba de ser extraído da step anterior, “Login”:

Conclusão

Vemos neste post uma forma de recuperar os dados contidos em uma resposta à uma requisição a um serviço REST, usamos Groovy e JsonSlurper no ambiente de automação de testes da ferramenta SoapUI.

Vale lembrar que quando utilizamos a versão Pro do SoapUI a atividade de extrair valores contidos em respostas é imensamente mais simples, caso tenha curiosidade em conhecer esta versão, acesse o link abaixo e teste por 14 dias:

Download SoapUI Pro

Você pode baixar o projeto do SoapUI que foi construído neste post diretamente no meu GitHub na URL abaixo:

github.com/juliodelimas/qualister-restapi-php/blob/master/qualister-restapi-php.xml

POSTS RELACIONADOS

AGENDA

CURSOS RELACIONADOS