Automatizando testes de APIs REST com Postman + Newman
Em um artigo anterior abordei a implementação de testes automatizados de APIs REST, fazendo uso para isto do .NET 5 e de frameworks como xUnit, Refit e Fluent Assertions:
Testes de APIs REST com .NET 5, xUnit, Refit e Fluent Assertions
Embora totalmente funcional, a abordagem que adotei neste post permaneceu presa à plataforma .NET e a todo ferramental concebido para a mesma. E se pudéssemos então ir além disso?
O Postman é hoje uma das principais ferramentas gráficas quando lembramos de testar nossas APIs. Multiplataforma, gratuito e com uma interface fácil de utilizar, conta ainda com recursos sofisticados como Collections para a criação de roteiros para testes automatizados.
Dentro de uma Collection podemos definir uma sequência com diferentes requisições HTTP, manipular tokens de acesso, declarar variáveis e nos valer até mesmo de arquivos de dados contendo conjuntos de valores representando diferentes casos de validações. A codificação dos testes será feita em JavaScript, com o próprio Postman oferecendo um conjunto de funcionalidades equiparáveis a frameworks de testes como xUnit em .NET e JUnit em Java (porém com muito mais simplicidade!).
Diante de todas essas possibilidades chegamos a um novo questionamento… E se fosse possível executar testes criados com o Postman na linha de comando, abrindo assim caminho para a utilização dos mesmos em processos de CI/CD dentro de soluções como Azure DevOps e GitHub Actions?
A resposta a essa nova pergunta está na ferramenta conhecida como Newman, uma alternativa oferecida pelo próprio Postman para a execução de Collections a partir da linha de comando. Virtual environments do Azure DevOps e do GitHub Actions já contam com o Newman pré-instalado, o que em muito facilita a implementação/execução de pipelines/workflows de automação.
Neste novo post trago um exemplo de implementação e execução automatizados de testes de APIs REST com Postman + Newman, partindo de uma API REST criada com .NET 5 + ASP.NET Core e de um workflow do GitHub Actions para build/deployment com containers + Azure App Service.
E aproveito este espaço para um convite…
No dia 28/04/2021 (quarta) às 21:00 — horário de Brasília — teremos mais um evento online e gratuito no Canal .NET.
Nesta live será demonstrado como podemos construir testes de integração sem grandes adversidades, automatizando ainda a execução destes em processos de CI/CD com Azure DevOps e GitHub Actions. Ao longo da apresentação está previsto o uso de tecnologias como .NET, xUnit, Visual Studio 2019, Apache Kafka, MongoDB, Kubernetes e serviços do Microsoft Azure.
Para participar faça sua inscrição no link a seguir, a transmissão acontecerá via YouTube:
Vídeo e exemplo utilizado
Em uma live recente do Canal .NET abordei o uso do Postman e do Newman no teste de APIs, com a gravação já disponível para ser assistida gratuitamente no YouTube:
Recomendo fortemente a você que está lendo esse artigo para que veja o conteúdo da live, já que expliquei em detalhes o uso dos diferentes recursos aqui indicados.
O projeto que serviu de exemplo foi disponibilizado como um repositório no GitHub:
.NET 5 + ASP.NET Core + Dockerfile + Testes em Postman + API REST para conversão de temperaturas
Constam neste repositório os diretórios:
- APITemperatura, com a API REST criada em .NET 5 + ASP.NET Core de conversão de temperaturas de Fahrenheint para os valores equivalentes nas escalas Celsius e Kelvin;
- Tests, com os arquivos ConversaoTemperaturas.postman_collection.json (contendo o script corresponde à Collection criada com o Postman) e testes.json (valores possíveis para cada caso de teste a ser executado através do Newman).
Alguns detalhes sobre a montagem da Collection no Postman
Na imagem a seguir podemos observar a Collection ConversaoTemperaturas já criada no Postman:
Em Variables estão as variáveis que servirão de base para a execução da Collection.
As diferentes validações foram definidas em Tests, por meio do código indicado na seguinte listagem:
O objeto indicado por pm conta com o método test, em que são especificadas as validações. A manipulação de dados devolvidos por uma API é possível através da propriedade response em pm.
Para associar os dados de um arquivo às variáveis da Collection incluí o código da próxima listagem em Pre-request Script:
Cada caso de teste do arquivo testes.json será associado à propriedade iterationData do objeto pm. Assim, faz-se necessária a atribuição destes valores às variáveis associadas a pm.collectionVariables.
Esta Collection parte do pressuposto de que a API REST será executada a partir da porta 5000:
Todo o código detalhado nesta seção foi disponibilizado no seguinte repositório do GitHub:
Postman + Newman + Testes de API de conversão de temperaturas
Execução dos testes com Newman
A instalação do Newman será feita via npm com a instrução:
npm install -g newman
Para executar as validações no diretório Tests utilizar a linha de comando:
newman run ConversaoTemperaturas.postman_collection.json -d testes.json
O Newman exibirá detalhes da execução dos testes, com o sumário a seguir indicando falhas na execução dos mesmos:
Uma segunda execução após correções na API mostrará agora que os testes tiveram sucesso:
Testes, build e deployment automatizados com GitHub Actions
Na próxima listagem temos um workflow do GitHub Actions para testes, build e deployment automatizados num ambiente Linux utilizando containers em conjunto com o Azure Container Registry e o Azure App Service. Vale destacar neste código os seguintes pontos:
- Um container da aplicação foi criado na linha 30, com o acesso ao mesmo acontecendo a partir da porta 5000;
- O Newman será executado na linha 36. Teremos a interrupção do workflow neste ponto caso ocorram falhas durante os testes da API REST.
Na próxima imagem podemos observar um exemplo de execução com falhas deste workflow, com o sumário de resultados do Newman em destaque:
Para a configuração do Secret AZURE_CREDENTIALS executei a seguinte instrução baseada no Azure CLI:
az ad sp create-for-rbac --name "GroffeGitHubActionsApiTemperatura" --role contributor --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.Web/sites/<WEB APP> --sdk-auth
O código configurando este workflow foi também disponibilizado em um repositório do GitHub:
Para conhecer mais sobre o GitHub Actions acesse o link:
MasterClass GitHub Actions: saiba como foi, participe gratuitamente e receba um certificado
Gerando relatórios HTML com o resultado dos testes
Podemos instalar também via npm o complemento newman-reporter-htmlextra, que permitirá a geração de um relatório HTML com os resultados da execução do Newman:
npm install -g newman-reporter-htmlextra
Executando a instrução a seguir em uma versão do código que ainda não tenha sido corrigida:
newman run ConversaoTemperaturas.postman_collection.json -d testes.json -r htmlextra
Teremos como resultado o seguinte relatório (com a possibilidade de navegação entre seus diferentes itens):
E termino este post com um convite…
Que tal participar da Formação Azure DevOps promovida pelo Azure na Prática e aprender em profundidade como melhorar o seu ciclo de desenvolvimento na sua empresa? Trabalhe com seu time de forma colaborativa e ainda utilizando as melhores técnicas e práticas, a fim de garantir a qualidade do software que está sendo desenvolvido!
Acompanhe com comodidade e a qualquer tempo os diversos módulos deste treinamento, em que serão cobertas boas práticas + estratégias de build/deployment e o uso desta solução de automação com tecnologias como a própria combinação Postman + Newman, .NET, Angular, Node.js, Azure Functions, Selenium WebDriver, Docker, Kubernetes, Azure App Service e outros serviços da nuvem Microsoft!
Acesse então o link a seguir para efetuar sua inscrição com um desconto especial de 10% (inclui certificado e grupo para resolução de dúvidas durante e após o curso):