💻 Exemplos: Capítulo 16: Testes Automatizados no .NET com xUnit e FluentAssertions

Especialização em Sistemas com C# • Demonstrações Práticas Compiláveis


🎯 Objetivo dos Exemplos

Apresentar a engenharia de qualidade de software em .NET com o framework moderno xUnit: estrutura de testes unitários com atributos [Fact] para testes invariantes, testes parametrizados com [Theory] e [InlineData], validação de exceções e teste de limites em estruturas de dados corporativas.


1. Código Fonte Completo (CalculadoraMetricasTests.cs)

/**
 * @file CalculadoraMetricasTests.cs
 * @brief Suíte de testes unitários com xUnit, Theory e validação de exceções no .NET 8.
 */

using System;
using Xunit;

// 1. Classe Sob Teste: Processador de Telemetria Industrial
public class ProcessadorTelemetria
{
    public double ConverterCelsiusParaFahrenheit(double celsius)
    {
        if (celsius < -273.15)
        {
            throw new ArgumentOutOfRangeException(nameof(celsius), "Temperatura abaixo do zero absoluto.");
        }
        return (celsius * 9.0 / 5.0) + 32.0;
    }

    public bool ValidarPressaoOperacional(double pressaoBar) => pressaoBar >= 1.0 && pressaoBar <= 150.0;
}

// 2. Suíte de Testes com xUnit
public class ProcessadorTelemetriaTests
{
    private readonly ProcessadorTelemetria _sut = new(); // SUT = System Under Test

    [Fact(DisplayName = "ValidarPressaoOperacional deve retornar True para valores nominais")]
    public void ValidarPressaoOperacional_ValorDentroDaFaixa_RetornaTrue()
    {
        // Arrange
        double pressaoNominal = 50.0;

        // Act
        bool resultado = _sut.ValidarPressaoOperacional(pressaoNominal);

        // Assert
        Assert.True(resultado);
    }

    [Theory(DisplayName = "ConverterCelsiusParaFahrenheit calcula conversões canônicas com precisão")]
    [InlineData(0.0, 32.0)]
    [InlineData(100.0, 212.0)]
    [InlineData(-40.0, -40.0)]
    [InlineData(37.0, 98.6)]
    public void ConverterCelsiusParaFahrenheit_ValoresConhecidos_RetornaEsperado(double celsius, double fahrenheitEsperado)
    {
        // Act
        double resultado = _sut.ConverterCelsiusParaFahrenheit(celsius);

        // Assert (com tolerância de ponto flutuante de 2 casas decimais)
        Assert.Equal(fahrenheitEsperado, resultado, precision: 2);
    }

    [Fact(DisplayName = "ConverterCelsiusParaFahrenheit dispara ArgumentOutOfRangeException para zero absoluto")]
    public void ConverterCelsiusParaFahrenheit_AbaixoZeroAbsoluto_DisparaExcecao()
    {
        // Arrange
        double tempInvalida = -300.0;

        // Act & Assert
        var ex = Assert.Throws<ArgumentOutOfRangeException>(() =>
        {
            _sut.ConverterCelsiusParaFahrenheit(tempInvalida);
        });

        Assert.Contains("zero absoluto", ex.Message);
    }
}

2. Instruções de Compilação e Execução

Para rodar a suíte através da ferramenta oficial dotnet test:

# 1. Criar projeto de teste xUnit com .NET 8
dotnet new xunit -n Telemetria.Tests -f net8.0
cd Telemetria.Tests

# 2. Executar os testes automatizados via CLI
dotnet test --logger "console;verbosity=normal"

3. Saída Esperada no Terminal

Iniciando execução de teste...
Executando: Telemetria.Tests.dll (.NETCoreApp,Version=v8.0)

Aprovado! - ValidarPressaoOperacional deve retornar True para valores nominais [2 ms]
Aprovado! - ConverterCelsiusParaFahrenheit calcula conversões canônicas com precisão (celsius: 0, fahrenheitEsperado: 32) [< 1 ms]
Aprovado! - ConverterCelsiusParaFahrenheit calcula conversões canônicas com precisão (celsius: 100, fahrenheitEsperado: 212) [< 1 ms]
Aprovado! - ConverterCelsiusParaFahrenheit calcula conversões canônicas com precisão (celsius: -40, fahrenheitEsperado: -40) [< 1 ms]
Aprovado! - ConverterCelsiusParaFahrenheit calcula conversões canônicas com precisão (celsius: 37, fahrenheitEsperado: 98.6) [< 1 ms]
Aprovado! - ConverterCelsiusParaFahrenheit dispara ArgumentOutOfRangeException para zero absoluto [1 ms]

Total de testes: 6
Aprovados: 6
Com falha: 0
Ignorados: 0
Tempo de execução: 0.4200 Segundos