You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TestContainers的xUnit测试在GitHub Actions中执行失败

解决GitHub Actions中Testcontainers容器未运行的问题

问题描述

我在C# xUnit测试项目中编写了集成测试,使用Testcontainers管理Docker容器中的依赖(如Postgres)。本地执行dotnet test时一切正常,容器可自动启停,但在GitHub Actions中每个测试都返回如下错误:

[xUnit.net 00:00:55.13]     IntegrationTests.MessageExchangeTests.TestLikeServiceSendsMessage [FAIL]
[xUnit.net 00:00:55.13]       Docker.DotNet.DockerApiException : Docker API responded with status code=Conflict, response={"message":"Container 46496d12b6c11c2c43edb96301bbfa1c9ddde217c0c54bb22e3a72ef8e479fb5 is not running"}

额外信息显示Docker连接正常:

[testcontainers.org 00:00:00.07] Connected to Docker:
  Host: unix:///var/run/docker.sock
  Server Version: 24.0.9
  Kernel Version: 6.5.0-1018-azure
  API Version: 1.43
  Operating System: Ubuntu 22.04.4 LTS
  Total Memory: 15.61 GB

我的GitHub Workflow配置如下:

name: .NET

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Setup .NET
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: 8.0.x

  test:
    name: Test
    runs-on: ubuntu-latest
    needs: build

  integration-test:
    name: Integration Test
    runs-on: ubuntu-latest
    needs: build
      
    steps:
      - uses: actions/checkout@v3
      - name: Setup .NET
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: 8.0.x

      - name: Check Docker version
        run: docker --version
      - name: Start Docker
        run: sudo service docker start
      - name: Restore dependencies for Integration Tests
        run: dotnet restore ./IntegrationTests
      - name: Build Integration Tests
        run: dotnet build ./IntegrationTests --no-restore
      - name: Run Integration Tests
        run: dotnet test ./IntegrationTests --no-build --verbosity normal

解决方案

1. 移除多余的Docker启动步骤

GitHub Actions的Ubuntu runner默认已启动Docker服务,执行sudo service docker start属于冗余操作,可能干扰现有Docker进程,直接删除该步骤即可。

2. 隔离测试并行执行的容器

xUnit默认并行运行测试,若多个测试类共享同一容器实例,易引发容器提前停止或冲突问题。可通过以下方式解决:

  • 为集成测试创建专属集合,强制串行执行:
    [CollectionDefinition("IntegrationTests")]
    public class IntegrationTestCollection : ICollectionFixture<TestContainerFixture>
    {
        // 无需实现方法,仅用于标记集合
    }
    
    然后在每个测试类上添加[Collection("IntegrationTests")]属性。
  • 为每个测试类创建独立容器实例,确保每个测试拥有独立的容器生命周期。

3. 延长容器启动超时时间

GitHub Actions环境通常比本地慢,Testcontainers默认启动超时可能不足。初始化容器时手动设置更长超时:

var postgresContainer = new PostgresBuilder()
    .WithImage("postgres:15")
    .WithStartupTimeout(TimeSpan.FromMinutes(2)) // 延长至2分钟
    .Build();

4. 输出容器日志排查启动失败原因

测试失败时输出容器日志,可快速定位问题。在Fixture的销毁阶段添加日志输出逻辑:

public async Task DisposeAsync()
{
    if (postgresContainer != null)
    {
        var logs = await postgresContainer.GetLogsAsync();
        Console.WriteLine("Postgres Container Logs:");
        Console.WriteLine(logs.Stdout);
        Console.WriteLine(logs.Stderr);
        await postgresContainer.StopAsync();
        await postgresContainer.DisposeAsync();
    }
}

5. 优化Workflow配置

  • 删除无实际步骤的test job,减少冗余。
  • 确保使用最新版本的Testcontainers NuGet包,规避已知兼容性问题。

内容的提问来源于stack exchange,提问作者Vercors

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:33:26