Files
httprunner/docs/summary-structure.md
2025-06-24 17:00:29 +08:00

497 lines
18 KiB
Markdown
Raw 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.
# Summary 数据结构说明文档
## 概述
HttpRunner 的 Summary 数据结构用于存储测试执行的完整汇总信息,包括测试结果、统计数据、时间信息、平台信息以及详细的测试步骤记录。本文档基于 `summary.go` 和相关代码的最新定义进行详细说明。
## 数据结构层次关系
```
Summary (根结构)
├── Success (bool)
├── Stat (统计信息)
│ ├── TestCases (测试用例统计)
│ └── TestSteps (测试步骤统计)
├── Time (时间信息)
├── Platform (平台信息)
└── Details (测试用例详情列表)
└── TestCaseSummary (单个测试用例汇总)
├── Stat (步骤统计)
├── Time (用例时间)
├── InOut (输入输出)
├── Logs (日志)
└── Records (步骤记录)
└── StepResult (步骤结果)
├── Data (步骤数据)
│ ├── ReqResps (请求响应)
│ └── Validators (验证器)
├── Actions (操作列表)
│ ├── Requests (请求记录)
│ ├── Plannings (AI规划)
│ │ ├── ToolCalls (工具调用)
│ │ ├── Usage (模型使用统计)
│ │ ├── ScreenResult (屏幕结果)
│ │ └── SubActions (子操作)
│ ├── AIResult (统一AI操作结果)
│ │ ├── QueryResult (查询结果)
│ │ ├── PlanningResult (规划结果)
│ │ └── AssertionResult (断言结果)
│ └── ScreenResults (屏幕截图)
└── Attachments (附件信息)
```
## 详细数据结构说明
### 1. Summary (主汇总结构)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Success | bool | `success` | 整体测试执行是否成功 |
| Stat | *Stat | `stat` | 汇总统计信息 |
| Time | *TestCaseTime | `time` | 整体执行时间信息 |
| Platform | *Platform | `platform` | 平台和版本信息 |
| Details | []*TestCaseSummary | `details` | 各个测试用例的详细信息 |
| rootDir | string | - | 根目录路径(私有字段) |
**示例数据**:
```json
{
"success": true,
"stat": { /* */ },
"time": { /* */ },
"platform": { /* */ },
"details": [ /* */ ]
}
```
### 2. Stat (统计信息)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| TestCases | TestCaseStat | `testcases` | 测试用例统计 |
| TestSteps | TestStepStat | `teststeps` | 测试步骤统计 |
### 3. TestCaseStat (测试用例统计)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Total | int | `total` | 测试用例总数 |
| Success | int | `success` | 成功的测试用例数 |
| Fail | int | `fail` | 失败的测试用例数 |
**示例数据**:
```json
{
"testcases": {
"total": 1,
"success": 1,
"fail": 0
}
}
```
### 4. TestStepStat (测试步骤统计)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Total | int | `total` | 测试步骤总数 |
| Successes | int | `successes` | 成功的步骤数 |
| Failures | int | `failures` | 失败的步骤数 |
| Actions | map[option.ActionName]int | `actions` | 各种操作的统计计数 |
**示例数据**:
```json
{
"teststeps": {
"total": 5,
"successes": 5,
"failures": 0,
"actions": {}
}
}
```
### 5. TestCaseTime (时间信息)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| StartAt | time.Time | `start_at,omitempty` | 开始时间 |
| Duration | float64 | `duration,omitempty` | 持续时间(秒) |
**示例数据**:
```json
{
"time": {
"start_at": "2025-06-23T13:41:06.150641+08:00",
"duration": 188.998332334
}
}
```
### 6. Platform (平台信息)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| HttprunnerVersion | string | `httprunner_version` | HttpRunner 版本号 |
| GoVersion | string | `go_version` | Go 语言版本 |
| Platform | string | `platform` | 操作系统平台信息 |
**示例数据**:
```json
{
"platform": {
"httprunner_version": "v5.0.0-beta-2506222254",
"go_version": "go1.24.1",
"platform": "darwin-arm64"
}
}
```
### 7. TestCaseSummary (测试用例汇总)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Name | string | `name` | 测试用例名称 |
| Success | bool | `success` | 用例执行是否成功 |
| CaseId | string | `case_id,omitempty` | 用例ID可选 |
| Stat | *TestStepStat | `stat` | 该用例的步骤统计 |
| Time | *TestCaseTime | `time` | 该用例的时间信息 |
| InOut | *TestCaseInOut | `in_out` | 输入输出信息 |
| Logs | []interface{} | `logs,omitempty` | 日志信息 |
| Records | []*StepResult | `records` | 步骤执行记录 |
| RootDir | string | `root_dir,omitempty` | 根目录路径 |
### 8. TestCaseInOut (输入输出信息)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| ConfigVars | map[string]interface{} | `config_vars` | 配置变量 |
| ExportVars | map[string]interface{} | `export_vars` | 导出变量 |
**示例数据**:
```json
{
"in_out": {
"config_vars": {
"OPENAI_API_KEY": "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",
"dramaName": "涂山赊刀",
"userName": "青榕小剧场"
},
"export_vars": {}
}
}
```
### 9. StepResult (步骤结果)
步骤结果是 Records 数组中的元素,包含每个测试步骤的详细执行信息:
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Name | string | `name` | 步骤名称 |
| Identifier | string | `identifier,omitempty` | 步骤标识符 |
| StartTime | int64 | `start_time` | 开始时间Unix时间戳毫秒 |
| StepType | StepType | `step_type` | 步骤类型(如 "android_validation", "android" |
| Success | bool | `success` | 步骤执行是否成功 |
| Elapsed | int64 | `elapsed_ms` | 执行耗时(毫秒) |
| HttpStat | map[string]int64 | `httpstat,omitempty` | HTTP统计信息毫秒 |
| Data | interface{} | `data,omitempty` | 步骤相关数据 |
| ContentSize | int64 | `content_size,omitempty` | 响应体长度 |
| ExportVars | map[string]interface{} | `export_vars,omitempty` | 提取的变量 |
| Actions | []*ActionResult | `actions,omitempty` | 执行的操作列表 |
| Attachments | interface{} | `attachments,omitempty` | 附件信息(如截图等) |
**示例数据**:
```json
{
"name": "启动快手 app",
"start_time": 1750657267057,
"step_type": "android_validation",
"success": true,
"elapsed_ms": 8797,
"data": { /* */ },
"actions": [ /* */ ],
"attachments": { /* */ }
}
```
### 10. ActionResult (操作结果)
每个步骤可能包含多个操作,每个操作的详细执行信息:
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| MobileAction | option.MobileAction | `,inline` | 移动端操作信息(内联) |
| StartTime | int64 | `start_time` | 操作开始时间Unix时间戳毫秒 |
| Elapsed | int64 | `elapsed_ms` | 操作耗时(毫秒) |
| Error | string | `error,omitempty` | 操作执行错误信息 |
| Plannings | []*uixt.PlanningExecutionResult | `plannings,omitempty` | AI规划执行结果用于start_to_goal操作 |
| AIResult | *uixt.AIExecutionResult | `ai_result,omitempty` | 统一AI执行结果用于ai_query/ai_action/ai_assert操作 |
| SessionData | uixt.SessionData | - | 会话数据(内联,包含请求和屏幕截图信息) |
### 11. AIExecutionResult (统一AI执行结果)
这是所有AI操作ai_query、ai_action、ai_assert的统一结果结构
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Type | string | `type` | 操作类型:"query"、"action"、"assert" |
| ModelCallElapsed | int64 | `model_call_elapsed` | 模型调用耗时(毫秒) |
| ScreenshotElapsed | int64 | `screenshot_elapsed` | 截图耗时(毫秒) |
| ImagePath | string | `image_path` | 截图文件路径 |
| Resolution | *types.Size | `resolution` | 屏幕分辨率 |
| QueryResult | *ai.QueryResult | `query_result,omitempty` | 查询操作结果仅query类型 |
| PlanningResult | *ai.PlanningResult | `planning_result,omitempty` | 规划操作结果仅action类型 |
| AssertionResult | *ai.AssertionResult | `assertion_result,omitempty` | 断言操作结果仅assert类型 |
| Error | string | `error,omitempty` | 操作失败的错误信息 |
**示例数据**:
```json
{
"type": "query",
"model_call_elapsed": 1234,
"screenshot_elapsed": 567,
"image_path": "/path/to/screenshot.png",
"resolution": {"width": 1080, "height": 1920},
"query_result": { /* */ }
}
```
### 12. QueryResult (查询结果)
用于ai_query操作的具体结果
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Content | string | `content` | 提取的内容/信息 |
| Thought | string | `thought` | AI的推理过程 |
| Data | interface{} | `data,omitempty` | 结构化数据当提供OutputSchema时 |
| ModelName | string | `model_name` | 使用的模型名称 |
| Usage | *schema.TokenUsage | `usage,omitempty` | token使用统计 |
**示例数据**:
```json
{
"content": "搜索框位于屏幕右上角",
"thought": "通过分析截图,我看到了页面右上角有一个搜索图标",
"model_name": "doubao-1.5-thinking-vision-pro-250428",
"usage": {
"prompt_tokens": 1234,
"completion_tokens": 56,
"total_tokens": 1290
}
}
```
### 13. PlanningResult (规划结果)
用于ai_action操作的具体结果
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| ToolCalls | []schema.ToolCall | `tool_calls` | 工具调用列表 |
| Thought | string | `thought` | AI的思考过程 |
| Content | string | `content` | 模型的原始内容 |
| Error | string | `error,omitempty` | 规划错误信息 |
| ModelName | string | `model_name` | 使用的模型名称 |
| Usage | *schema.TokenUsage | `usage,omitempty` | token使用统计 |
**示例数据**:
```json
{
"tool_calls": [
{
"id": "tap_xy_1750657286",
"type": "function",
"function": {
"name": "uixt__tap_xy",
"arguments": "{\"x\":1107.6,\"y\":232.4}"
}
}
],
"thought": "点击页面右上角的搜索图标,打开搜索界面",
"model_name": "doubao-1.5-thinking-vision-pro-250428",
"usage": {
"prompt_tokens": 2199,
"completion_tokens": 135,
"total_tokens": 2334
}
}
```
### 14. AssertionResult (断言结果)
用于ai_assert操作的具体结果
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Pass | bool | `pass` | 断言是否通过 |
| Thought | string | `thought` | AI的推理过程 |
| ModelName | string | `model_name` | 使用的模型名称 |
| Usage | *schema.TokenUsage | `usage,omitempty` | token使用统计 |
**示例数据**:
```json
{
"pass": true,
"thought": "根据截图分析,当前页面确实显示了搜索结果",
"model_name": "doubao-1.5-thinking-vision-pro-250428",
"usage": {
"prompt_tokens": 1500,
"completion_tokens": 45,
"total_tokens": 1545
}
}
```
### 15. SessionData (会话数据)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| ReqResps | *ReqResps | `req_resps` | 请求响应数据 |
| Address | *Address | `address,omitempty` | 网络地址信息 |
| Validators | []*ValidationResult | `validators,omitempty` | 验证结果列表 |
### 16. ReqResps (请求响应)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Request | interface{} | `request` | 请求信息 |
| Response | interface{} | `response` | 响应信息 |
### 17. ValidationResult (验证结果)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Check | string | `check` | 验证检查项 |
| Assert | string | `assert` | 断言类型 |
| Expect | interface{} | `expect` | 期望值 |
| Msg | string | `msg` | 验证消息 |
| CheckValue | interface{} | `check_value` | 实际检查值 |
| CheckResult | string | `check_result` | 检查结果("pass"/"fail" |
**示例数据**:
```json
{
"check": "ui_foreground_app",
"assert": "equal",
"expect": "com.smile.gifmaker",
"msg": "app [com.smile.gifmaker] should be in foreground",
"check_value": null,
"check_result": "pass"
}
```
### 18. PlanningExecutionResult (规划执行结果)
用于复杂的start_to_goal操作包含规划和执行的完整信息
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| PlanningResult | ai.PlanningResult | - | 继承的规划结果字段 |
| ScreenshotElapsed | int64 | `screenshot_elapsed_ms` | 截图耗时(毫秒) |
| ImagePath | string | `image_path` | 截图文件路径 |
| Resolution | *types.Size | `resolution` | 图像分辨率 |
| ScreenResult | *ScreenResult | `screen_result` | 完整屏幕结果数据 |
| ModelCallElapsed | int64 | `model_call_elapsed_ms` | 模型调用耗时(毫秒) |
| ToolCallsCount | int | `tool_calls_count` | 生成的工具调用数量 |
| ActionNames | []string | `action_names` | 解析的操作名称列表 |
| StartTime | int64 | `start_time` | 规划开始时间 |
| Elapsed | int64 | `elapsed_ms` | 规划耗时(毫秒) |
| SubActions | []*SubActionResult | `sub_actions,omitempty` | 此规划生成的子操作 |
### 19. ToolCall (工具调用)
AI规划中的工具调用信息
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| ID | string | `id` | 工具调用唯一标识 |
| Type | string | `type` | 调用类型(通常为 "function" |
| Function | Function | `function` | 函数调用详情 |
### 20. Function (函数调用)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Name | string | `name` | 函数名称(如 "uixt__tap_xy" |
| Arguments | string | `arguments` | 函数参数JSON字符串格式 |
### 21. TokenUsage (token使用统计)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| PromptTokens | int | `prompt_tokens` | 输入token数量 |
| CompletionTokens | int | `completion_tokens` | 输出token数量 |
| TotalTokens | int | `total_tokens` | 总token数量 |
### 22. Size (分辨率)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| Width | int | `width` | 屏幕宽度(像素) |
| Height | int | `height` | 屏幕高度(像素) |
### 23. ScreenResult (屏幕结果)
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| ImagePath | string | `image_path` | 截图文件路径 |
| Resolution | Size | `resolution` | 屏幕分辨率 |
| UploadedURL | string | `uploaded_url` | 上传后的URL通常为空 |
| Texts | []Text | `texts` | 识别的文本信息可为null |
| Icons | []Icon | `icons` | 识别的图标信息可为null |
| Tags | []Tag | `tags` | 识别的标签信息可为null |
### 24. SubActionResult (子操作结果)
规划中实际执行的具体操作:
| 字段名 | 类型 | JSON标签 | 说明 |
|--------|------|----------|------|
| ActionName | string | `action_name` | 操作名称(如 "uixt__tap_xy" |
| Arguments | interface{} | `arguments,omitempty` | 操作参数 |
| StartTime | int64 | `start_time` | 操作开始时间 |
| Elapsed | int64 | `elapsed_ms` | 操作耗时 |
| Error | error | `error,omitempty` | 操作执行错误 |
| SessionData | SessionData | - | 会话数据(内联) |
**示例数据**:
```json
{
"action_name": "uixt__tap_xy",
"arguments": {"x": 1107.6, "y": 232.4},
"start_time": 1750657286274,
"elapsed_ms": 319,
"requests": [ /* */ ],
"screen_results": [ /* */ ]
}
```
## 重要架构变更说明
### AI操作统一架构
HttpRunner v5 引入了统一的AI操作架构
1. **统一结果结构**: `AIExecutionResult` 作为所有AI操作的统一容器
2. **类型区分**: 通过 `Type` 字段区分不同的AI操作类型
3. **具体结果**: 根据操作类型,在对应的结果字段中存储具体数据
4. **统一时间统计**: 所有AI操作都包含模型调用和截图的时间统计
5. **统一错误处理**: 通过 `Error` 字段统一处理所有AI操作的错误
### 数据类型和时间格式
#### 时间戳格式
- **Unix时间戳毫秒**: 用于 `start_time` 字段,如 `1750657267057`
- **ISO时间格式**: 用于 `start_at``request_time` 字段,如 `"2025-06-23T13:41:06.150641+08:00"`
#### 耗时统计
- **毫秒级**: `elapsed_ms`, `model_call_elapsed`, `screenshot_elapsed`
- **秒级**: `duration` 字段使用浮点数表示秒
#### 状态标识
- **布尔值**: `success`, `pass` 表示操作或测试是否成功
- **字符串**: `check_result` 使用 "pass"/"fail" 表示验证结果
这个数据结构设计充分考虑了现代UI自动化测试的需求特别是AI驱动的测试场景。通过统一的AI操作架构和详细的嵌套字段定义为测试结果的分析、报告生成和调试提供了完整的数据基础。