如何通过Jenkins API从测试报告中仅获取失败测试用例?
问题
如何获取Jenkins中已失败测试的相关信息?
我已经能通过以下命令获取完整测试报告:
curl jenkins.com/job/myjob/lastCompletedBuild/testReport/api/json
但测试列表过大时,不想先下载全量数据再本地过滤,希望在服务器端完成过滤。
查看Jenkins实例的API文档页面(jenkins.com/job/myjob/lastCompletedBuild/testReport/api)里的「控制获取数据量」章节,没有找到按值过滤数据的说明。
我尝试用以下命令获取部分字段,但仍会同时返回PASSED和FAILED测试,数据体积还是超出预期:
curl jenkins.com/job/myjob/lastCompletedBuild/testReport/api/json?tree=suites[cases[name,status]]
解决方案
Jenkins原生REST API的tree参数仅支持指定返回字段,不直接支持按值过滤,但有三种可行的服务器端过滤方案:
1. 用XPath参数过滤
Jenkins API支持通过xpath参数筛选结果,构造表达式只提取status为FAILED的测试用例:
XML格式结果
curl "jenkins.com/job/myjob/lastCompletedBuild/testReport/api/xml?xpath=//case[status='FAILED']&wrapper=failedTests"
JSON格式结果
如果需要JSON,可以在请求中添加json参数将XML结果转换:
curl "jenkins.com/job/myjob/lastCompletedBuild/testReport/api/json?xpath=//case[status='FAILED']&wrapper=failedTests"
注意:XPath过滤依赖Jenkins的XML API端点可用,需确保实例配置允许该访问方式。
2. 通过Groovy脚本控制台API过滤
利用Jenkins的脚本控制台API,直接在服务器端执行Groovy脚本提取失败测试数据,可自定义返回字段:
curl -X POST jenkins.com/scriptText --data-urlencode "script= def build = Jenkins.instance.getItemByFullName('myjob').getLastCompletedBuild() def testResult = build.getTestResult() def failedTests = [] testResult.getFailedTests().each { test -> failedTests.add([ name: test.getName(), status: test.getStatus().toString(), errorDetails: test.getErrorDetails() ]) } println new groovy.json.JsonBuilder(failedTests).toPrettyString() "
这种方式灵活性极强,适合需要自定义返回结构或复杂过滤规则的场景。
3. 安装插件扩展API
安装Filtered Test Result Plugin,该插件会为测试报告API添加过滤参数支持,安装后可直接通过URL指定过滤条件:
curl jenkins.com/job/myjob/lastCompletedBuild/testReport/api/json?status=FAILED
内容的提问来源于stack exchange,提问作者Moberg
相关产品推荐
相关产品推荐

