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

为何我的C# API集成测试仅在Release模式运行,Debug模式失效?

Debug模式下C# API集成测试无故跳过,仅Release模式正常的排查与解决

我有一个C#测试项目,API集成测试仅在Configuration Manager设置为"Release"并以Release模式执行时才能成功运行,Debug模式下测试会无故跳过(如图所示)。
Debug模式下测试跳过

已完成的检查:

  • 确认没有#if DEBUG预处理指令影响测试执行
  • 两种配置(Debug/Release)的构建均无错误

相关代码

Custom.Api.IntegrationTests 中的基类工厂

public abstract class CustomWebApplicationFactory<TProgram> : WebApplicationFactory<TProgram> where TProgram : class
{
    public IConfigurationBuilder ConfigurationBuilder { get; set; }
    public IConfiguration Configuration { get; set; }

    protected CustomWebApplicationFactory()
    {
        var projectDir = Directory.GetCurrentDirectory();
        var configPath = Path.Combine(projectDir, "appsettings.test.common.json");

        ConfigurationBuilder = new ConfigurationBuilder()
            .AddJsonFile(configPath);
    }

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        var databaseSeedFileName = Configuration.GetValue<string>("DatabaseSettings:DBSeedFileName");
        var fullConnectionString = Configuration.GetValue<string>("DatabaseSettings:FullConnectionString");
        var toCreateConnectionString = Configuration.GetValue<string>("DatabaseSettings:ToCreateConnectionString");


        InitializeDatabase(databaseSeedFileName!, toCreateConnectionString);

        builder.ConfigureTestServices(services =>
        {
            services.RemoveAll(typeof(DbContextOptions<CalendarEntities>));

            services.AddMySql<CalendarEntities>(fullConnectionString, ServerVersion.AutoDetect(fullConnectionString));
        });
    }

    public CalendarEntities CreateDbContext()
    {
        var scope = Services.CreateScope();
        var db = scope.ServiceProvider.GetRequiredService<CalendarEntities>();
        return db;
    }

    private void InitializeDatabase(string databaseSeedFileName, string toCreateConnectionString)
    {
        using var connection = new MySqlConnection(toCreateConnectionString);

        connection.Open();

        var fullPath = Path.Combine(Directory.GetCurrentDirectory(), databaseSeedFileName);

        var script = File.ReadAllText(fullPath);

        using var command = new MySqlCommand(script, connection);
        command.ExecuteNonQuery();
    }
}

Calendar.Api.IntegrationTests 中的实现类与测试用例

public class ApiWebApplicationFactory : CustomWebApplicationFactory<Program>
{
    public ApiWebApplicationFactory()
    {
        var projectDir = Directory.GetCurrentDirectory();
        var configPath = Path.Combine(projectDir, "appsettings.test.json");

        ConfigurationBuilder
            .AddJsonFile(configPath, optional: false);

        Configuration = ConfigurationBuilder.Build();
    }

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        base.ConfigureWebHost(builder);

        builder.ConfigureServices(services =>
        {
            services.AddOptions();

            services.AddHttpClient<IApiLoginHelper, ApiLoginHelper>();

            services.Configure<PathSettings>(Configuration.GetSection(nameof(PathSettings)));
            services.Configure<TokenRequestSettings>(Configuration.GetSection(nameof(TokenRequestSettings)));
        });
    }
}


public class UsersControllerTestsWithAuth : IClassFixture<ApiIntegrationTestContext>
{
    private readonly ApiIntegrationTestContext _fixture;
    private readonly IApiLoginHelper _apiLoginHelper;
    private readonly PathSettings _pathSettings;

    public UsersControllerTestsWithAuth(
        ApiIntegrationTestContext fixture)
    {
        _fixture = fixture;

        using var scope = _fixture.Factory.Services.CreateScope();
        _pathSettings = scope.ServiceProvider.GetRequiredService<IOptions<PathSettings>>().Value;
        _apiLoginHelper = new ApiLoginHelper(scope, _pathSettings.BaseApiUrl);

    }

    [Theory]
    [ClassData(typeof(CreateAsyncTheoryDataWithValidationErrors))]
    public async Task CreateAsync_Should_Return_Validation_Errors(UserToAdd newUser, List<ValidationDto> expectedResults)
    {
        Assert.True(true);
    }
}

排查与解决建议

1. 检查测试配置文件的复制属性

测试依赖appsettings.test.common.json和appsettings.test.json,Debug模式下可能出现:

  • 配置文件未设置为复制到输出目录(右键文件→属性→复制到输出目录:选择"始终复制"或"如果较新则复制")
  • Directory.GetCurrentDirectory()在Debug模式下返回的路径与Release不同,导致找不到配置文件,初始化时抛出未捕获异常,测试框架直接跳过测试

可在构造函数中添加断点或日志,确认配置文件路径是否正确,Configuration.Build()是否成功。

2. 验证Theory测试的数据供给

[Theory]测试如果没有可用的测试数据会被自动跳过:

  • 检查CreateAsyncTheoryDataWithValidationErrors类,确认Debug模式下是否生成了有效数据集合
  • 临时替换为[Fact]测试,验证测试本身是否能在Debug模式下执行

3. 排查数据库初始化的异常

InitializeDatabase方法在Debug模式下可能因连接问题、脚本执行失败抛出异常,导致测试启动失败:

  • 确认Debug模式下的数据库连接字符串是否正确,数据库服务是否可访问
  • 检查种子脚本文件在Debug输出目录中是否存在,添加try-catch块捕获并输出异常信息
  • 启动测试时附加调试器,查看初始化过程中是否有异常抛出

4. 检查测试类的实例化逻辑

Debug模式下服务初始化失败会导致测试类无法实例化,进而测试被跳过:

  • 确认ApiIntegrationTestContext在Debug模式下是否正确初始化ApiWebApplicationFactory
  • 检查ApiLoginHelper的构造逻辑,确认Debug模式下是否存在初始化异常

5. 检查测试框架的运行配置

  • 在Visual Studio测试资源管理器中,取消可能存在的测试筛选器,确保Debug模式下测试被包含
  • 进入测试项目属性→调试,确认启动程序为测试运行器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:47:32