Files
effekt-interface/resources/automation_api_doc.md
2026-05-11 14:29:16 +08:00

593 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 自动化执行接口文档
## 1. 基础说明
- 接口前缀:`/it/api`
- 鉴权方式:沿用现有登录鉴权,前端请求需携带 token
- 返回格式:沿用现有项目统一返回结构
### 成功返回示例
```json
{
"code": 20000,
"msg": "success",
"data": {}
}
```
### 失败返回示例
```json
{
"code": 40009,
"msg": "参数错误",
"data": null
}
```
***
## 2. 状态枚举
### 2.1 执行主单状态 `status`
| 值 | 含义 |
| - | ---- |
| 0 | 待触发 |
| 1 | 触发中 |
| 2 | 排队中 |
| 3 | 执行中 |
| 4 | 成功 |
| 5 | 失败 |
| 6 | 已取消 |
| 7 | 触发失败 |
| 8 | 回调异常 |
### 2.2 执行明细状态 `status`
| 值 | 含义 |
| - | --- |
| 0 | 待执行 |
| 1 | 执行中 |
| 2 | 通过 |
| 3 | 失败 |
| 4 | 阻塞 |
| 5 | 跳过 |
| 6 | 未找到 |
| 7 | 已取消 |
### 2.3 触发类型 `trigger_type`
| 值 | 含义 |
| - | ---- |
| 1 | 单条执行 |
| 2 | 计划执行 |
### 2.4 执行模式 `run_mode`
| 值 | 含义 |
| - | -- |
| 1 | 串行 |
| 2 | 并行 |
***
## 3. 接口清单
| 接口 | 方法 | 说明 |
| --------------------------------- | ---- | --------- |
| `/automation/case/run` | POST | 单条自动化用例执行 |
| `/automation/plan/run` | POST | 计划自动化用例执行 |
| `/automation/execution/list` | GET | 自动化执行记录列表 |
| `/automation/execution/detail` | GET | 自动化执行详情 |
| `/automation/execution/case/list` | GET | 自动化执行明细列表 |
> 以下接口为 Jenkins / pytest 内部调用,前端无需接入:
>
> - `/automation/execution/case/pull`
> - `/automation/execution/queued`
> - `/automation/execution/start`
> - `/automation/execution/case/result`
> - `/automation/execution/finish`
> - `/automation/execution/abort`
***
## 4. 单条自动化用例执行
### 接口
- 方法:`POST`
- 路径:`/it/api/automation/case/run`
### 请求体
```json
{
"caseId": 1001,
"envCode": "st",
"runMode": 1,
"jenkinsJobName": "pytest-auto-runner",
"remark": "前端手动触发"
}
```
### 请求参数说明
| 字段 | 类型 | 必填 | 说明 |
| -------------- | ------ | -- | ----------------------- |
| caseId | number | 是 | 功能用例 ID也是自动化桥梁 ID |
| envCode | string | 是 | 执行环境编码 |
| runMode | number | 否 | 执行模式1串行2并行默认1 |
| jenkinsJobName | string | 否 | 指定 Jenkins Job不传走后端默认值 |
| remark | string | 否 | 触发备注 |
### 成功返回示例
```json
{
"code": 20000,
"msg": "success",
"data": {
"id": 12,
"execution_no": "AE20250920153000123",
"trigger_type": 1,
"project_id": 3,
"plan_id": null,
"plan_round_no": null,
"source_case_id": 1001,
"env_code": "st",
"run_mode": 1,
"status": 2,
"jenkins_job_name": "pytest-auto-runner",
"jenkins_queue_id": 321,
"jenkins_build_number": null,
"jenkins_build_url": null,
"console_url": null,
"report_url": null,
"total_count": 1,
"pending_count": 1,
"running_count": 0,
"passed_count": 0,
"failed_count": 0,
"blocked_count": 0,
"skipped_count": 0,
"not_found_count": 0,
"trigger_by": 8,
"trigger_source": "platform",
"trigger_message": "http://jenkins/queue/item/321/",
"start_time": null,
"end_time": null,
"duration_seconds": null,
"ext": {},
"created_time": "2025-09-20 15:30:00",
"updated_time": "2025-09-20 15:30:01"
}
}
```
### 失败返回示例
```json
{
"code": 40009,
"msg": "caseId、envCode 为必传参数",
"data": null
}
```
```json
{
"code": 40009,
"msg": "该用例不存在或未接入自动化",
"data": null
}
```
***
## 5. 计划自动化用例执行
### 接口
- 方法:`POST`
- 路径:`/it/api/automation/plan/run`
### 请求体:执行计划下全部自动化用例
```json
{
"planId": 2001,
"envCode": "st",
"runMode": 1,
"roundNo": 1,
"jenkinsJobName": "pytest-auto-runner",
"remark": "执行计划自动化"
}
```
### 请求体:执行计划下指定用例
```json
{
"planId": 2001,
"envCode": "st",
"runMode": 1,
"roundNo": 1,
"caseIds": [1001, 1002, 1003],
"jenkinsJobName": "pytest-auto-runner",
"remark": "只执行勾选用例"
}
```
### 请求参数说明
| 字段 | 类型 | 必填 | 说明 |
| -------------- | --------- | -- | ------------------------------- |
| planId | number | 是 | 测试计划 ID |
| envCode | string | 是 | 执行环境编码 |
| runMode | number | 否 | 执行模式1串行2并行默认1 |
| roundNo | number | 否 | 指定计划轮次 |
| caseIds | number\[] | 否 | 指定执行的功能用例 ID 列表;不传则执行计划下全部自动化用例 |
| jenkinsJobName | string | 否 | 指定 Jenkins Job |
| remark | string | 否 | 触发备注 |
### 成功返回示例
```json
{
"code": 20000,
"msg": "success",
"data": {
"id": 13,
"execution_no": "AE20250920153500123",
"trigger_type": 2,
"project_id": 3,
"plan_id": 2001,
"plan_round_no": 1,
"source_case_id": null,
"env_code": "st",
"run_mode": 1,
"status": 2,
"jenkins_job_name": "pytest-auto-runner",
"jenkins_queue_id": 322,
"total_count": 10,
"pending_count": 10,
"running_count": 0,
"passed_count": 0,
"failed_count": 0,
"blocked_count": 0,
"skipped_count": 0,
"not_found_count": 0
}
}
```
### 失败返回示例
```json
{
"code": 40009,
"msg": "planId、envCode 为必传参数",
"data": null
}
```
```json
{
"code": 40009,
"msg": "计划下无可执行自动化用例",
"data": null
}
```
***
## 6. 自动化执行记录列表
### 接口
- 方法:`GET`
- 路径:`/it/api/automation/execution/list`
### Query 参数
| 字段 | 类型 | 必填 | 说明 |
| ----------- | ------ | -- | --------------- |
| pageNo | number | 否 | 页码默认1 |
| pageSize | number | 否 | 每页数量默认20 |
| projectId | number | 否 | 按项目过滤 |
| planId | number | 否 | 按计划过滤 |
| status | number | 否 | 按执行主单状态过滤 |
| triggerType | number | 否 | 按触发类型过滤1单条2计划 |
### 请求示例
```http
GET /it/api/automation/execution/list?pageNo=1&pageSize=20&planId=2001
```
### 成功返回示例
```json
{
"code": 20000,
"msg": "success",
"data": {
"list": [
{
"id": 13,
"execution_no": "AE20250920153500123",
"trigger_type": 2,
"project_id": 3,
"plan_id": 2001,
"plan_round_no": 1,
"source_case_id": null,
"env_code": "st",
"run_mode": 1,
"status": 3,
"jenkins_job_name": "pytest-auto-runner",
"jenkins_queue_id": 322,
"jenkins_build_number": 108,
"jenkins_build_url": "http://jenkins/job/pytest-auto-runner/108/",
"console_url": "http://jenkins/job/pytest-auto-runner/108/console",
"report_url": "http://allure/report/108",
"total_count": 10,
"pending_count": 3,
"running_count": 2,
"passed_count": 4,
"failed_count": 1,
"blocked_count": 0,
"skipped_count": 0,
"not_found_count": 0,
"trigger_by": 8,
"trigger_source": "platform",
"trigger_message": "",
"start_time": "2025-09-20 15:36:00",
"end_time": null,
"duration_seconds": null,
"ext": {},
"created_time": "2025-09-20 15:35:00",
"updated_time": "2025-09-20 15:38:20"
}
],
"total": 1
}
}
```
***
## 7. 自动化执行详情
### 接口
- 方法:`GET`
- 路径:`/it/api/automation/execution/detail`
### Query 参数
| 字段 | 类型 | 必填 | 说明 |
| ----------- | ------ | -- | ------- |
| executionId | number | 是 | 执行主单 ID |
### 请求示例
```http
GET /it/api/automation/execution/detail?executionId=13
```
### 成功返回示例
```json
{
"code": 20000,
"msg": "success",
"data": {
"id": 13,
"execution_no": "AE20250920153500123",
"trigger_type": 2,
"project_id": 3,
"plan_id": 2001,
"plan_round_no": 1,
"source_case_id": null,
"env_code": "st",
"run_mode": 1,
"status": 4,
"jenkins_job_name": "pytest-auto-runner",
"jenkins_queue_id": 322,
"jenkins_build_number": 108,
"jenkins_build_url": "http://jenkins/job/pytest-auto-runner/108/",
"console_url": "http://jenkins/job/pytest-auto-runner/108/console",
"report_url": "http://allure/report/108",
"total_count": 10,
"pending_count": 0,
"running_count": 0,
"passed_count": 9,
"failed_count": 1,
"blocked_count": 0,
"skipped_count": 0,
"not_found_count": 0,
"trigger_by": 8,
"trigger_source": "platform",
"trigger_message": "",
"start_time": "2025-09-20 15:36:00",
"end_time": "2025-09-20 15:45:00",
"duration_seconds": 540,
"ext": {},
"created_time": "2025-09-20 15:35:00",
"updated_time": "2025-09-20 15:45:00",
"summary": {
"total": 10,
"pending": 0,
"running": 0,
"passed": 9,
"failed": 1,
"blocked": 0,
"skipped": 0,
"notFound": 0,
"canceled": 0
}
}
}
```
### 失败返回示例
```json
{
"code": 40011,
"msg": "executionId 为必传参数",
"data": null
}
```
***
## 8. 自动化执行明细列表
### 接口
- 方法:`GET`
- 路径:`/it/api/automation/execution/case/list`
### Query 参数
| 字段 | 类型 | 必填 | 说明 |
| ----------- | ------ | -- | --------- |
| executionId | number | 是 | 执行主单 ID |
| status | number | 否 | 按执行明细状态过滤 |
| pageNo | number | 否 | 页码默认1 |
| pageSize | number | 否 | 每页数量默认20 |
### 请求示例
```http
GET /it/api/automation/execution/case/list?executionId=13&pageNo=1&pageSize=100
```
### 成功返回示例
```json
{
"code": 20000,
"msg": "success",
"data": {
"list": [
{
"id": 101,
"execution_id": 13,
"plan_case_id": 5001,
"case_id": 1001,
"case_key": "1001",
"case_title": "订单创建成功",
"run_order": 1,
"status": 2,
"pytest_nodeid": "tests/order/test_create_order.py::test_create_order",
"result_message": "执行通过",
"error_message": "",
"stack_trace": "",
"report_url": "http://allure/case/101",
"duration_seconds": 18,
"started_time": "2025-09-20 15:36:02",
"finished_time": "2025-09-20 15:36:20",
"retry_count": 0,
"ext": {},
"created_time": "2025-09-20 15:35:00",
"updated_time": "2025-09-20 15:36:20"
},
{
"id": 102,
"execution_id": 13,
"plan_case_id": 5002,
"case_id": 1002,
"case_key": "1002",
"case_title": "订单取消失败提示正确",
"run_order": 2,
"status": 3,
"pytest_nodeid": "tests/order/test_cancel_order.py::test_cancel_order",
"result_message": "断言失败",
"error_message": "AssertionError: xxx",
"stack_trace": "Traceback ...",
"report_url": "http://allure/case/102",
"duration_seconds": 12,
"started_time": "2025-09-20 15:36:21",
"finished_time": "2025-09-20 15:36:33",
"retry_count": 0,
"ext": {},
"created_time": "2025-09-20 15:35:00",
"updated_time": "2025-09-20 15:36:33"
}
],
"total": 10
}
}
```
### 失败返回示例
```json
{
"code": 40011,
"msg": "executionId 为必传参数",
"data": null
}
```
***
## 9. 前端接入建议
### 9.1 单条执行
- 页面位置:功能用例列表页 / 详情页
- 按钮:`执行自动化`
- 调用接口:`POST /automation/case/run`
- 成功后拿返回 `data.id` 作为 `executionId`
- 再调用:
- `GET /automation/execution/detail`
- `GET /automation/execution/case/list`
### 9.2 计划执行
- 页面位置:测试计划详情页
- 按钮:`执行自动化用例`
- 调用接口:`POST /automation/plan/run`
- 支持:
- 执行全部自动化用例
- 执行勾选用例(传 `caseIds`
### 9.3 轮询建议
执行为异步触发,前端建议轮询:
- `GET /automation/execution/detail?executionId=xx`
- `GET /automation/execution/case/list?executionId=xx&pageNo=1&pageSize=100`
轮询频率建议:
- 执行中:每 3\~5 秒 1 次
- 终态停止轮询
主单终态:
- `4 成功`
- `5 失败`
- `6 已取消`
- `7 触发失败`
- `8 回调异常`
***
## 10. 备注
1. 返回字段命名为下划线风格,如:
- `execution_no`
- `project_id`
- `created_time`
2. `summary` 仅在执行详情接口返回:
- `/automation/execution/detail`
3. `report_url``console_url` 在刚触发时可能为空,待 Jenkins / pytest 回调后更新。