Я уже рассмотрел этот вопрос из других вопросов на этом сайте: < /p>
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();
) и для целей данного теста он должен быть подвергнут эксплуатации порта 1025/1080, так как это конкретный сервер электронной почты SMTP, который конкретно слушает эти порты, поскольку эти порты белые списки через брандмауэр моей компании (так что я не могу просто не так известно и указать номер порта).>
Я уже рассмотрел этот вопрос из других вопросов на этом сайте: < /p>
Docker API отвечает конфликтом кода состояния, контейнер xxxxxx не работает - Связано с mssqlbuilder < /li> testcontainer Чтобы Docker выпустил < /li> Участие в запуске тестирования Playwright .net внутри контейнера Docker - аналогично моим, но не так же, как я использую REQNROLL < /li> Тесты XUNIT, используя TestContainers, провальные в Github - попробовал это, не работал для меня < /li> < /ul> Получение: < /p> [code]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!);
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);
[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; }
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();[/code]) и для целей данного теста он должен быть подвергнут эксплуатации порта 1025/1080, так как это конкретный сервер электронной почты SMTP, который конкретно слушает эти порты, поскольку эти порты белые списки через брандмауэр моей компании (так что я не могу просто не так известно и [b] [/b] указать номер порта).>