Reo.Core.Xunit.IntegrationTesting 6.0.31756

dotnet add package Reo.Core.Xunit.IntegrationTesting --version 6.0.31756
NuGet\Install-Package Reo.Core.Xunit.IntegrationTesting -Version 6.0.31756
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Reo.Core.Xunit.IntegrationTesting" Version="6.0.31756" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Reo.Core.Xunit.IntegrationTesting --version 6.0.31756
#r "nuget: Reo.Core.Xunit.IntegrationTesting, 6.0.31756"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Reo.Core.Xunit.IntegrationTesting as a Cake Addin
#addin nuget:?package=Reo.Core.Xunit.IntegrationTesting&version=6.0.31756

// Install Reo.Core.Xunit.IntegrationTesting as a Cake Tool
#tool nuget:?package=Reo.Core.Xunit.IntegrationTesting&version=6.0.31756

Xunit.IntegrationTesting

Расширение фреймворка xUnit для выполнения интеграционного тестирования

Использование

Первоначальная настройка

В проекте с тестами необходимо определить файл со следующим содержимым:

using Reo.Core.IntegrationTesting.TestFramework.Mongo;
using Reo.Core.IntegrationTesting.TestFramework.Postgres;
using Reo.Core.Xunit.IntegrationTesting.Attributes;

[assembly:EnableIntegrationTestingFramework]
[assembly:RaiseContainer<PostgresTestContainer<TestingContext>>]
[assembly:RaiseContainer<MongoTestContainer>]

Атрибут EnableIntegrationTestingFramework должен быть указан в обязательном порядке. Он указывает xUnit, что необходимо использовать расширенный тестовый фреймворк вместо обычного.

Атрибут RaiseContainer нужен для того, чтобы при запуске тестов запустился контейнер указанного типа. В прошлом контейнеры запускались при старте каждого тестового класса, теперь запускается единственный контейнер для всех тестов примерно сразу после загрузки сборки.

На данный момент реализованы четыре контейнера (их можно найти в пакете Reo.Core.IntegrationTesting):

  • Postgres (PostgresTestContainer{TDbContext} и PostgresFixture{TDbContext})
  • Mongo (MongoTestContainer и MongoFixture)
  • Redis (RedisTestContainer и RedisFixture)
  • Elastic (ElasticTestContainer и ElasticFixture)
Написание тестов

В тестовом классе необходимо указать какую фикстуру вы хотите использовать.

CollectionFixture

Фикстура создается один раз на запускаемую пачку тестов

// CollectionDefinition.cs

[CollectionDefinition(nameof(PostgresDefinition))]
public sealed class PostgresDefinition : ICollectionFixture<PostgresFixture<TestingDbContext>>
{ }
// TestClass.cs

[Collection(nameof(PostgresDefinition))]
public sealed class TestClass
{
    private readonly PostgresFixture<TestingDbContext> _fixture;

    public TestClass(PostgresFixture<TestingDbContext> fixture)
    {
        _fixture = fixture;
    }

    [Fact]
    public void Verify()
    {
        // ...
    }
}

К сожалению, CollectionDefinition необходимо описывать в каждой сборке, иначе xUnit их не увидит (см. документацию xUnit)

ClassFixture

Фикстура создается один раз на запускаемый тестовый класс

public sealed class TestClass : IClassFixture<MongoFixture>
{
    private readonly MongoFixture _fixture;

    public TestClass(MongoFixture fixture)
    {
        _fixture = fixture;
    }

    [Fact]
    public void Verify()
    {
        // ...
    }
}

И то, и другое

xUnit не запрещает внедрять IClassFixture и ICollectionFixture одновременно:

[Collection(nameof(PostgresDefinition))]
public sealed class TestClass : IClassFixture<MongoFixture>
{
    // ...

    public TestClass(PostgresFixture<TestingDbContext> postgresFixture, MongoFixture mongoFixture)
    {
    	// ...
    }

    // ...
}

Сидирование данных

Чтобы проинициализировать справочники, вы должны реализовать абстрактный класс ContainerSeeder

public sealed class PostgresSeeder : ContainerSeeder<PostgresFixture<TestingContext>>
{
    /// <inheritdoc />
    public override async Task SeedAsync(PostgresFixture<TestingContext> fixture)
    {
        await using var databaseContext =
            await fixture.DatabaseContextFactory.CreateDbContextAsync();

        databaseContext.References.Add(new()
        {
            Id = Guid.NewGuid(),
            Name = "Profile test"
        });

        await databaseContext.SaveChangesAsync();
    }
}

Сид не должен содержать конструкторов, кроме стандартного. Количество сидов для одной фикстуры не ограничено.

Немного про очистку базы данных после исполнения конкретного теста

Если после каждого теста вы хотите откатывать ее в первоначальное состояние - используйте метод CleanupAsync, определенной у каждой фикстуры:

public sealed class Tests : IClassFixture<PostgresFixture<TestingContext>>, IAsyncLifetime
{
    private readonly PostgresFixture<TestingContext> _fixture;

    public ContainerSeederTests(PostgresFixture<TestingContext> fixture)
        => _fixture = fixture;

    public async Task InitializeAsync()
    {
        await using var databaseContext =
            await _fixture.DatabaseContextFactory.CreateDbContextAsync();

        databaseContext.Entities.Add(new()
        {
            Id = Guid.NewGuid()
        });

        await databaseContext.SaveChangesAsync();
    }

    [Theory]
    [InlineData(1)]
    [InlineData(2)]
    [InlineData(3)]
    public async Task Verify(int _)
    {
        // Благодаря _fixture.CleanupAsync() в базе всегда будет 1 запись, добавленная в InitializeAsync()
    }


    public Task DisposeAsync()
        => _fixture.CleanupAsync();
}

Метод CleanupAsync очищает базу данных и повторно выполняет сидирование справочников

Регистрация артефактов из фикстуры в AutoMocker

При внедрении фикстуры используйте готовые методы расширения:

public sealed class TestClass :
    IClassFixture<PostgresFixture<TestingDbContext>>,
    IClassFixture<MongoFixture>,
    IClassFixture<ElasticFixture>,
    IClassFixture<RedisFixture>
{
    private readonly AutoMocker _mocker = new();

    // ...

    public TestClass(
        PostgresFixture<TestingDbContext> postgresFixture,
        MongoFixture mongoFixture,
        ElasticFixture elasticFixture,
        RedisFixture redisFixture)
    {
    	// ...

        _mocker
            .SetupPostgres(postgresFixture)
            .SetupMongo(mongoFixture)
            .SetupElastic(elasticFixture)
            .SetupRedis(redisFixture);
    }

    // ...
}
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Reo.Core.Xunit.IntegrationTesting:

Package Downloads
Reo.Core.IntegrationTesting

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
6.0.31756 27 5/12/2024
6.0.31755 26 5/12/2024
6.0.31754 28 5/12/2024
6.0.31753 86 5/8/2024
6.0.31751 92 5/7/2024
6.0.31749 91 5/6/2024
6.0.31748 95 5/6/2024
6.0.31747 99 5/6/2024
6.0.31746 64 5/3/2024
6.0.31745 51 5/3/2024
6.0.31744 53 5/3/2024
6.0.31743 51 5/2/2024
6.0.31742 95 4/27/2024
6.0.31741 94 4/27/2024
6.0.31740 96 4/26/2024
6.0.31739 89 4/26/2024
6.0.31738 98 4/26/2024
6.0.31737 104 4/26/2024
6.0.31735 101 4/25/2024
6.0.31734 89 4/25/2024
6.0.31733 88 4/25/2024
6.0.31732 91 4/25/2024
6.0.31731 79 4/25/2024
6.0.31730 97 4/24/2024
6.0.31729 88 4/24/2024
6.0.31728 93 4/24/2024
6.0.31727 89 4/23/2024
6.0.31726 75 4/23/2024
6.0.31725 90 4/23/2024
6.0.31724 90 4/22/2024
6.0.31723 90 4/22/2024
6.0.31722 99 4/22/2024
6.0.31721 95 4/22/2024
6.0.31720 90 4/22/2024
6.0.31719 88 4/22/2024
6.0.31718 90 4/22/2024
6.0.31717 92 4/22/2024
6.0.31716 88 4/22/2024
6.0.31715 103 4/20/2024
6.0.31714 102 4/19/2024
6.0.31713 80 4/19/2024
6.0.31712 78 4/19/2024
6.0.31711 94 4/19/2024
6.0.31710 80 4/19/2024
6.0.31709 88 4/19/2024
6.0.31708 89 4/18/2024
6.0.31707 84 4/18/2024
6.0.31706 82 4/18/2024
6.0.31705 81 4/17/2024
6.0.31704 102 4/17/2024
6.0.31703 90 4/17/2024
6.0.31702 91 4/17/2024
6.0.31701 87 4/16/2024
6.0.31700 85 4/16/2024
6.0.31699 87 4/16/2024
6.0.31698 80 4/16/2024
6.0.31697 80 4/16/2024
6.0.31696 79 4/16/2024
6.0.31695 75 4/16/2024
6.0.31694 81 4/16/2024
6.0.31693 81 4/16/2024
6.0.31692 78 4/15/2024
6.0.31691 79 4/15/2024
6.0.31690 90 4/15/2024
6.0.31688 97 4/12/2024
6.0.31687 73 4/12/2024
6.0.31686 79 4/12/2024
6.0.31685 78 4/12/2024
6.0.31684 78 4/11/2024
6.0.31683 88 4/10/2024
6.0.31682 81 4/10/2024
6.0.31681 80 4/10/2024
6.0.31680 85 4/10/2024
6.0.31679 76 4/10/2024
6.0.31678 77 4/10/2024
6.0.31677 89 4/9/2024
6.0.31676 93 4/9/2024
6.0.31675 90 4/8/2024
6.0.31674 97 4/8/2024
6.0.31673 99 4/8/2024
6.0.31672 77 4/8/2024
6.0.31671 77 4/8/2024
6.0.31670 87 4/8/2024
6.0.31669 84 4/8/2024
6.0.31668 92 4/5/2024
6.0.31667 93 4/5/2024
6.0.31666 99 4/3/2024
6.0.31665 92 4/3/2024
6.0.31663 96 4/3/2024
6.0.31662 88 4/3/2024
6.0.31661 90 4/2/2024
6.0.31660 93 4/1/2024
6.0.31659 84 4/1/2024
6.0.31658 81 4/1/2024
6.0.31657 86 3/29/2024
6.0.31656 82 3/29/2024
6.0.31655 85 3/29/2024
6.0.31654 93 3/29/2024
6.0.31653 78 3/29/2024
6.0.31651 73 3/29/2024
6.0.31650 78 3/29/2024
6.0.31649 79 3/29/2024
6.0.31648 79 3/29/2024
6.0.31647 77 3/29/2024
6.0.31646 99 3/29/2024
6.0.31645 82 3/28/2024
6.0.31644 84 3/28/2024
6.0.31643 90 3/28/2024
6.0.31642 85 3/28/2024
6.0.31639 89 3/28/2024
6.0.31638 74 3/28/2024
6.0.31637 98 3/27/2024
6.0.31636 120 3/27/2024
6.0.31631 88 3/27/2024
6.0.31626 95 3/26/2024
6.0.31625 100 3/25/2024
6.0.31618 100 3/20/2024
6.0.31617 91 3/20/2024
6.0.31616 102 3/20/2024
6.0.31615 90 3/20/2024
6.0.31614 110 3/19/2024
6.0.31613 105 3/18/2024
6.0.31612 115 3/18/2024
6.0.31611 116 3/18/2024
6.0.31610 109 3/18/2024
6.0.31609 102 3/15/2024
6.0.31608 102 3/14/2024
6.0.31607 114 3/13/2024
6.0.31606 103 3/13/2024
6.0.31605 101 3/13/2024
6.0.31604 99 3/12/2024
6.0.31603 98 3/12/2024
6.0.31602 127 3/7/2024
6.0.31601 105 3/7/2024
6.0.31600 114 3/7/2024
6.0.31599 109 3/6/2024
6.0.31598 100 3/6/2024
6.0.31597 105 3/6/2024
6.0.31596 103 3/6/2024
6.0.31595 114 3/6/2024
6.0.31594 103 3/4/2024
6.0.31593 91 3/4/2024
6.0.31590 99 3/1/2024
6.0.31589 94 3/1/2024
6.0.31588 98 3/1/2024
6.0.31587 88 3/1/2024
6.0.31586 96 3/1/2024
6.0.31585 86 3/1/2024
6.0.31584 98 3/1/2024
6.0.31583 89 3/1/2024
6.0.31582 99 2/29/2024
6.0.31581 92 2/29/2024
6.0.31580 98 2/29/2024
6.0.31579 102 2/29/2024
6.0.31578 99 2/29/2024
6.0.31577 94 2/29/2024
6.0.31576 97 2/29/2024
6.0.31575 99 2/28/2024