如何在NUnit Test Engine运行期间获取测试执行日志
获取NUnit单测试执行日志的可行方案
针对你遇到的并行UI测试挂起、无法实时获取单测试执行日志的问题,提供以下几种解决思路:
1. 注册实时测试事件监听器
通过NUnit Test Engine的ITestEventListener接口,可以实时捕获每个测试的执行节点(开始、结束、跳过等),精准记录测试生命周期。
示例代码:
// 自定义事件监听器 public class TestExecutionTracker : ITestEventListener { public void OnTestEvent(string eventXml) { var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(eventXml); // 提取测试核心信息 var testCaseNode = xmlDoc.SelectSingleNode("//test-case"); if (testCaseNode == null) return; var fullName = testCaseNode.Attributes["fullname"]?.Value; var result = testCaseNode.Attributes["result"]?.Value; var startTime = testCaseNode.Attributes["start-time"]?.Value; var endTime = testCaseNode.Attributes["end-time"]?.Value; // 写入日志(建议用异步写入避免IO阻塞) var logContent = $"[{DateTime.Now:HH:mm:ss.fff}] 测试: {fullName} | 状态: {result ?? "执行中"} | 开始: {startTime} | 结束: {endTime}\n"; await File.AppendAllTextAsync("TestStepLogs.txt", logContent); } } // 在Runner中注册监听器 var testRunner = _package.CreateRunner(); testRunner.RegisterTestEventListener(new TestExecutionTracker()); testRunner.Run(null, TestFilter.Empty);
2. 捕获测试内自定义输出
在测试代码中用TestContext.WriteLine()输出关键步骤日志,再在Runner中开启输出捕获,结合事件监听器关联到对应测试:
先添加Runner设置:
_package.AddSetting(FrameworkPackageSettings.CaptureTestOutput, true);
之后在ITestEventListener的事件解析中,提取//test-case/output节点内容,就能拿到测试内的自定义步骤日志,便于定位挂起前的操作。
3. 修复InternalTrace的写入问题
你当前手动创建StreamWriter可能因文件锁定导致worker挂起,改用NUnit内置的路径设置自动管理日志:
_package.AddSetting(FrameworkPackageSettings.InternalTraceLevel, "Debug"); _package.AddSetting(FrameworkPackageSettings.InternalTracePath, "NunitInternalLogs.txt");
Debug级别会输出worker调度、测试启停的细节,有助于排查并行资源冲突。
4. 排查并行UI资源冲突
UI测试挂起多因并行执行时的资源竞争(如多worker操作同一浏览器实例、控件未释放),可先将NumberOfTestWorkers设为1验证是否是并行导致,再逐步增加数量结合日志定位冲突用例。
内容的提问来源于stack exchange,提问作者igor
相关产品推荐
相关产品推荐

