如何以编程方式运行MSTest?规避进程调用与NUnit迁移
编程式运行MSTest单元测试的可行方案
直接调用MSTest框架核心API
MSTest虽未在官方文档中明确说明编程式调用路径,但可通过其核心库实现进程内运行测试,无需依赖外部Process调用:
- 给服务项目引用与测试项目版本匹配的
Microsoft.VisualStudio.TestPlatform.TestFramework、Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions、Microsoft.TestPlatform.Core和Microsoft.TestPlatform.UtilitiesNuGet包 - 编写代码初始化测试引擎、加载测试集并应用runsettings配置:
using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Engine; using System.IO; using System.Collections.Generic; // 初始化测试引擎实例 var testEngine = TestEngine.CreateInstance(); var testRunSettings = new TestRunSettings(); // 加载本地runsettings配置文件 var runSettingsContent = File.ReadAllText("your-test-settings.runsettings"); testRunSettings.LoadSettingsXml(runSettingsContent); // 构建测试运行配置 var testConfig = new TestRunConfiguration { RunSettings = testRunSettings, TestAssemblyPaths = new List<string> { "Your.Tests.Library.dll" } }; // 获取测试运行器 var testRunner = testEngine.GetTestRunner(testConfig); // 订阅测试事件,用于收集指标数据 testRunner.TestRunStarted += (s, e) => { /* 记录测试启动时间 */ }; testRunner.TestResult += (s, e) => { var testResult = e.Result; // 这里可以将单个测试的结果(通过率、耗时、错误信息)写入指标系统 }; testRunner.TestRunCompleted += (s, e) => { var summary = e.RunSummary; // 汇总测试结果:总测试数、通过数、失败数、总耗时等,输出到你的指标服务 }; // 启动测试执行 testRunner.RunTests(testConfig);
Runsettings配置适配注意事项
- 常规的runsettings配置(如测试过滤器、超时设置)可通过
TestRunSettings.LoadSettingsXml直接加载,部分高级配置(如自定义代码覆盖率规则)可能需要手动映射到TestRunConfiguration的对应属性 - 若测试项目使用了自定义测试适配器,需通过
TestRunConfiguration.AdapterPaths指定适配器DLL路径,确保进程能加载到适配器
备选方案:调用TestPlatform CLI核心逻辑
如果直接使用核心API遇到兼容性问题,可通过Microsoft.TestPlatform.Client库在进程内调用测试平台的CLI逻辑,避免启动外部进程:
using Microsoft.VisualStudio.TestPlatform.Client; using Microsoft.VisualStudio.TestPlatform.ObjectModel; var testClient = new TestPlatformClient(); var testArgs = new List<string> { "--settings", "your-test-settings.runsettings", "--test-assembly", "Your.Tests.Library.dll" }; // 自定义日志收集器,实现ITestLogger接口接收测试结果 testClient.RegisterTestLogger(new CustomTestMetricsLogger()); testClient.RunTests(testArgs, new TestPlatformOptions());
需自行实现CustomTestMetricsLogger类,通过ITestLogger接口的方法捕获测试事件与结果,进而生成指标数据。
内容的提问来源于stack exchange,提问作者stan
相关产品推荐
相关产品推荐

