XUnit - pruebas de ejecución en serie

He creado pocas pruebas en XUnit (.NET CORE 5) Aquí está mi código:

public class SerialTest
{
    [Fact]
    public async Task Test1()
    {
        await Task.Delay(TimeSpan.FromSeconds(5));
        Assert.True(true);
    }

    [Fact]
    public async Task Test2()
    {
        await Task.Delay(TimeSpan.FromSeconds(5));
        Assert.True(true);
    }
}

Estas pruebas deben funcionar en serie - Test1 debe terminarse antes del examen 2. Pero no está pasando. Así es como funciona: enter image description here

¿Cómo cambiarlo?

Pregunta hecha hace 3 años, 4 meses, 27 días - Por geekglitcher1735


3 Respuestas:

  • La respuesta habitual a esto es que las pruebas de unidad bien construidas deben ser capaces de ejecutar en cualquier orden, pero ...

    https://hamidmosalla.com/2018/08/16/xunit-control-the-test-execution-order/

    Respondida el Dec 18, 2020 a las 15:37 - por Brian

    Votos positivos: 0 | Votos negativos: 0

  • Para lograr que las pruebas se ejecuten en serie en XUnit, puedes utilizar la clase CollectionDefinition para agrupar las pruebas que quieres que se ejecuten en serie. Aquí te muestro cómo modificar tu código para lograrlo:

    • Define una clase que especifique la colección para las pruebas que deseas ejecutar en serie:
    csharp
    [CollectionDefinition("Serial")]
    public class SerialCollection : ICollectionFixture
    {
        // Esta clase no necesita tener contenido, solo se utilizará para agrupar las pruebas
    }
    

    • Define una clase SerialFixture que configura la ejecución en serie de las pruebas:
    csharp
    public class SerialFixture : IDisposable
    {
        private readonly SemaphoreSlim _lock = new SemaphoreSlim(1, 1);

    public async Task GetLock() { await _lock.WaitAsync(); }

    public void Dispose() { _lock.Release(); } }

    • Modifica tus pruebas para que pertenezcan a la colección "Serial" y utilicen el bloqueo de la clase SerialFixture para ejecutarse en serie:
    csharp
    [Collection("Serial")]
    public class SerialTest
    {
        private readonly SerialFixture _fixture;

    public SerialTest(SerialFixture fixture) { _fixture = fixture; }

    [Fact] public async Task Test1() { await _fixture.GetLock(); await Task.Delay(TimeSpan.FromSeconds(5)); Assert.True(true); }

    [Fact] public async Task Test2() { await _fixture.GetLock(); await Task.Delay(TimeSpan.FromSeconds(5)); Assert.True(true); } }

    Con estos cambios, tus pruebas Test1 y Test2 deberían ejecutarse en serie, con Test1 completándose antes de que comience Test2.

    Respondida el Dec 19, 2020 a las 15:34 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para ejecutar pruebas de XUnit en serie, puedes utilizar el atributo [Collection]. Este atributo te permite agrupar pruebas que deben ejecutarse en el mismo contexto, como una base de datos o un archivo.

    Así es como puedes modificar tu código para ejecutar las pruebas en serie:

    
    [Collection("SerialTests")]
    public class SerialTest
    {
        [Fact]
        public async Task Test1()
        {
            await Task.Delay(TimeSpan.FromSeconds(5));
            Assert.True(true);
        }
    
        [Fact]
        public async Task Test2()
        {
            await Task.Delay(TimeSpan.FromSeconds(5));
            Assert.True(true);
        }
    }
    

    Además, debes crear una clase de colección para agrupar las pruebas:

    
    [CollectionDefinition("SerialTests")]
    public class SerialTestsCollection : ICollectionFixture
    {
        // This class has no code, and is only used to group tests
    }
    

    Finalmente, debes crear una clase de fixture para proporcionar recursos compartidos a las pruebas:

    
    public class SerialTestsFixture
    {
        // This class can be used to provide shared resources, such as a database connection
    }
    

    Con estos cambios, tus pruebas se ejecutarán en serie.

    Respondida el Dec 19, 2020 a las 15:43 - por Gemini

    Votos positivos: 0 | Votos negativos: 0