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

如何在C#应用内通过API调用运行MSTest项目所有测试?

在C#中运行MSTest项目的最佳方式及WebAPI触发方案

一、常规运行MSTest的最佳方式

  • Visual Studio测试资源管理器:开发阶段最便捷的选择——右键测试项目,选择「运行所有测试」,或者在测试资源管理器面板点击运行按钮,能实时查看测试结果,方便调试单例或全量测试。
  • dotnet test命令行:CI/CD流水线的标准方案,进入测试项目目录执行dotnet test,或指定项目路径如dotnet test ./MyTestProject/MyTestProject.csproj,支持生成TRX格式测试报告(加--logger trx参数),适配自动化场景。
  • VSTest.Console.exe:Visual Studio自带的命令行工具,适合复杂配置的测试运行,路径一般在C:\Program Files (x86)\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow,示例命令:vstest.console.exe ./MyTestProject/bin/Debug/net6.0/MyTestProject.dll,可自定义测试过滤器、日志规则等。

二、通过WebAPI触发测试的实现方案

虽然这种方式存在服务资源占用、环境一致性、安全隐患等风险,但如果要落地,可以按以下步骤实现:

1. 准备依赖与封装测试执行逻辑

先在WebAPI项目中安装NuGet包:Microsoft.TestPlatform.ObjectModel和Microsoft.TestPlatform.TestHost,版本需与你的MSTest测试项目版本匹配。

然后封装测试执行服务,利用MSTest编程接口触发测试:

using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging;

public class TestRunnerService
{
    public TestRunResult RunAllTests(string testDllPath)
    {
        var runResult = new TestRunResult();
        var logger = new TestConsoleLogger();

        var runner = new TestRunner();
        runner.Initialize(new TestRunSettings());

        var testSources = new List<string> { testDllPath };
        var runRequest = new TestRunRequest(testSources);

        runner.RunTests(runRequest, logger, result =>
        {
            runResult.Total = result.TotalTests;
            runResult.Passed = result.PassedTests;
            runResult.Failed = result.FailedTests;
            runResult.Skipped = result.SkippedTests;
            runResult.Details = result.TestResults.Select(tr => new TestCaseDetail
            {
                Name = tr.TestCase.DisplayName,
                Outcome = tr.Outcome.ToString(),
                Error = tr.ErrorMessage,
                Duration = tr.Duration.ToString()
            }).ToList();
        });

        return runResult;
    }
}

// 测试日志输出类
public class TestConsoleLogger : ITestLogger
{
    public void SendMessage(TestMessageLevel level, string message)
    {
        Console.WriteLine($"[{level}] {message}");
    }
}

// 测试结果DTO
public class TestRunResult
{
    public int Total { get; set; }
    public int Passed { get; set; }
    public int Failed { get; set; }
    public int Skipped { get; set; }
    public List<TestCaseDetail> Details { get; set; } = new();
}

public class TestCaseDetail
{
    public string Name { get; set; }
    public string Outcome { get; set; }
    public string Error { get; set; }
    public string Duration { get; set; }
}

2. 编写WebAPI触发接口

在控制器中添加测试触发接口,务必做好安全校验:

[ApiController]
[Route("api/tests")]
public class TestsController : ControllerBase
{
    private readonly TestRunnerService _testRunner;

    public TestsController(TestRunnerService testRunner)
    {
        _testRunner = testRunner;
    }

    [HttpPost("run-all")]
    [Authorize] // 必须添加身份验证,禁止匿名访问
    public IActionResult RunAllTests([FromQuery] string testDllPath)
    {
        // 校验路径合法性,防止路径遍历攻击
        if (!Path.IsPathRooted(testDllPath) || !System.IO.File.Exists(testDllPath))
        {
            return BadRequest("无效的测试DLL路径");
        }

        try
        {
            var result = _testRunner.RunAllTests(testDllPath);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"测试执行失败:{ex.Message}");
        }
    }
}

3. 关键注意事项

  • 权限控制:强制给接口添加身份验证(如JWT、OAuth2),避免恶意调用占用服务器资源。
  • 异步处理:测试运行可能耗时较长,建议用Hangfire等后台任务框架异步执行,返回任务ID让客户端轮询结果,避免API请求超时。
  • 环境对齐:确保WebAPI所在环境的配置(数据库连接、第三方服务地址等)与测试项目预期一致,否则会出现无意义的测试失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:26:39