如何通过TestRail API获取测试运行中失败用例的CaseID
解决TestRail API获取指定状态测试用例CaseID的问题
问题背景
需要通过TestRail API获取测试运行中状态为失败的测试用CaseID列表,同时希望实现:
- 直接用状态名称(如Pass、Failed、Untested)过滤
- 结果包含未测试的用例
之前尝试的命令:
curl -s -u $TESTRAIL_EMAIL:$TESTRAIL_PW -X GET "$TESTRAIL_URL/index.php?/api/v2/get_results_for_run/$TESTRAIL_RUN_ID" | jq 'group_by(.test_id) | map(max_by(.created_on))' | jq '[.[] | select(.status_id != 1)]'
(逻辑:获取测试运行的所有结果,按test_id分组保留最新结果,排除status_id=1的通过状态)
返回输出:
[ { "id": 966943, "test_id": 2559942, "status_id": null, "created_on": 1684909080, "assignedto_id": 531, "comment": null, "version": null, "elapsed": null, "defects": null, "created_by": 546, "custom_step_results": null, "attachment_ids": [] }, { "id": 967944, "test_id": 2559944, "status_id": 5, "created_on": 1684936836, "assignedto_id": null, "comment": null, "version": null, "elapsed": null, "defects": null, "created_by": 546, "custom_step_results": null, "attachment_ids": [] } ]
遇到的问题:
- 返回结果无测试用例的原始CaseID
- 未包含未测试(Untested)的用例
- 只能通过status_id过滤,无法直接使用状态名称
解决方案
1. 获取CaseID:改用get_tests接口
get_results_for_run返回的是测试结果记录,其中的test_id是测试运行中该用例的实例ID,并非原始CaseID。要获取原始CaseID,需调用get_tests接口,该接口会返回测试运行中所有用例实例的完整信息,包括case_id(原始用例ID)和当前status_id。
示例调用:
curl -s -u $TESTRAIL_EMAIL:$TESTRAIL_PW -X GET "$TESTRAIL_URL/index.php?/api/v2/get_tests/$TESTRAIL_RUN_ID"
2. 包含未测试用例
get_results_for_run仅返回已有测试结果的用例,未测试的用例不会出现在结果中。而get_tests接口会返回测试运行内的所有用例,包括未测试状态的条目(对应status_id需根据你的TestRail配置确认,默认Untested的ID为3)。
3. 用状态名称过滤:先获取状态ID映射
TestRail的状态ID支持自定义,因此需要先调用get_statuses接口获取系统中所有状态的ID与名称映射:
curl -s -u $TESTRAIL_EMAIL:$TESTRAIL_PW -X GET "$TESTRAIL_URL/index.php?/api/v2/get_statuses"
返回示例(精简版):
[ {"id":1,"name":"Passed"}, {"id":5,"name":"Failed"}, {"id":3,"name":"Untested"} ]
根据映射关系,即可通过状态名称间接筛选目标用例。
整合命令示例
获取所有Failed状态的CaseID列表
# 提取Failed状态对应的ID FAILED_STATUS_ID=$(curl -s -u $TESTRAIL_EMAIL:$TESTRAIL_PW -X GET "$TESTRAIL_URL/index.php?/api/v2/get_statuses" | jq '.[] | select(.name=="Failed") | .id') # 筛选Failed状态的用例,提取CaseID curl -s -u $TESTRAIL_EMAIL:$TESTRAIL_PW -X GET "$TESTRAIL_URL/index.php?/api/v2/get_tests/$TESTRAIL_RUN_ID" | jq --arg id "$FAILED_STATUS_ID" '[.[] | select(.status_id == ($id | tonumber)) | .case_id]'
获取Failed和Untested状态的CaseID列表
# 提取Failed和Untested对应的状态ID数组 STATUS_IDS=$(curl -s -u $TESTRAIL_EMAIL:$TESTRAIL_PW -X GET "$TESTRAIL_URL/index.php?/api/v2/get_statuses" | jq '[.[] | select(.name=="Failed" or .name=="Untested") | .id]') # 筛选符合状态的用例,提取CaseID curl -s -u $TESTRAIL_EMAIL:$TESTRAIL_PW -X GET "$TESTRAIL_URL/index.php?/api/v2/get_tests/$TESTRAIL_RUN_ID" | jq --argjson ids "$STATUS_IDS" '[.[] | select(.status_id | IN($ids[])) | .case_id]'
内容的提问来源于stack exchange,提问作者anandhu
相关产品推荐
相关产品推荐

