Мы используем 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
Использование TestContainers Как создать контейнер для каждого тестового файла? ⇐ C#
Место общения программистов C#
1749834493
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, но контейнер все еще разворачивается на тестирование вместо каждого тестового класса. Пожалуйста, дайте мне знать, если требуется дополнительная информация
Подробнее здесь: [url]https://stackoverflow.com/questions/79632362/using-testcontainers-how-do-i-create-a-container-for-each-test-file[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия