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

如何将JUnit Pioneer @Issue注解信息添加至Gradle测试报告?

解决方案:将JUnit Pioneer @Issue注解信息集成到Gradle Test Report

核心思路

Gradle的Test任务支持通过自定义测试监听器捕获测试元数据,再通过修改测试描述或自定义报告模板两种方式,把@Issue注解的内容展示到HTML测试报告中。以下是两种可落地的方案:

方案一:轻量实现——修改测试名称携带Issue信息

无需改动报告模板,通过自定义TestListener读取@Issue注解,直接将Issue ID附加到测试用例的显示名称中:

test {
    useJUnitPlatform()
    
    def issueListener = new org.gradle.api.tasks.testing.TestListener() {
        @Override
        void beforeTest(org.gradle.api.tasks.testing.TestDescriptor descriptor) {
            try {
                // 反射获取测试方法的@Issue注解
                Class<?> testClass = Class.forName(descriptor.className)
                Method testMethod = testClass.getMethod(descriptor.name)
                org.junitpioneer.jupiter.Issue issueAnnotation = testMethod.getAnnotation(org.junitpioneer.jupiter.Issue.class)
                
                if (issueAnnotation != null) {
                    // 把Issue ID追加到测试名称末尾
                    descriptor.displayName = "${descriptor.displayName} [Issue: ${issueAnnotation.value()}]"
                }
            } catch (Exception e) {
                // 忽略反射异常,不影响测试执行
            }
        }

        @Override
        void afterTest(org.gradle.api.tasks.testing.TestDescriptor descriptor, org.gradle.api.tasks.testing.TestResult result) {}
        @Override
        void beforeSuite(org.gradle.api.tasks.testing.TestDescriptor descriptor) {}
        @Override
        void afterSuite(org.gradle.api.tasks.testing.TestDescriptor descriptor, org.gradle.api.tasks.testing.TestResult result) {}
    }
    
    addTestListener(issueListener)
}

执行测试后,HTML报告里的测试用例名称会自动带上[Issue: TY-5232]标记,直观对应任务ID。

方案二:自定义模板——单独区域展示Issue信息

如果希望在报告中专门开辟位置展示Issue信息,可通过自定义报告模板实现:

  1. 导出Gradle默认测试报告模板到项目目录:
mkdir -p src/test/resources/templates
cp $(gradle help --task test | grep -o '.*/test' | head -1)/templates/testReport.html src/test/resources/templates/
  1. 修改testReport.html模板,在测试用例展示区域添加Issue信息的渲染代码。比如找到测试名称的展示位置后,插入:
<!-- 示例:在测试名称下方添加Issue信息 -->
<div class="test-issue" style="margin-left: 1em; color: #666;">
  Issue: ${test.properties.issueId ?: 'N/A'}
</div>
  1. 在Gradle配置中通过TestListener将Issue注解值存入测试属性,并指定自定义模板:
test {
    useJUnitPlatform()
    
    addTestListener(new org.gradle.api.tasks.testing.TestListener() {
        @Override
        void beforeTest(org.gradle.api.tasks.testing.TestDescriptor descriptor) {
            try {
                Class<?> testClass = Class.forName(descriptor.className)
                Method testMethod = testClass.getMethod(descriptor.name)
                org.junitpioneer.jupiter.Issue issueAnnotation = testMethod.getAnnotation(org.junitpioneer.jupiter.Issue.class)
                
                if (issueAnnotation != null) {
                    // 将Issue ID存入测试属性,供模板读取
                    descriptor.properties['issueId'] = issueAnnotation.value()
                }
            } catch (Exception e) {}
        }

        @Override
        void afterTest(org.gradle.api.tasks.testing.TestDescriptor descriptor, org.gradle.api.tasks.testing.TestResult result) {}
        @Override
        void beforeSuite(org.gradle.api.tasks.testing.TestDescriptor descriptor) {}
        @Override
        void afterSuite(org.gradle.api.tasks.testing.TestDescriptor descriptor, org.gradle.api.tasks.testing.TestResult result) {}
    })
    
    // 指定自定义报告模板路径
    reports.html.templateLocation = file('src/test/resources/templates/testReport.html')
}

注意事项

  • 确保项目已引入JUnit Pioneer依赖,Gradle配置示例:
testImplementation 'org.junit-pioneer:junit-pioneer:2.0.0' // 替换为你使用的版本
  • 若测试为参数化测试,需调整反射获取方法的逻辑,通过参数类型匹配对应方法。

内容的提问来源于stack exchange,提问作者Semyon Kirekov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:27:03