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
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
Edite o arquivo do projeto da API dando visibilidade da sua api ao testes:
`<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>`
Exponha seu Program.cs adicionando a linha ao final do arquivo:
public partial class Program { }
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;
}
}
}
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");
});
}
*Crie um teste *
[Fact]

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);
}
Hora de rodar os testes
Lembrando que esses testes estão conectados no banco de desenvolvimento, portanto um registro foi criado na tabela:
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)