c# - 如何在开始 xUnit 测试之前启动 docker-compose 中指定的容器?

标签 c# visual-studio docker .net-core

我需要运行一系列依赖于多个 Docker 容器的 xUnit 测试。我更希望 xUnit 负责整个过程 - 启动容器(类似于 docker-compose env up),运行测试然后撕裂容器(即 docker-compose env down >).

Visual Studio 或 xUnit 是否支持这个或这个过程需要手动实现?

最佳答案

要在没有任何额外依赖项的情况下执行此操作,您可以使用 Process.Start 来模拟通过命令行启动。这是包装并提供此功能的类:

public class DockerStarter : IDisposable
{
    private const string DOCKER_COMPOSE = @"c:\Program Files\Docker\Docker\resources\bin\docker-compose.exe";
    public string ComposeFile { get; set; }
    public string WorkingDir { get; set; }

    public DockerStarter(string composeFile, string workingDir)
    {
        ComposeFile = composeFile;
        WorkingDir = workingDir;
    }

    public void Start()
    {
        var startInfo = generateInfo("up");
        _dockerProcess = Process.Start(startInfo);
        // TODO: Find better way to wait for Docker containers to start
        Thread.Sleep(1000);
    }

    private Process _dockerProcess;

    public void Dispose()
    {
        _dockerProcess.Close();

        var stopInfo = generateInfo("down");
        var stop = Process.Start(stopInfo);
        stop.WaitForExit();
    }

    private ProcessStartInfo generateInfo(string argument)
    {
        var procInfo = new ProcessStartInfo
        {
            FileName = DOCKER_COMPOSE,
            Arguments = $"-f {ComposeFile} {argument}",
            WorkingDirectory = WorkingDir
        };
        return procInfo;
    }
}

显然这种方法有缺点:

  • docker-compose 可执行文件的固定路径
  • 手动等待容器启动

我会看看是否有更好的方法直接与 Docker 守护进程交互并在可能的情况下更新答案。

关于c# - 如何在开始 xUnit 测试之前启动 docker-compose 中指定的容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50821909/

相关文章:

docker - 如何找出Docker运行执行最多消耗了多少RAM?

c# - 如何使用 C# 将所有特殊字符替换为字符串

c# - Windows Phone 8 设备可以用于测试使用 WP SDK 7.1 构建的应用程序吗

vim - Docker 容器与主机共享剪贴板

visual-studio - 如何在VS2013中静态链接MSVCP120.dll

c - 错误 C2011 : 'timezone' :'struct' type redefinition (postgres)

docker - 是否可以配置 docker-compose 以忽略其服务的错误并继续其他服务?

c# - 与 WinUI3 一起使用时,为什么 .NET 通用主机不停止?

c# - 通过过滤将列表<>添加到另一个列表<>

c# - 尝试使用 Codedom 生成代码时出错