DEV Community

Guilherme
Guilherme

Posted on

Criando testes de integração no ASP.NET core | Parte 1

Uma rápida passada em testes unitários

De modo geral, os testes unitários testam, isoladamente, a menor unidade de um código, ou seja: os métodos e classes sem acesso a banco ou serviços externos.

Os testes unitários são de rápida execução, desenvolvimento, refatoração e detecção de bugs no código.

É bom lembrar que os testes unitários são totalmente mockados, isto é, as implementações das classes mockam acessos a repositórios, serviços etc.

Os testes de integração

A famosa pirâmide de testes

Os testes de integração desempenham o papel de avaliar a interação entre diferentes componentes do sistema, a fim de verificar seu funcionamento em conjunto.

É por meio desses testes que asseguramos a consistência das interações entre diversas partes do sistema, validamos fluxos complexos e completos, garantindo assim a qualidade do código como um todo, não se limitando a uma única parte isolada.

Sim, eles são mais complexos de desenvolver e manter, além de serem mais lentos ao serem executados em comparação aos testes de unidade. Isso ocorre porque testam funcionalidades completas, inclusive a persistência dos dados quando aplicável, ou o acesso a serviços externos.

Vamos ao código

Image description

Edite o arquivo do projeto da API dando visibilidade da sua api ao testes:

Editando o project file

`<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <InvariantGlobalization>true</InvariantGlobalization>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Dapper" Version="2.1.28" />
    <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.0" />
    <PackageReference Include="Npgsql" Version="8.0.1" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
  </ItemGroup>

    <ItemGroup>
        <InternalsVisibleTo Include="CheckoutApiTests"/>
    </ItemGroup>
</Project>`

Enter fullscreen mode Exit fullscreen mode

Exponha seu Program.cs adicionando a linha ao final do arquivo:

public partial class Program { }
Enter fullscreen mode Exit fullscreen mode

Crie a classe de testes integrados

namespace CheckoutApiTests
{
    public class CheckoutServiceIntegrationTests : IClassFixture<WebApplicationFactory<Program>>
    {
        private readonly WebApplicationFactory<Program> _sut;
        public CheckoutServiceIntegrationTests(WebApplicationFactory<Program> sut)
        {
            _sut = sut;
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Sut é um acrônimo para System Under Test

*Opcional: adicione um enviroment variable *

 public CheckoutServiceIntegrationTests(WebApplicationFactory<Program> sut)
 {
     _sut = sut.WithWebHostBuilder(builder =>
     {
         builder.UseEnvironment("Development");
     });
 }
Enter fullscreen mode Exit fullscreen mode

*Crie um teste *

[Fact]
![Criando um teste de integração](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0u3j6ewycp0ec9mjlwz9.gif)


public async Task PostCheckout_ReturnsOkWithInsertedId_WhenValidData()
{
    var client = _sut.CreateClient();

    var checkoutData = new
    {
        CardNumber = "10000011100011",
        UserId = Guid.NewGuid(),
        ExpirationDate = "12/25",
        SecurityCode = "123",
        Amount = 19,
        Currency = "BRL"
    };

    var content = new StringContent(JsonSerializer.Serialize(checkoutData), System.Text.Encoding.UTF8, "application/json");

    var response = await client.PostAsync("/checkout", content);

    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

    var responseContent = await response.Content.ReadAsStringAsync();
    var insertedId = JsonSerializer.Deserialize<Guid>(responseContent);

    Assert.NotEqual(Guid.Empty, insertedId);
}
Enter fullscreen mode Exit fullscreen mode

Hora de rodar os testes

Teste com sucesso! =

Lembrando que esses testes estão conectados no banco de desenvolvimento, portanto um registro foi criado na tabela:

Select da tabela de checkout com o registro inserido via teste de integração

E agora você sabe como criar testes de integração, hora de botar a mão na massa e criar mais testes.

No próximo artigo vamos utilizar o Testcontainers para criar um banco em tempo de execução dos testes integrados!

Até mais!

Top comments (0)