.NET Core编程运行NUnit测试报错及TestCaseSource相关问题咨询
问题1:RemoteTestRunner加载测试程序集报错
异常原因
你当前使用的RemoteTestRunner属于NUnit V2版本的执行API,该版本仅适配.NET Framework,依赖.NET Framework专属的Remoting通信组件。而System.Runtime.Remoting.Messaging.ILogicalThreadAffinative是Remoting组件的专属类型,.NET Core/.NET 5+已经完全移除了Remoting相关实现,所以加载时会抛出类型找不到的异常。
解决方案
弃用NUnit V2的API,改用适配.NET Core的NUnit 3 Engine组件,操作步骤如下:
- 给Web API项目安装
NUnit.EngineNuGet包 - 替换原有执行逻辑,示例代码如下:
using NUnit.Engine; using System.Xml; [HttpPost] [Route("/api/TestSuiteRun/Run")] public IActionResult RunTestSuite([FromBody] AutomationAPI.Models.TestSuite testSuite) { try { // 初始化NUnit引擎 using ITestEngine testEngine = TestEngineActivator.CreateInstance(); // 构造测试包,支持传入多个测试dll路径 var testPackage = new TestPackage(@"C:\Desktop\Automation-v2\Automation-v2\bin\Debug\netcoreapp3.1\Automation-v2.dll"); // 可选配置:指定单线程运行、筛选要执行的测试名称等 testPackage.AddSetting("NumberOfTestWorkers", 1); // 构造测试过滤器,只运行传入的测试名称集合 var testFilterBuilder = new TestFilterBuilder(); foreach (var testName in testSuite.TestNames) { testFilterBuilder.Include(testName); } using var testRunner = testEngine.GetRunner(testPackage); // 执行测试,返回XML格式的结果 XmlNode testResult = testRunner.Run(null, testFilterBuilder.GetFilter()); // 这里可自行解析XML结果,转换为业务需要的返回结构 return Ok(testResult.OuterXml); } catch (Exception ex) { Console.WriteLine(ex.Message); return StatusCode(500, ex.Message); } }
额外注意事项
- Web API进程需要有测试dll所在目录的读取权限,以及Playwright浏览器驱动的执行权限
- 测试项目的Serilog、Playwright配置要确保能在Web API的进程上下文正常加载,避免运行时初始化失败
问题2:RemoteTestRunner是否支持动态传递TestCaseSource参数
不支持。TestCaseSource的数据源是在测试用例发现阶段(也就是测试dll被加载、Runner枚举所有测试用例的时候)就已经从代码定义的提供类中读取完成,完全依赖测试程序集编译时的静态定义,无法在运行时通过Runner动态传入替换。
如果需要动态传入测试参数,可改用如下实现方式:
- 测试用例执行时主动读取上下文的参数(比如存到进程内缓存、配置文件、数据库中)
- 改用NUnit的动态参数构造方式,在测试代码中实现运行时参数读取逻辑
内容的提问来源于stack exchange,提问作者therealsowho
相关产品推荐
相关产品推荐

