如何通过junit.xml.ejs在JUnit XML报告中添加自定义属性test_key
解决方案:通过Nightwatch自定义属性+EJS模板修改实现test_key注入
1. 定义测试用例的test_key来源
你有两种灵活的方式指定test_key的值:
方式一:从测试用例名称自动提取(推荐,无需大幅修改现有测试结构)
先统一测试用例的命名格式,比如要求所有测试用例名称以TEST-XXX开头(例如TEST-123: 验证登录功能),后续在EJS模板里通过正则规则提取这部分标识。方式二:显式给测试用例添加自定义属性
修改测试用例的定义结构,给目标测试对象添加testKey属性,示例代码如下:module.exports = { // 常规测试用例,后续从名称自动提取test_key 'TEST-123: 验证用户登录流程': function(browser) { browser.url('/login') .setValue('#username', 'testuser') .setValue('#password', 'testpass') .click('#submit') .assert.titleContains('首页') .end(); }, // 显式指定testKey的测试用例 '验证用户登出流程': { testKey: 'TEST-456', command: function(browser) { browser.click('#logout') .assert.titleContains('登录页') .end(); } } };
2. 修改junit.xml.ejs模板添加test_key属性
打开你已有的junit.xml.ejs文件,找到<testcase>节点的定义代码,添加test_key属性,并根据你选择的方式注入对应值:
针对方式一(从名称提取):
在模板中添加提取逻辑,再将结果注入到属性中:
<% // 定义提取test_key的函数,可根据你的实际命名规则调整正则 function getTestKey(testName) { const keyMatch = testName.match(/^TEST-\d+/); // 如果匹配不到,返回空字符串或者自定义默认值 return keyMatch ? keyMatch[0] : ''; } %> <!-- 修改原有testcase节点,新增test_key属性 --> <testcase classname="<%= suiteName %>" name="<%= testName %>" time="<%= testDuration %>" test_key="<%= getTestKey(testName) %>" > <!-- 原有错误、跳过等节点逻辑保持不变 --> <% if (test.errors.length) { %> <error message="<%= test.errors[0].message %>"><%= test.errors[0].stack %></error> <% } %> <% if (test.failed) { %> <failure message="<%= test.failureMessage %>"><%= test.stackTrace %></failure> <% } %> <% if (test.skipped) { %> <skipped/> <% } %> </testcase>
针对方式二(显式自定义属性):
直接从测试用例对象中读取testKey,同时保留名称提取作为 fallback 方案:
<% function getTestKey(testName, testObj) { // 优先使用显式定义的testKey,否则从名称提取 return testObj.testKey || (testName.match(/^TEST-\d+/) || [''])[0]; } %> <testcase classname="<%= suiteName %>" name="<%= testName %>" time="<%= testDuration %>" test_key="<%= getTestKey(testName, test) %>" > <!-- 原有节点逻辑保持不变 --> </testcase>
3. 验证结果
运行CI/CD流水线中的Nightwatch测试任务,生成JUnit XML报告后,检查<testcase>节点是否已包含test_key属性,且值符合预期即可。
注意事项
- 若使用名称提取方式,必须严格统一测试用例的命名规范,否则正则无法准确匹配到目标标识;
- 不同版本的Nightwatch传递给EJS模板的
test对象结构可能略有差异,如果test.testKey无法获取,可以临时在模板中添加<%= JSON.stringify(test) %>调试,确认可用的属性字段; - 确保CI/CD环境中使用的Nightwatch版本支持自定义测试对象属性(v1.x及以上版本均支持该特性)。
内容的提问来源于stack exchange,提问作者Navya
相关产品推荐
相关产品推荐

