如何为NUnit生成的TestResults.xml中<test-case>设置classname属性(规避JENKINS-53349)
解决JENKINS-53349:NUnit参数化TestFixture在Jenkins测试结果中显示异常的问题
针对你遇到的Jenkins test-results-analyzer-plugin无法正确展示参数化TestFixture测试结果的问题(根源是TestResults.xml中<test-case>的classname属性未包含参数化类名),以下是几个可行的解决办法:
方法1:后处理TestResults.xml补全classname参数信息
直接在Jenkins构建流程中添加脚本,修改生成的TestResults.xml,给<test-case>的classname属性补上参数化信息。
示例Python脚本(跨平台)
import xml.etree.ElementTree as ET # 加载测试结果文件 tree = ET.parse('TestResults.xml') root = tree.getroot() # 遍历所有test-case节点 for test_case in root.findall('.//test-case'): test_name = test_case.get('name') # 从测试名称中提取参数(假设测试名格式为"TestMethod(参数值)") if '(' in test_name and ')' in test_name: param = test_name.split('(')[1].split(')')[0] original_classname = test_case.get('classname') # 拼接带参数的classname new_classname = f"{original_classname}({param})" test_case.set('classname', new_classname) # 保存修改后的文件 tree.write('TestResults.xml', encoding='utf-8', xml_declaration=True)
Jenkins配置步骤
- 在NUnit测试运行的步骤之后,添加一个「Execute shell」或「Execute Windows batch command」步骤
- 运行上述脚本(确保构建环境已安装Python)
- 让
test-results-analyzer-plugin读取修改后的TestResults.xml
方法2:修改测试代码,让NUnit生成带参数的classname
通过重写参数化TestFixture类的ToString()方法,让NUnit在生成测试结果时自动将参数信息纳入classname属性:
[TestFixture(1)] [TestFixture(2)] // 可添加更多参数化实例 public class ParametrizedTestFixture { private readonly int _testParam; public ParametrizedTestFixture(int testParam) { _testParam = testParam; } // 重写ToString,返回带参数的类名 public override string ToString() { return $"ParametrizedTestFixture({_testParam})"; } [Test] public void SampleTestMethod1() { // 测试逻辑 } [Test] public void SampleTestMethod2() { // 测试逻辑 } }
重写后,NUnit生成的TestResults.xml中,<test-case>的classname会包含参数信息,让test-results-analyzer-plugin可以正确识别每条测试实例。
方法3:替换为Jenkins官方NUnit插件
如果不想修改代码或XML文件,可以替换test-results-analyzer-plugin为Jenkins官方的NUnit Plugin。该插件对NUnit参数化测试的结果解析更原生,能够正确展示所有参数化测试实例的结果,无需额外配置。
内容的提问来源于stack exchange,提问作者Darkproduct
相关产品推荐
相关产品推荐

