💻 Exemplos: Capítulo 16: Testes Automatizados no .NET com xUnit e FluentAssertions
💻 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