提交所有代码到 qiaoxinjiu 分支
This commit is contained in:
592
resources/automation_api_doc.md
Normal file
592
resources/automation_api_doc.md
Normal file
@@ -0,0 +1,592 @@
|
||||
# 自动化执行接口文档
|
||||
|
||||
## 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 回调后更新。
|
||||
|
||||
177
resources/sql/automation_execution_pgsql.sql
Normal file
177
resources/sql/automation_execution_pgsql.sql
Normal file
@@ -0,0 +1,177 @@
|
||||
-- 自动化执行建表脚本(PostgreSQL)
|
||||
-- 说明:
|
||||
-- 1. 本脚本为可直接执行脚本。
|
||||
-- 2. 使用 PostgreSQL 标准 COMMENT ON 语法为表和字段添加注释。
|
||||
-- 3. 当前脚本仅创建自动化执行主表、执行明细表、索引、更新时间触发器。
|
||||
-- 4. 如需外键约束,请根据你当前库中的 test_plan / test_case / plan_case 实际表名补充。
|
||||
|
||||
BEGIN;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.auto_execution (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
execution_no VARCHAR(64) NOT NULL,
|
||||
trigger_type SMALLINT NOT NULL,
|
||||
project_id BIGINT NOT NULL,
|
||||
plan_id BIGINT NULL,
|
||||
plan_round_no INTEGER NULL,
|
||||
source_case_id BIGINT NULL,
|
||||
env_code VARCHAR(32) NOT NULL,
|
||||
run_mode SMALLINT NOT NULL DEFAULT 1,
|
||||
status SMALLINT NOT NULL DEFAULT 0,
|
||||
jenkins_job_name VARCHAR(128) NULL,
|
||||
jenkins_queue_id BIGINT NULL,
|
||||
jenkins_build_number BIGINT NULL,
|
||||
jenkins_build_url VARCHAR(512) NULL,
|
||||
console_url VARCHAR(512) NULL,
|
||||
report_url VARCHAR(512) NULL,
|
||||
total_count INTEGER NOT NULL DEFAULT 0,
|
||||
pending_count INTEGER NOT NULL DEFAULT 0,
|
||||
running_count INTEGER NOT NULL DEFAULT 0,
|
||||
passed_count INTEGER NOT NULL DEFAULT 0,
|
||||
failed_count INTEGER NOT NULL DEFAULT 0,
|
||||
blocked_count INTEGER NOT NULL DEFAULT 0,
|
||||
skipped_count INTEGER NOT NULL DEFAULT 0,
|
||||
not_found_count INTEGER NOT NULL DEFAULT 0,
|
||||
trigger_by BIGINT NULL,
|
||||
trigger_source VARCHAR(32) NOT NULL DEFAULT 'platform',
|
||||
trigger_message TEXT NULL,
|
||||
start_time TIMESTAMP NULL,
|
||||
end_time TIMESTAMP NULL,
|
||||
duration_seconds INTEGER NULL,
|
||||
callback_token VARCHAR(128) NULL,
|
||||
ext JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||
created_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT uk_auto_execution_no UNIQUE (execution_no)
|
||||
);
|
||||
|
||||
COMMENT ON TABLE public.auto_execution IS '自动化执行主表';
|
||||
COMMENT ON COLUMN public.auto_execution.id IS '主键ID';
|
||||
COMMENT ON COLUMN public.auto_execution.execution_no IS '执行编号,平台生成,唯一';
|
||||
COMMENT ON COLUMN public.auto_execution.trigger_type IS '触发类型:1-单条执行,2-计划执行';
|
||||
COMMENT ON COLUMN public.auto_execution.project_id IS '项目ID';
|
||||
COMMENT ON COLUMN public.auto_execution.plan_id IS '计划ID,单条执行时可为空';
|
||||
COMMENT ON COLUMN public.auto_execution.plan_round_no IS '计划轮次快照';
|
||||
COMMENT ON COLUMN public.auto_execution.source_case_id IS '单条执行时的来源功能用例 case_id';
|
||||
COMMENT ON COLUMN public.auto_execution.env_code IS '执行环境编码,如 test/uat/prod-pre';
|
||||
COMMENT ON COLUMN public.auto_execution.run_mode IS '执行模式:1-串行,2-并行';
|
||||
COMMENT ON COLUMN public.auto_execution.status IS '执行状态:0-待触发,1-触发中,2-排队中,3-执行中,4-成功,5-失败,6-已取消,7-触发失败,8-回调异常';
|
||||
COMMENT ON COLUMN public.auto_execution.jenkins_job_name IS 'Jenkins 任务名称';
|
||||
COMMENT ON COLUMN public.auto_execution.jenkins_queue_id IS 'Jenkins 队列ID';
|
||||
COMMENT ON COLUMN public.auto_execution.jenkins_build_number IS 'Jenkins 构建号';
|
||||
COMMENT ON COLUMN public.auto_execution.jenkins_build_url IS 'Jenkins 构建地址';
|
||||
COMMENT ON COLUMN public.auto_execution.console_url IS 'Jenkins 控制台地址';
|
||||
COMMENT ON COLUMN public.auto_execution.report_url IS '聚合测试报告地址';
|
||||
COMMENT ON COLUMN public.auto_execution.total_count IS '执行总用例数';
|
||||
COMMENT ON COLUMN public.auto_execution.pending_count IS '待执行用例数';
|
||||
COMMENT ON COLUMN public.auto_execution.running_count IS '执行中用例数';
|
||||
COMMENT ON COLUMN public.auto_execution.passed_count IS '通过用例数';
|
||||
COMMENT ON COLUMN public.auto_execution.failed_count IS '失败用例数';
|
||||
COMMENT ON COLUMN public.auto_execution.blocked_count IS '阻塞用例数';
|
||||
COMMENT ON COLUMN public.auto_execution.skipped_count IS '跳过用例数';
|
||||
COMMENT ON COLUMN public.auto_execution.not_found_count IS '未找到自动化用例数';
|
||||
COMMENT ON COLUMN public.auto_execution.trigger_by IS '触发人用户ID';
|
||||
COMMENT ON COLUMN public.auto_execution.trigger_source IS '触发来源,默认 platform';
|
||||
COMMENT ON COLUMN public.auto_execution.trigger_message IS '触发说明、失败原因或补充消息';
|
||||
COMMENT ON COLUMN public.auto_execution.start_time IS '实际开始执行时间';
|
||||
COMMENT ON COLUMN public.auto_execution.end_time IS '实际结束执行时间';
|
||||
COMMENT ON COLUMN public.auto_execution.duration_seconds IS '执行耗时,单位秒';
|
||||
COMMENT ON COLUMN public.auto_execution.callback_token IS '本次执行给 pytest/Jenkins 使用的拉取 token';
|
||||
COMMENT ON COLUMN public.auto_execution.ext IS '扩展字段,JSONB';
|
||||
COMMENT ON COLUMN public.auto_execution.created_time IS '创建时间';
|
||||
COMMENT ON COLUMN public.auto_execution.updated_time IS '更新时间';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.auto_execution_case (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
execution_id BIGINT NOT NULL,
|
||||
plan_case_id BIGINT NULL,
|
||||
case_id BIGINT NOT NULL,
|
||||
case_key VARCHAR(64) NULL,
|
||||
case_title VARCHAR(255) NULL,
|
||||
run_order INTEGER NOT NULL DEFAULT 0,
|
||||
status SMALLINT NOT NULL DEFAULT 0,
|
||||
pytest_nodeid VARCHAR(512) NULL,
|
||||
result_message TEXT NULL,
|
||||
error_message TEXT NULL,
|
||||
stack_trace TEXT NULL,
|
||||
report_url VARCHAR(512) NULL,
|
||||
duration_seconds INTEGER NULL,
|
||||
started_time TIMESTAMP NULL,
|
||||
finished_time TIMESTAMP NULL,
|
||||
retry_count INTEGER NOT NULL DEFAULT 0,
|
||||
ext JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||
created_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT uk_auto_execution_case_exec_case UNIQUE (execution_id, case_id)
|
||||
);
|
||||
|
||||
COMMENT ON TABLE public.auto_execution_case IS '自动化执行明细表';
|
||||
COMMENT ON COLUMN public.auto_execution_case.id IS '主键ID';
|
||||
COMMENT ON COLUMN public.auto_execution_case.execution_id IS '执行主单ID,对应 auto_execution.id';
|
||||
COMMENT ON COLUMN public.auto_execution_case.plan_case_id IS '计划用例ID,对应计划与用例关系表主键';
|
||||
COMMENT ON COLUMN public.auto_execution_case.case_id IS '功能用例ID,也是当前自动化与功能用例的桥梁';
|
||||
COMMENT ON COLUMN public.auto_execution_case.case_key IS '用例编号快照';
|
||||
COMMENT ON COLUMN public.auto_execution_case.case_title IS '用例标题快照';
|
||||
COMMENT ON COLUMN public.auto_execution_case.run_order IS '执行顺序';
|
||||
COMMENT ON COLUMN public.auto_execution_case.status IS '明细状态:0-待执行,1-执行中,2-通过,3-失败,4-阻塞,5-跳过,6-未找到,7-已取消';
|
||||
COMMENT ON COLUMN public.auto_execution_case.pytest_nodeid IS 'pytest 节点标识,如 tests/test_xx.py::test_yy';
|
||||
COMMENT ON COLUMN public.auto_execution_case.result_message IS '结果摘要';
|
||||
COMMENT ON COLUMN public.auto_execution_case.error_message IS '错误信息';
|
||||
COMMENT ON COLUMN public.auto_execution_case.stack_trace IS '失败堆栈';
|
||||
COMMENT ON COLUMN public.auto_execution_case.report_url IS '单用例报告地址';
|
||||
COMMENT ON COLUMN public.auto_execution_case.duration_seconds IS '执行耗时,单位秒';
|
||||
COMMENT ON COLUMN public.auto_execution_case.started_time IS '明细开始时间';
|
||||
COMMENT ON COLUMN public.auto_execution_case.finished_time IS '明细结束时间';
|
||||
COMMENT ON COLUMN public.auto_execution_case.retry_count IS '重试次数';
|
||||
COMMENT ON COLUMN public.auto_execution_case.ext IS '扩展字段,JSONB';
|
||||
COMMENT ON COLUMN public.auto_execution_case.created_time IS '创建时间';
|
||||
COMMENT ON COLUMN public.auto_execution_case.updated_time IS '更新时间';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_auto_execution_project_id ON public.auto_execution(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_auto_execution_plan_id ON public.auto_execution(plan_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_auto_execution_status ON public.auto_execution(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_auto_execution_trigger_by ON public.auto_execution(trigger_by);
|
||||
CREATE INDEX IF NOT EXISTS idx_auto_execution_created_time ON public.auto_execution(created_time DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_auto_execution_build_number ON public.auto_execution(jenkins_build_number);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_auto_execution_case_execution_id ON public.auto_execution_case(execution_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_auto_execution_case_case_id ON public.auto_execution_case(case_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_auto_execution_case_plan_case_id ON public.auto_execution_case(plan_case_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_auto_execution_case_status ON public.auto_execution_case(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_auto_execution_case_run_order ON public.auto_execution_case(run_order);
|
||||
|
||||
COMMENT ON INDEX public.idx_auto_execution_project_id IS '按项目查询执行记录索引';
|
||||
COMMENT ON INDEX public.idx_auto_execution_plan_id IS '按计划查询执行记录索引';
|
||||
COMMENT ON INDEX public.idx_auto_execution_status IS '按执行状态查询索引';
|
||||
COMMENT ON INDEX public.idx_auto_execution_trigger_by IS '按触发人查询索引';
|
||||
COMMENT ON INDEX public.idx_auto_execution_created_time IS '按创建时间倒序查询索引';
|
||||
COMMENT ON INDEX public.idx_auto_execution_build_number IS '按 Jenkins 构建号查询索引';
|
||||
COMMENT ON INDEX public.idx_auto_execution_case_execution_id IS '按执行主单查询明细索引';
|
||||
COMMENT ON INDEX public.idx_auto_execution_case_case_id IS '按功能用例ID查询明细索引';
|
||||
COMMENT ON INDEX public.idx_auto_execution_case_plan_case_id IS '按计划用例ID查询明细索引';
|
||||
COMMENT ON INDEX public.idx_auto_execution_case_status IS '按明细状态查询索引';
|
||||
COMMENT ON INDEX public.idx_auto_execution_case_run_order IS '按执行顺序查询索引';
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.set_updated_time()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_time = CURRENT_TIMESTAMP;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
COMMENT ON FUNCTION public.set_updated_time() IS '通用更新时间触发器函数,更新 updated_time';
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_auto_execution_updated_time ON public.auto_execution;
|
||||
CREATE TRIGGER trg_auto_execution_updated_time
|
||||
BEFORE UPDATE ON public.auto_execution
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION public.set_updated_time();
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_auto_execution_case_updated_time ON public.auto_execution_case;
|
||||
CREATE TRIGGER trg_auto_execution_case_updated_time
|
||||
BEFORE UPDATE ON public.auto_execution_case
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION public.set_updated_time();
|
||||
|
||||
COMMIT;
|
||||
Reference in New Issue
Block a user