I tried to use Testcontainers in my c# specflow. But it seems Scpeflow didn't wait for the container to start when i initiated my container in my custome WebapplicationFacotry class. At last I created a new container in my BeforFeature hook and passed it to my WebapplicationFactory class.
[BeforeFeature]
public static async Task BuildAndStartContainerAsync(IObjectContainer objectContainer,
FeatureContext featureContext)
{
var container = new PostgreSqlBuilder()
.WithImage("postgres:15")
.WithDatabase("customers")
.WithUsername("customeruser")
.WithPortBinding(5432, 5432)
.WithPassword("AdminP003545")
.WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(5432))
.Build();
try
{
await container.StartAsync();
}
finally
{
var (stdout, stderr) = await container.GetLogsAsync();
Console.WriteLine(stdout);
}
var factory = new IntegrationTestFactory<Program, CustomerDBContext>(container);
objectContainer.RegisterInstanceAs(factory, "factory");
}
my WebApplicationFactory
[Binding]
public class IntegrationTestFactory<TProgram, TDbContext> : WebApplicationFactory<TProgram>
where TProgram : class where TDbContext : DbContext
{
public PostgreSqlContainer _databaseContainer;
public IntegrationTestFactory(PostgreSqlContainer databaseContainer)
{
_databaseContainer = databaseContainer;
}
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureTestServices(services =>
{
services.RemoveDbContext<TDbContext>();
var conn = _databaseContainer.GetConnectionString();
services.AddDbContext<TDbContext>(options => { options.UseNpgsql(conn); });
});
}
}
My Step Defintions class:
public CustomerManagerStepsDf(IObjectContainer objectContainer,ScenarioContext scenarioContext )
{
_scenarioContext = scenarioContext;
_testFactory=objectContainer.Resolve<IntegrationTestFactory<Program,CustomerDBContext>>("factory");
_client = _testFactory.CreateDefaultClient(new Uri("http://localhost:5160"));
}
Now there are other problems.
First: As scenarios run simultancy my data integrity breaks and some scenario fails. Second: Should I continue with initiating a container in BeforeScenario to guarantee scenario-specific containers and data isolation? Third: What strategies or best practices can be employed to ensure data integrity when running scenarios concurrently?
Initiating Container in BeforeScenario
data integrity problems
use separate databases database cleanup