Использование TestContainers Как создать контейнер для каждого тестового файла?C#

Место общения программистов C#
Ответить
Anonymous
 Использование TestContainers Как создать контейнер для каждого тестового файла?

Сообщение Anonymous »

Мы используем testcontainers.postgresql для функционального тестирования в API, который мы делаем, и в настоящее время для каждого отдельного теста производится новый контейнер. Это вызывает проблему при запуске всего испытания локально и в нашем трубопроводе из -за количества контейнеров. Что я бы предпочел, так это если бы один контейнер был создан для каждого тестового файла/класса. На этом уровне тестовые данные согласуются.public class RestWebApplicationFactory : WebApplicationFactory
, IAsyncLifetime
{
private readonly PostgreSqlContainer _postgresContainer = new PostgreSqlBuilder()
.WithUsername("workshop")
.WithPassword("password")
.WithDatabase("mydb")
.Build();

private bool _isInitialised;

protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.UseEnvironment("Development");
Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "FUNCTIONALTEST");

var dataSourceBuilder = new NpgsqlDataSourceBuilder(_postgresContainer.GetConnectionString());
dataSourceBuilder.EnableDynamicJson();
var dataSource = dataSourceBuilder.Build();

builder.ConfigureServices(services =>
{
var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions));
if (descriptor != null)
{
services.Remove(descriptor);
}

var dbContextOptionsConfigDescriptor = services.SingleOrDefault(d => d.ServiceType == typeof(IDbContextOptionsConfiguration));
if (dbContextOptionsConfigDescriptor != null)
{
services.Remove(dbContextOptionsConfigDescriptor);
}

services.AddDbContext(options =>
{
options.UseNpgsql(dataSource);
options.ConfigureWarnings(warnings => warnings.Ignore(CoreEventId.ManyServiceProvidersCreatedWarning));
});

// Ensure database is created
var serviceProvider = services.BuildServiceProvider();
using (var scope = serviceProvider.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService();
db.Database.EnsureCreated();
}
});
}

public async Task InitializeAsync()
{
if (!_isInitialised)
{
await _postgresContainer.StartAsync();
_isInitialised = true;
}
}

public new async Task DisposeAsync()
{
await _postgresContainer.StopAsync();
}
}
< /code>
Затем у нас есть базовый класс, используемый тестами, которые вызывают конечные точки, которые устанавливают httpclient для тестов: < /p>
public class HttpClientBaseSteps:IClassFixture
{
protected readonly RestWebApplicationFactory _webApplicationFactory;
protected Token _suppliedToken = Token.NO;

public HttpClientBaseSteps(RestWebApplicationFactory webApplicationFactory)
{
_webApplicationFactory = webApplicationFactory;
_webApplicationFactory = webApplicationFactory;
_webApplicationFactory.InitializeAsync().GetAwaiter().GetResult();
}
protected virtual void SeedDatabase(CampaignManagementDbContext db)
{
// Override this to add data to the database
}
protected HttpClient CreateHttpClient()
{
return _webApplicationFactory.WithWebHostBuilder(
builder =>
{
builder.ConfigureTestServices(services =>
{
services.AddLogging();
var sp = services.BuildServiceProvider();
using (var scope = sp.CreateScope())
{
var scopedServices = scope.ServiceProvider;
var db = scopedServices.GetRequiredService();
db.Database.EnsureCreated();
SeedDatabase(db);
db.SaveChanges();
}

if (_suppliedToken != Token.NO)
{
//Test Auth
}
});
}
).CreateClient();
}
}
< /code>
Затем в шагах Specflow мы называем метод CreatehttpClient один раз для каждого теста: < /p>
[Given(@"there are scheduled campaigns in the system")]
public void GivenThereAreScheduledCampaignsInTheSystem()
{
_suppliedToken = Token.YES;
_campaignManagementClient = CreateHttpClient();
}
< /code>
Я спросил Copilot, как иметь только один контейнер для каждого класса, и он предложил сделать тестовый класс реализовать iclassfixture, но контейнер все еще разворачивается на тестирование вместо каждого тестового класса. Пожалуйста, дайте мне знать, если требуется дополнительная информация


Подробнее здесь: https://stackoverflow.com/questions/796 ... -test-file
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»