Data integrity between scenarios in Specflow using Testcontainers (.net core)

166 Views Asked by At

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?

1

There are 1 best solutions below

1
Nonantiy On

Initiating Container in BeforeScenario

[BeforeScenario]
public async Task BeforeScenario(IObjectContainer objectContainer)
{
   var container = container

   objectContainer.RegisterInstanceAs(container, "scenarioContainer");
}

data integrity problems

use separate databases database cleanup