You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:43:28