Reo.Core.TUnitIntegrationTesting
10.0.378
dotnet add package Reo.Core.TUnitIntegrationTesting --version 10.0.378
NuGet\Install-Package Reo.Core.TUnitIntegrationTesting -Version 10.0.378
<PackageReference Include="Reo.Core.TUnitIntegrationTesting" Version="10.0.378" />
<PackageVersion Include="Reo.Core.TUnitIntegrationTesting" Version="10.0.378" />
<PackageReference Include="Reo.Core.TUnitIntegrationTesting" />
paket add Reo.Core.TUnitIntegrationTesting --version 10.0.378
#r "nuget: Reo.Core.TUnitIntegrationTesting, 10.0.378"
#:package Reo.Core.TUnitIntegrationTesting@10.0.378
#addin nuget:?package=Reo.Core.TUnitIntegrationTesting&version=10.0.378
#tool nuget:?package=Reo.Core.TUnitIntegrationTesting&version=10.0.378
Reo.Core.TUnitIntegrationTesting
Инфраструктура интеграционного тестирования на базе TUnit с общими Docker-контейнерами (Testcontainers) для всех тестов сборки.
Пакет содержит TUnit-связанную часть: фикстуры хранилищ и привязку их жизненного цикла к TUnit
(TUnitContainerFixture реализует IAsyncInitializer/IAsyncDisposable). Фреймворк-нейтральная база
(абстракции и конкретные контейнеры хранилищ, сидирование, BaseContainerFixture,
TestingPostgresDbContextFactory, RespawnerFacade, построитель тестового хоста) живёт в
Reo.Core.Testing.Common и не зависит от тестового фреймворка.
Общие абстракции юнит-тестов, не требующие контейнеров (SetupLogger для AutoMocker,
BaseValidatorTests, BaseArchitectureTests), вынесены в пакет Reo.Core.Testing.TUnit
(namespace Reo.Core.Testing.TUnit / Reo.Core.Testing.TUnit.Mocker) — юнит-тестовым проектам достаточно
ссылаться на него. Этот пакет подключается сюда транзитивно, поэтому существующие потребители
Reo.Core.TUnitIntegrationTesting продолжают работать.
Парадигма один контейнер на все тесты сборки. Контейнер поднимается один раз перед первым тестом, использующим фикстуру, и останавливается после завершения всех тестов сборки.
Как это работает
В TUnit шаринг контейнера достигается штатным механизмом фреймворка — [ClassDataSource<TFixture>(Shared = SharedType.PerAssembly)]:
- TUnit создает ровно один экземпляр фикстуры на сборку;
- при создании фикстуры вызывается
IAsyncInitializer.InitializeAsync()— здесь поднимается контейнер, создается контекст и выполняется сидирование; - после всех тестов сборки вызывается
IAsyncDisposable.DisposeAsync()— контейнер останавливается.
Использование
Подключите пакет в тестовый проект и запросите фикстуру в тестовом классе через свойство:
public class OrderRepositoryTests
{
[ClassDataSource<PostgresFixture<TestingContext>>(Shared = SharedType.PerAssembly)]
public required PostgresFixture<TestingContext> Postgres { get; init; }
[Test]
public async Task Save_order_should_persist_order(CancellationToken cancellationToken)
{
var context = Postgres.DatabaseContextFactory.CreateDbContext();
// ...
}
}
либо через конструктор:
[ClassDataSource<PostgresFixture<TestingContext>>(Shared = SharedType.PerAssembly)]
public class OrderRepositoryTests(PostgresFixture<TestingContext> postgres)
{
[Test]
public async Task Save_order_should_persist_order(CancellationToken cancellationToken)
{
// ...
}
}
Доступные пары «контейнер — фикстура»
| Хранилище | Контейнер | Фикстура |
|---|---|---|
| Postgres 12 | PostgresTestContainer<TDbContext> |
PostgresFixture<TDbContext> |
| Postgres 11.17 (Identity Server, EventsApi) | PostgresIbTestContainer<TDbContext> |
PostgresIbFixture<TDbContext> |
| Mongo 7.0.12 | MongoTestContainer |
MongoFixture |
| Mongo 4.4.6 (GarbageTruckLastPositionTracker, Contracts) | MongoIotTestContainer |
MongoIotFixture |
| Redis | RedisTestContainer |
RedisFixture |
| Elasticsearch | ElasticTestContainer |
ElasticFixture |
| RabbitMq | RabbitMqTestContainer |
RabbitMqFixture |
Сидирование контейнера
Создайте в тестовом проекте наследника ContainerSeeder<TFixture> (конструктор — без параметров, количество
сидов не ограничено, находятся рефлексией автоматически):
public sealed class AdminUserSeeder : ContainerSeeder<PostgresFixture<TestingContext>>
{
protected override async Task SeedAsync(PostgresFixture<TestingContext> fixture)
{
var context = fixture.DatabaseContextFactory.CreateDbContext();
// наполнение базы тестовыми данными
}
}
Сиды выполняются один раз при старте контейнера и повторно после каждой очистки.
Очистка контейнера
Между тестами состояние контейнера откатывается вызовом CleanupAsync() — например, из хука [After(Test)]
или [After(Class)]:
[After(Test)]
public async Task Cleanup() => await Postgres.CleanupAsync();
Для Postgres очистка откатывает базу к чекпоинту (Respawn), для Mongo — удаляет все несистемные коллекции.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- AspNetCore.HealthChecks.Elasticsearch (>= 9.0.0)
- AspNetCore.HealthChecks.MongoDb (>= 9.0.0)
- AspNetCore.HealthChecks.NpgSql (>= 9.0.0)
- AspNetCore.HealthChecks.Redis (>= 9.0.0)
- AspNetCore.HealthChecks.UI.Client (>= 9.0.0)
- AwesomeAssertions (>= 9.6.0)
- AwesomeAssertions.Analyzers (>= 9.0.8)
- Bogus (>= 35.6.5)
- Duende.IdentityModel (>= 8.1.0)
- ertelecom.Serilog.Sinks.Graylog (>= 1.1.0)
- FluentValidation (>= 12.1.1)
- FluentValidation.AspNetCore (>= 11.3.1)
- Flurl (>= 4.0.0)
- Flurl.Http (>= 4.0.2)
- Flurl.Http.Newtonsoft (>= 0.9.1)
- Humanizer (>= 3.0.10)
- Humanizer.Core (>= 3.0.10)
- Humanizer.Core.ru (>= 3.0.10)
- JetBrains.Annotations (>= 2026.2.0)
- LinqKit.Core (>= 1.2.11)
- MassTransit (>= 8.5.10 && < 9.0.0)
- MassTransit.Abstractions (>= 8.5.10 && < 9.0.0)
- MassTransit.RabbitMQ (>= 8.5.10 && < 9.0.0)
- Meziantou.FluentAssertionsAnalyzers (>= 1.0.22)
- Microsoft.AspNetCore.Authentication.JwtBearer (>= 10.0.12)
- Microsoft.AspNetCore.Authentication.OpenIdConnect (>= 10.0.12)
- Microsoft.AspNetCore.Mvc.NewtonsoftJson (>= 10.0.12)
- Microsoft.AspNetCore.TestHost (>= 10.0.12)
- Microsoft.Bcl.AsyncInterfaces (>= 10.0.12)
- Microsoft.CodeAnalysis.Analyzers (>= 3.11.0)
- Microsoft.CodeAnalysis.Common (= 5.0.0)
- Microsoft.CodeAnalysis.CSharp (= 5.0.0)
- Microsoft.CodeAnalysis.CSharp.Workspaces (= 5.0.0)
- Microsoft.CodeAnalysis.Workspaces.Common (= 5.0.0)
- Microsoft.CodeAnalysis.Workspaces.MSBuild (= 5.0.0)
- Microsoft.EntityFrameworkCore (>= 10.0.12)
- Microsoft.EntityFrameworkCore.Design (>= 10.0.12)
- Microsoft.EntityFrameworkCore.InMemory (>= 10.0.12)
- Microsoft.EntityFrameworkCore.Relational (>= 10.0.12)
- Microsoft.Extensions.Caching.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Caching.Memory (>= 10.0.12)
- Microsoft.Extensions.Caching.StackExchangeRedis (>= 10.0.12)
- Microsoft.Extensions.Configuration (>= 10.0.12)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.12)
- Microsoft.Extensions.DependencyInjection (>= 10.0.12)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore (>= 10.0.12)
- Microsoft.Extensions.Diagnostics.Testing (>= 10.10.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Http.Polly (>= 10.0.12)
- Microsoft.Extensions.Logging (>= 10.0.12)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Options (>= 10.0.12)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.12)
- Microsoft.Extensions.TimeProvider.Testing (>= 10.10.0)
- MongoDB.Analyzer (>= 2.0.0)
- MongoDB.Driver (>= 3.12.0)
- Moq.Analyzers (>= 0.4.2)
- Moq.AutoMock (= 4.0.2)
- NEST (>= 7.17.5)
- NEST.JsonNetSerializer (>= 7.17.5)
- Newtonsoft.Json (>= 13.0.4)
- Npgsql.EntityFrameworkCore.PostgreSQL (>= 10.0.3)
- Polly (>= 8.5.0)
- RabbitMQ.Client (>= 7.2.1)
- RedLock.net (>= 2.3.2)
- Reo.Core.Database (>= 10.0.378)
- Reo.Core.Elastic (>= 10.0.378)
- Reo.Core.Logging (>= 10.0.378)
- Reo.Core.MongoDB (>= 10.0.378)
- Reo.Core.Testing.Common (>= 10.0.378)
- Reo.Core.Testing.TUnit (>= 10.0.378)
- Reo.Models.StronglyTyped (>= 1.0.56)
- Reo.Models.StronglyTyped.MongoDb (>= 1.0.56)
- Respawn (>= 7.0.0)
- Serilog (>= 4.4.0)
- Serilog.AspNetCore (>= 10.0.0)
- SharpCompress (>= 0.48.1)
- SSH.NET (>= 2026.0.0)
- stbychkov.AutoLoggerMessage (>= 1.0.17)
- Swashbuckle.AspNetCore (>= 10.2.3)
- System.ComponentModel.Annotations (>= 5.0.0)
- System.IO.Abstractions (>= 22.3.0)
- System.Linq.Async (>= 7.0.1)
- TestableIO.System.IO.Abstractions (>= 22.3.0)
- TestableIO.System.IO.Abstractions.TestingHelpers (>= 22.3.0)
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.3.0)
- Testcontainers (>= 4.15.0)
- Testcontainers.Elasticsearch (>= 4.15.0)
- Testcontainers.MongoDb (>= 4.15.0)
- Testcontainers.PostgreSql (>= 4.15.0)
- Testcontainers.RabbitMq (>= 4.15.0)
- Testcontainers.Redis (>= 4.15.0)
- TUnit.Core (>= 1.72.10)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 10.0.378 | 0 | 10/2/2026 |
| 10.0.372 | 0 | 10/2/2026 |
| 10.0.370 | 0 | 10/2/2026 |
| 10.0.369 | 73 | 9/29/2026 |
| 10.0.368 | 78 | 9/28/2026 |
| 10.0.366 | 101 | 9/24/2026 |
| 10.0.365 | 90 | 9/23/2026 |
| 10.0.364 | 111 | 9/17/2026 |
| 10.0.363 | 95 | 9/17/2026 |
| 10.0.362 | 93 | 9/17/2026 |
| 10.0.361 | 90 | 9/17/2026 |
| 10.0.360 | 100 | 9/14/2026 |
| 10.0.359 | 96 | 9/14/2026 |
| 10.0.358 | 95 | 9/14/2026 |
| 10.0.357 | 92 | 9/14/2026 |
| 10.0.356 | 91 | 9/14/2026 |
| 10.0.355 | 101 | 9/14/2026 |
| 10.0.354 | 94 | 9/14/2026 |
| 10.0.353 | 93 | 9/14/2026 |
| 10.0.352 | 98 | 9/14/2026 |