.NET

12 set, 2023

Automatizando testes de integração: um exemplo com Azure DevOps, SQL Server, Postman e .NET 7

Publicidade

Na imagem abaixo temos um exemplo de execução de um pipeline do Azure DevOps automatizando testes (com Postman + Newman) de uma API REST criada com .NET 7 + ASPNET Core e que faz uso do SQL Server (em um container Docker) + Migrations do Entity Framework Core. Incluí aqui também a geração de um relatório HTML com os resultados dos testes.

Demonstrei esta solução (além de outros 2 exemplos com PostgreSQL e MySQL) em uma live recente do Canal .NET. A gravação pode ser assistida no YouTube:

A versão que faz uso do PostgreSQL foi também tema de outro artigo publicado neste blog (muitos detalhes do pipeline para SQL Server são idênticos):

Automatizando Testes de Integração: um exemplo com Azure DevOps, PostgreSQL, Postman e .NET 7

Vale ressaltar ainda que utilizei um virtual environment baseado em Linux(Ubuntu 22.04), o qual conta com dezenas de ferramentas pré-instaladas (sqlcmd — linha de comando do SQL Server, Newman/Postman e o runtime Docker).

Na listagem a seguir está o código com a implementação deste pipeline:

igger:
main
resources:
containers:
container: sqlserver
image: mcr.microsoft.com/mssql/server:2022-latest
networks:
testes
env:
SA_PASSWORD: SqlServer2022!
ACCEPT_EULA: Y
MSSQL_PID: Developer
ports:
1433:1433
variables:
# Agent VM image name
vmImageName: ubuntu-latest
# Variáveis para execução dos testes de integração
File_Log_Execution_WebApp: log-execution-restapi.log
Path_Project: ./APISuporte
Dll_Project: APISuporte.dll
Path_Tests: ./Tests
Collection_Postman: ChamadosSuporte.postman_collection.json
Iterations: 10
BaseSuporteConnectionString: Server=127.0.0.1,1433;Database=BaseSuporte;User Id=sa;Password=SqlServer2022!;TrustServerCertificate=True;
appsettings_Path: ./APISuporte/appsettings.json
stages:
stage: Tests
displayName: Tests stage
jobs:
job: Tests
displayName: Tests
pool:
vmImage: $(vmImageName)
services:
sqlserver: sqlserver
steps:
script: |
docker images
docker container ls
displayName: Exibir imagens e container em execução
script: |
cd /opt/mssql-tools/bin/
ls
sleep 10s
sqlcmd -S “127.0.0.1,1433” -U sa -P SqlServer2022! -d master -Q “CREATE DATABASE BaseSuporte”
displayName: Criar banco basesuporte
task: replacetokens@5
inputs:
targetFiles: $(appsettings_Path)
encoding: auto
tokenPattern: default
writeBOM: true
actionOnMissing: warn
keepToken: false
actionOnNoFiles: continue
enableTransforms: false
enableRecursion: false
useLegacyPattern: false
defaultValue: $(BaseSuporteConnectionString)
enableTelemetry: true
displayName: Configurar a string de conexão do SQL Server no appsettings.json
script: cat $(appsettings_Path)
displayName: Exibir conteúdo do appsettings.json
script: |
echo ‘*** SDKs do .NET intalados ***’
dotnet –list-sdks
displayName: Exibir versoes instaladas do .NET SDK
task: UseDotNet@2
inputs:
packageType: sdk
version: 7.0.400
displayName: Instalar SDK do .NET 7.0.400
script: |
echo ‘*** Versão assumida como default para o .NET ***’
dotnet –version
echo ‘*** Instalar EF Core Tools ***’
dotnet tool install –global dotnet-ef
dotnet ef
displayName: Instalar EF Core Tools
script: |
cd $(Path_Project)
dotnet ef migrations add IntegrationTests
dotnet ef database update
displayName: Executar Migrations criando a tabela de Chamados
script: |
dotnet publish $(Path_Project) -c Release -o app
cd ./app
nohup dotnet $(Dll_Project) > $(File_Log_Execution_WebApp) 2>&1 &
echo ‘Aguardando a inicialização da aplicação a ser testada…’
sleep 10s
displayName: Executar a aplicação a ser testada em background (nohup)
env:
ASPNETCORE_URLS: ‘http://localhost:5000’
script: |
echo “** Versão Global do Newman **”
newman -v
npm install newman-reporter-htmlextra@1.22.11
npm install newman-reporter-junitfullreport@1.0.4
displayName: Instalar packages newman-reporter-htmlextra e newman-reporter-junitfullreport
condition: always()
script: |
cd $(Path_Tests)
npx newman run $(Collection_Postman) -n $(Iterations) -r cli,htmlextra,junitfullreport
displayName: Executar e gerar resultados em HTML e XML dos testes da API REST com Newman
condition: always()
script: |
cd $(Path_Tests)/newman
ls
displayName: Listar arquivos gerados após testes da API REST com Newman
condition: always()
script: |
cd /opt/mssql-tools/bin/
sqlcmd -S “127.0.0.1,1433” -U sa -P SqlServer2022! -d master -Q “USE BaseSuporte; SELECT * FROM dbo.Chamados;”
condition: always()
displayName: Exibir registros criados na base de dados
task: PublishTestResults@2
inputs:
testResultsFormat: JUnit
testResultsFiles: **/newman/*.xml
searchFolder: $(Build.SourcesDirectory)
displayName: Publicar sumário dos testes com base no XML gerado
condition: always()
task: UploadPostmanHtmlReport@1
displayName: Publicar relatório em HTML com resultados dos testes da API REST com Newman
inputs:
cwd: $(System.DefaultWorkingDirectory)/$(Path_Tests)
condition: always()
script: |
cd ./app
cat $(File_Log_Execution_WebApp)
displayName: Exibir log de execução da aplicação testada
condition: Always()

Merecem destaque os seguintes pontos:

  • Nas linhas 4 a 15 estão as configurações para uso do container do SQL Server (ativado para o stage Tests nas linhas 39 e 40);
  • No step que inclui as linhas 116 a 120 o sqlcmd foi utilizado, de forma a exibir os registros gerados durante a execução dos testes da API REST (via Collection do Postman).

Este pipeline foi disponibilizado no meu GitHub:

https://github.com/renatogroffe/AzureDevOps-SqlServer-EFCoreMigrations-Postman-Newman-DotNet7-ASPNETCore_IntegrationTests

Já o repositório com a aplicação + testes gerados via Postman pode ser acessado por meio do link:

https://github.com/renatogroffe/ASPNETCore7-REST_API-SqlServer-EFCore-Migrations-Postman_ChamadosSuporte

*O conteúdo deste artigo é de responsabilidade do(a) autor(a) e não reflete necessariamente a opinião do iMasters.