Yeehaw, compañeiro desenvolvedor! Hai un novo sheriff en Testing Town, e o seu nome é TUnit. Este recén chegado promete poñer orde no salvaxe oeste das probas unitarias en .NET 8. Estás listo para un duelo de frameworks? Desenfunda o teu teclado e prepárate!

TLDR (Resumo)

  • TUnit é un novo framework de probas unitarias para .NET 8.
  • Baséase en NUnit e XUnit.
  • Ofrece unha sintaxe fluída e expresiva para as asercións.
  • Executa probas en paralelo por defecto.
  • É máis rápido que NUnit e XUnit.
  • Proporciona mensaxes de erro claras e doadas de entender.
  • Permite probas orientadas a datos co atributo Arguments.
  • Está dispoñible como paquete NuGet e é compatible con Visual Studio, Rider e VS Code.
  • Visita TUnit para saber máis.

Quen é este forasteiro chamado TUnit?

TUnit non é un forasteiro en Testing Town. Baséase no mellor de NUnit e XUnit pero renuncia aos problemas que poden dar as compatibilidades con versións antigas de .NET. Só está dispoñible a partir da versión 8 xa que está creado sobre a nova plataforma de testing de Microsoft (Microsoft.Testing.Platform) e iso fai que as túas probas se executen máis rápido que o mellor corcel que xamais vises.

Probas unitarias, de integración, de aceptación... nada fai tremer ao noso sheriff.

Podes atopalo tanto para as últimas versións de Visual Studio como en Rider ou VS Code como paquete NuGet: Tunit nuget

TUnit en acción: Limpando as rúas de Testing Town

Pero basta de palabrería. Chegou a hora de ver como é e de que é capaz TUnit.

Esta é unha proba unitaria sinxela onde o noso sheriff capturará a Billy o Neno e obterá 10.000$ de recompensa por iso.

using TUnit.Assertions;
using TUnit.Assertions.Extensions;
using TUnit.Core;

public class SheriffTests
{
    [Test]
    public async Task CapturarBandido_BandidoCoñecido_DeberíaAumentarRecompensa()
    {
        // Arrange
        var sheriff = new Sheriff("Wyatt Earp");
        var bandido = new Bandido("Billy the Kid", recompensa: 10000);

        // Act
        var result = sheriff.CapturarBandido(bandido);

        // Assert
        await Assert.That(result.Recompensa).IsEqualTo(10000);
    }        
}
  • Se te fixas, TUnit segue usando o patrón AAA (Arrange, Act e Assert) que usamos no resto de frameworks de testing.
  • Os Assert usan unha sintaxe fluída para que sexa moito máis claro e lexible que están validando.
  • E aínda que aquí só temos unha proba, as probas lánzanse por defecto sempre en paralelo. Se algunha das túas probas non debe ser lanzada de forma paralela necesitas engadir o atributo [NotInParallel] nela.
    [Test, NotInParallel]
    public async Task CapturarBandido_BandidoCoñecido_DeberíaAumentarRecompensa()
    

As armas do novo sheriff: Assertions de TUnit

Todo bo sheriff necesita un arsenal, e TUnit non se queda curto. No exemplo anterior xa coñeciches a That e a IsEqualTo pero aquí temos a uns cantos máis.

  • That().IsNullOrEmpty()
  • That().IsNullOrWhitespace()
  • That().IsNotNull()
  • That().IsPositive()
  • That().ThrowsException()

Hai moitos máis e incluso se non atopas o que necesitas podes crear os teus propios Assert herdando da clase AssertCondition<TActual, TExpected> onde TActual é o obxecto a ser validado e TExpected o valor esperado.

Sobreescribe o método Passes coa validación que necesitas realizar private protected override bool Passes(TActual? actualValue, Exception? exception)

E o método GetFailureMessage para mostrar a mensaxe de erro que necesitas protected internal override string GetFailureMessage()

Outro punto interesante é que podes crear validacións máis complexas ou completas coas propiedades And e Or

[Test]
public async Task MyTest()
{
    var result = 1 + 2;

    await Assert.That(result)
        .IsNotNull()
        .And.IsPositive()
        .And.IsEqualTo(3);
}

Que me aspen se isto non merece un bo trago de zarzaparrilla!

O gran duelo: TUnit vs NUnit vs xUnit

TUnit NUnit xUnit
Sintaxe Fluída e expresiva Tradicional Moderna pero menos expresiva
Velocidade 🚀🚀🚀 🚀🚀 🚀🚀
Curva de aprendizaxe Suave como un whisky añello Familiar como un vello revólver Algo complicada ao principio
Integración .NET 8 Perfecta como un traxe a medida Boa Boa
Mensaxes de erro Claras como a auga do río Ás veces crípticas Mellores que NUnit
Comunidade Pequena pero crecendo Grande e establecida Grande e activa
Plugins Poucos pero potentes Abundantes Moderados

Por que TUnit é o novo sheriff que necesitamos?

  1. Sintaxe que namora: Escribir tests con TUnit é tan satisfactorio como gañar un duelo ao mediodía. Simple, sinxelo e usando sintaxe fluída.

    [Test]
    public void Banco_RetirarDiñeiro_DeberíaReducirSaldo()
    {
        var conta = new ContaBancaria(saldoInicial: 100);
        conta.RetirarDiñeiro(50);
        conta.Saldo.That().IsEqual(50);
    }
    
  2. Velocidade de vaqueiro: Os teus tests correrán máis rápido que un ladrón de bancos perseguido pola lei.

Method Mean Error StdDev
TUnit_AOT 239.1 ms 17.49 ms 51.58 ms
TUnit 598.0 ms 22.00 ms 64.88 ms
NUnit 14,188.5 ms 282.69 ms 495.11 ms
xUnit 14,397.4 ms 285.65 ms 684.40 ms
MSTest 14,396.9 ms 285.20 ms 370.85 ms
  1. Mensaxes de erro que falan a túa lingua: Nada de xeroglíficos. TUnit diche que pasou coa claridade dun predicador de domingo.

  2. Probas orientadas a datos: Repite as túas probas tantas veces como queiras cun set de datos distintos sen volverte tolo usando o atributo Arguments.

    [Test]
    [Arguments(1, 1, 2)]
    [Arguments(1, 2, 3)]
    [Arguments(2, 2, 4)]
    [Arguments(4, 3, 7)]
    [Arguments(5, 5, 10)]
    public async Task MyTest(int value1, int value2, int expectedResult)
    {
        var result = value1 + value2;
        await Assert.That(result).IsEqualTo(expectedResult);
    }
    

Conclusión: Estás listo para unirte á nova lei en Testing Town?

TUnit non é só outro framework de testing, é unha revolución no salvaxe oeste do desenvolvemento. É rápido, intuitivo e máis divertido que un rodeo en sábado pola noite.

NUnit e xUnit son como eses vellos alguacís que mantiveron a paz durante anos. Respectables, confiables, pero quizais un pouco cansados. TUnit é o novo sheriff na cidade, traendo ideas frescas e unha actitude que fai que probar o teu código sexa máis emocionante que un tiroteo ao atardecer. É certo que é novo na cidade e necesitará un tempo para ver se se asenta e gáñase o respecto que merece.

Así que, que dis, vaqueiro? Estás listo para colgar a túa vella placa de NUnit ou xUnit e unirte á nova lei en Testing Town? TUnit está agardando por ti, e xuntos, farán que os bugs treman de medo ao oír os seus pasos.

E ti? Atréveste a desenfundar TUnit no teu próximo proxecto? Ou seguirás aferrado ao teu vello confiable como un vaqueiro ao seu cabalo favorito?

Lembra: en Testing Town, a única lei é a calidade do código. E con TUnit como o teu axudante, esa lei cumprirase... a rajatabla!

Se queres saber máis sobre el revisa a súa páxina: TUnit ou se te ves con ánimo de ser axudante do sheriff proba a facer as túas achegas ao repositorio de Git do proxecto Repositorio