Docker API отвечает конфликтом кода состояния, контейнер xxxxxx не работает - Связано с mssqlbuilder < /li>
testcontainer Чтобы Docker выпустил < /li>
Участие в запуске тестирования Playwright .net внутри контейнера Docker - аналогично моим, но не так же, как я использую REQNROLL < /li>
Тесты XUNIT, используя TestContainers, провальные в Github - попробовал это, не работал для меня < /li>
< /ul> Получение: < /p>
Код: Выделить всё
Failed ForgotPasswordSendsCorrectEmailCheckViaMaildevAPI [22 s]
Error Message:
OneTimeSetUp: Docker.DotNet.DockerApiException : Docker API responded with status code=Conflict, response={"message":"container xxxx is not running"}
Stack Trace:
at Docker.DotNet.DockerClient.HandleIfErrorResponseAsync(HttpStatusCode statusCode, HttpResponseMessage response, IEnumerable`1 handlers) in /_/src/Docker.DotNet/DockerClient.cs:line 494
at Docker.DotNet.DockerClient.MakeRequestAsync[T](IEnumerable`1 errorHandlers, HttpMethod method, String path, IQueryString queryString, IRequestContent body, IDictionary`2 headers, TimeSpan timeout, CancellationToken token) in /_/src/Docker.DotNet/DockerClient.cs:line 246
at Docker.DotNet.ExecOperations.CreateContainerExecAsync(String id, ContainerExecCreateParameters parameters, CancellationToken cancellationToken) in /_/src/Docker.DotNet/Endpoints/ExecOperations.cs:line 45
at DotNet.Testcontainers.Clients.DockerContainerOperations.ExecAsync(String id, IList`1 command, CancellationToken ct) in /_/src/Testcontainers/Clients/DockerContainerOperations.cs:line 162
at DotNet.Testcontainers.Configurations.UntilUnixCommandIsCompleted.UntilAsync(IContainer container) in /_/src/Testcontainers/Configurations/WaitStrategies/UntilUnixCommandIsCompleted.cs:line 22
at DotNet.Testcontainers.Containers.DockerContainer.CheckReadinessAsync(WaitStrategy waitStrategy, CancellationToken ct) in /_/src/Testcontainers/Containers/DockerContainer.cs:line 646
at DotNet.Testcontainers.Configurations.WaitStrategy.c__DisplayClass24_0.d.MoveNext() in /_/src/Testcontainers/Configurations/WaitStrategies/WaitStrategy.cs:line 184
--- End of stack trace from previous location ---
at DotNet.Testcontainers.Configurations.WaitStrategy.WaitUntilAsync(Func`1 wait, TimeSpan interval, TimeSpan timeout, Int32 retries, CancellationToken ct) in /_/src/Testcontainers/Configurations/WaitStrategies/WaitStrategy.cs:line 213
at DotNet.Testcontainers.Containers.DockerContainer.CheckReadinessAsync(IEnumerable`1 waitStrategies, CancellationToken ct) in /_/src/Testcontainers/Containers/DockerContainer.cs:line 664
at DotNet.Testcontainers.Containers.DockerContainer.UnsafeStartAsync(CancellationToken ct) in /_/src/Testcontainers/Containers/DockerContainer.cs:line 526
at DotNet.Testcontainers.Containers.DockerContainer.StartAsync(CancellationToken ct) in /_/src/Testcontainers/Containers/DockerContainer.cs:line 309
at UI.Tests.Hooks.TestRunHooks.BeforeTestRun(IObjectContainer objectContainer) in /home/runner/actions-runner/_work/Tests/UI.Tests/Hooks/TestRunHooks.cs:line 100
at Reqnroll.Bindings.AsyncMethodHelper.ConvertTaskOfT(Task task, Boolean getValue)
at Reqnroll.Bindings.BindingDelegateInvoker.InvokeDelegateAsync(Delegate bindingDelegate, Object[] invokeArgs, ExecutionContextHolder executionContext)
at Reqnroll.Bindings.BindingInvoker.InvokeBindingAsync(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, DurationHolder durationHolder)
at Reqnroll.Infrastructure.TestExecutionEngine.InvokeHookAsync(IAsyncBindingInvoker invoker, IHookBinding hookBinding, HookType hookType)
at Reqnroll.Infrastructure.TestExecutionEngine.FireEventsAsync(HookType hookType)
at Reqnroll.Infrastructure.TestExecutionEngine.FireEventsAsync(HookType hookType)
at Reqnroll.Infrastructure.TestExecutionEngine.OnTestRunStartAsync()
at Reqnroll.TestRunner.OnTestRunStartAsync()
at Reqnroll.TestRunnerManager.FireTestRunStartAsync()
at Reqnroll.TestRunnerManager.OnTestRunStartAsync(Assembly testAssembly, IContainerBuilder containerBuilder)
at UI_Tests_NUnitAssemblyHooks.AssemblyInitializeAsync() in /home/runner/actions-runner/_work/Tests/UI.Tests/obj/Release/net9.0/NUnit.AssemblyHooks.cs:line 18
at NUnit.Framework.Internal.TaskAwaitAdapter.GenericAdapter`1.BlockUntilCompleted()
at NUnit.Framework.Internal.MessagePumpStrategy.NoMessagePumpStrategy.WaitForCompletion(AwaitAdapter awaiter)
at NUnit.Framework.Internal.AsyncToSyncAdapter.Await[TResult](TestExecutionContext context, Func`1 invoke)
at NUnit.Framework.Internal.AsyncToSyncAdapter.Await(TestExecutionContext context, Func`1 invoke)
at NUnit.Framework.Internal.Commands.SetUpTearDownItem.RunSetUpOrTearDownMethod(TestExecutionContext context, IMethodInfo method)
at NUnit.Framework.Internal.Commands.SetUpTearDownItem.RunSetUp(TestExecutionContext context)
at NUnit.Framework.Internal.Commands.OneTimeSetUpCommand.c__DisplayClass0_0.b__0(TestExecutionContext context)
at NUnit.Framework.Internal.Commands.BeforeTestCommand.Execute(TestExecutionContext context)
at NUnit.Framework.Internal.Execution.CompositeWorkItem.PerformOneTimeSetUp()
< /code>
Вот моя реализация: < /p>
namespace UI.Tests.Hooks
{
[Binding]
public class TestRunHooks
{
private static IContainer _mailDevContainer;
[BeforeTestRun]
public static async Task BeforeTestRun(IObjectContainer objectContainer)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables() // Load environment variables
.AddUserSecrets()
.Build();
objectContainer?.RegisterInstanceAs(configuration);
var baseLoggingDirectory = environmentConfiguration!.AreTestsExecutedOnRemoteServer!
? LoggingConfiguration.GetFileShareMainDirectory()
: LoggingConfiguration.GetSharedDriveMainDirectory();
var logger = new Logger(baseLoggingDirectory);
objectContainer?.RegisterInstanceAs(logger);
var smtpMailDevConfiguration = configuration.GetSection("SmtpMailDev").Get();
objectContainer?.RegisterInstanceAs(smtpMailDevConfiguration);
var playwrightConfiguration = configuration.GetSection("PlaywrightConfiguration").Get();
playwrightConfiguration.BrowserType = GetEnvironmentVariableOrDefault("PLAYWRIGHT_BROWSER_TYPE", playwrightConfiguration.BrowserType!);
objectContainer?.RegisterInstanceAs(playwrightConfiguration);
var httpClient = new HttpClient(GetTrustingHandler())
{
BaseAddress = new Uri(environmentConfiguration!.BaseUrl!)
};
objectContainer?.RegisterInstanceAs(httpClient, dispose: true);
var loggingConfiguration = configuration.GetSection("LoggingConfiguration").Get();
objectContainer?.RegisterInstanceAs(loggingConfiguration ?? new LoggingConfiguration());
var authorisationService = new AuthorisationService(httpClient, configuration, logger);
objectContainer?.RegisterInstanceAs(authorisationService);
objectContainer?.RegisterInstanceAs(new ApiResourceService(httpClient));
objectContainer?.RegisterInstanceAs(new UserService(httpClient, authorisationService));
objectContainer?.RegisterInstanceAs(new TwoFactorService(objectContainer.Resolve(),configuration));
var mailDevContainerBuilder = new ContainerBuilder()
.WithImage("maildev/maildev:latest")
.WithPortBinding(1080, 1080)
.WithPortBinding(1025, 1025)
.WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(1080));
if (smtpMailDevConfiguration.ReuseMailDevTestContainer)
{
mailDevContainerBuilder = mailDevContainerBuilder
.WithReuse(true)
.WithLabel("reuse-id", "maildev_test")
.WithCleanUp(false);
}
_mailDevContainer = mailDevContainerBuilder.Build();
await _mailDevContainer.StartAsync();
objectContainer?.RegisterInstanceAs(_mailDevContainer);
}
[AfterTestRun]
public static async Task AfterTestRun(ObjectContainer objectContainer)
{
var smtpMailDevConfiguration = objectContainer.Resolve();
if (!smtpMailDevConfiguration.ReuseMailDevTestContainer)
{
await _mailDevContainer.StopAsync();
await _mailDevContainer.DisposeAsync();
}
}
private static string GetEnvironmentVariableOrDefault(string variableName, string defaultValue)
{
var value = Environment.GetEnvironmentVariable(variableName);
return !string.IsNullOrEmpty(value) ? value : defaultValue;
}
private static bool GetEnvironmentVariableOrDefault(string variableName, bool defaultValue)
{
var value = Environment.GetEnvironmentVariable(variableName);
return bool.TryParse(value, out var result) ? result : defaultValue;
}
private static HttpClientHandler GetTrustingHandler()
{
var trustingHandler = new HttpClientHandler();
var proxyServer = Environment.GetEnvironmentVariable("http_proxy");
if (!string.IsNullOrEmpty(proxyServer))
{
var bypassList = Environment.GetEnvironmentVariable("no_proxy")?.Replace("*", ".*").Split(',');
var webProxy = new WebProxy(new Uri(proxyServer), true, bypassList);
trustingHandler.Proxy = webProxy;
trustingHandler.UseProxy = false;
}
trustingHandler.ServerCertificateCustomValidationCallback = CertValidationCallback!;
return trustingHandler;
}
private static bool CertValidationCallback(HttpRequestMessage requestMessage, X509Certificate2 cert, X509Chain chain, SslPolicyErrors policyErrors)
{
return policyErrors == SslPolicyErrors.None
|| (policyErrors == SslPolicyErrors.RemoteCertificateNameMismatch
&& !string.IsNullOrEmpty(cert!.Subject!)
&& (cert!.Subject!.Contains("xxxx.com") || cert!.Subject!.Contains("xxxx.com")));
}
}
}
< /code>
Ошибка, кажется, ссылается на строку кода, связанную с тем, когда я пытаюсь запустить TestContainer (await _mailDevContainer.StartAsync();Подробнее здесь: https://stackoverflow.com/questions/797 ... ict-respon