255 lines
6.6 KiB
Markdown
255 lines
6.6 KiB
Markdown
# Activity 之间参数传递指南
|
||
|
||
## 概述
|
||
|
||
在动态测试工作流中,多个 Activity 之间经常需要传递参数。例如,第二个 Activity 可能需要使用第一个 Activity 响应的某个字段作为入参。本文档详细说明了如何实现这种参数传递机制。
|
||
|
||
## 支持的变量格式
|
||
|
||
### 1. 全局变量
|
||
格式:`${global.key}`
|
||
- 用于访问工作流级别的全局变量
|
||
- 这些变量在工作流启动时通过 `GlobalParameters` 传入
|
||
|
||
### 2. 步骤结果变量
|
||
格式:`${step.stepId.field}`
|
||
- 用于访问之前步骤的执行结果
|
||
- `stepId` 是步骤的ID
|
||
- `field` 是结果中的具体字段
|
||
|
||
## 变量引用示例
|
||
|
||
### API 测试结果变量
|
||
```json
|
||
{
|
||
"test_case_id": "api_test_001",
|
||
"endpoint": "/api/login",
|
||
"http_method": "POST",
|
||
"headers": {
|
||
"Content-Type": "application/json"
|
||
},
|
||
"request_body": "{\"username\": \"testuser\", \"password\": \"testpass\"}",
|
||
"expected_status_code": 200
|
||
}
|
||
```
|
||
|
||
假设这个API测试的步骤ID是123,执行后返回:
|
||
```json
|
||
{
|
||
"base_result": {
|
||
"success": true,
|
||
"message": "API Test Passed"
|
||
},
|
||
"actual_status_code": 200,
|
||
"response_body": "{\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\", \"user_id\": 456}",
|
||
"headers": {
|
||
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"Content-Type": "application/json"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 可用的变量引用
|
||
|
||
1. **响应体**:`${step.123.response_body}`
|
||
2. **状态码**:`${step.123.actual_status_code}`
|
||
3. **响应头**:`${step.123.headers.Authorization}`
|
||
4. **JSON字段**:`${step.123.json_token}` (自动提取的token字段)
|
||
5. **用户ID**:`${step.123.json_user_id}` (自动提取的user_id字段)
|
||
|
||
## 实际使用场景
|
||
|
||
### 场景1:登录后使用Token进行API调用
|
||
|
||
**步骤1:登录API**
|
||
```json
|
||
{
|
||
"test_case_id": "login_test",
|
||
"endpoint": "/api/login",
|
||
"http_method": "POST",
|
||
"headers": {
|
||
"Content-Type": "application/json"
|
||
},
|
||
"request_body": "{\"username\": \"testuser\", \"password\": \"testpass\"}",
|
||
"expected_status_code": 200
|
||
}
|
||
```
|
||
|
||
**步骤2:使用Token调用受保护的API**
|
||
```json
|
||
{
|
||
"test_case_id": "protected_api_test",
|
||
"endpoint": "/api/user/profile",
|
||
"http_method": "GET",
|
||
"headers": {
|
||
"Authorization": "${step.123.json_token}",
|
||
"Content-Type": "application/json"
|
||
},
|
||
"expected_status_code": 200
|
||
}
|
||
```
|
||
|
||
### 场景2:使用响应头中的Token
|
||
|
||
```json
|
||
{
|
||
"test_case_id": "api_with_header_token",
|
||
"endpoint": "/api/data",
|
||
"http_method": "GET",
|
||
"headers": {
|
||
"Authorization": "${step.123.headers.Authorization}",
|
||
"Content-Type": "application/json"
|
||
},
|
||
"expected_status_code": 200
|
||
}
|
||
```
|
||
|
||
### 场景3:使用响应体中的用户ID
|
||
|
||
```json
|
||
{
|
||
"test_case_id": "user_data_test",
|
||
"endpoint": "/api/users/${step.123.json_user_id}/data",
|
||
"http_method": "GET",
|
||
"headers": {
|
||
"Authorization": "${step.123.json_token}",
|
||
"Content-Type": "application/json"
|
||
},
|
||
"expected_status_code": 200
|
||
}
|
||
```
|
||
|
||
## UI 测试结果变量
|
||
|
||
### UI 测试结果示例
|
||
```json
|
||
{
|
||
"base_result": {
|
||
"success": true,
|
||
"message": "UI Test Passed"
|
||
},
|
||
"screenshot_url": "https://s3.amazonaws.com/screenshots/test_001.png",
|
||
"html_report_url": "https://s3.amazonaws.com/reports/test_001.html"
|
||
}
|
||
```
|
||
|
||
### 可用的变量引用
|
||
1. **截图URL**:`${step.456.screenshot_url}`
|
||
2. **报告URL**:`${step.456.html_report_url}`
|
||
|
||
## 全局变量使用
|
||
|
||
### 工作流启动时传入全局变量
|
||
```go
|
||
input := &pb.DynamicTestRunInput{
|
||
RunId: "test_run_001",
|
||
CompositeCaseId: "composite_case_001",
|
||
GlobalParameters: map[string]string{
|
||
"base_url": "https://api.example.com",
|
||
"environment": "staging",
|
||
"api_version": "v1",
|
||
},
|
||
}
|
||
```
|
||
|
||
### 在步骤参数中使用全局变量
|
||
```json
|
||
{
|
||
"test_case_id": "api_test",
|
||
"endpoint": "${global.base_url}/${global.api_version}/users",
|
||
"http_method": "GET",
|
||
"headers": {
|
||
"X-Environment": "${global.environment}",
|
||
"Content-Type": "application/json"
|
||
},
|
||
"expected_status_code": 200
|
||
}
|
||
```
|
||
|
||
## 复杂场景示例
|
||
|
||
### 多步骤参数传递链
|
||
|
||
**步骤1:用户注册**
|
||
```json
|
||
{
|
||
"test_case_id": "user_registration",
|
||
"endpoint": "/api/register",
|
||
"http_method": "POST",
|
||
"headers": {
|
||
"Content-Type": "application/json"
|
||
},
|
||
"request_body": "{\"username\": \"newuser\", \"email\": \"newuser@example.com\", \"password\": \"password123\"}",
|
||
"expected_status_code": 201
|
||
}
|
||
```
|
||
|
||
**步骤2:用户登录(使用注册返回的用户ID)**
|
||
```json
|
||
{
|
||
"test_case_id": "user_login",
|
||
"endpoint": "/api/login",
|
||
"http_method": "POST",
|
||
"headers": {
|
||
"Content-Type": "application/json"
|
||
},
|
||
"request_body": "{\"username\": \"newuser\", \"password\": \"password123\"}",
|
||
"expected_status_code": 200
|
||
}
|
||
```
|
||
|
||
**步骤3:获取用户信息(使用登录返回的token)**
|
||
```json
|
||
{
|
||
"test_case_id": "get_user_info",
|
||
"endpoint": "/api/users/${step.123.json_user_id}",
|
||
"http_method": "GET",
|
||
"headers": {
|
||
"Authorization": "Bearer ${step.124.json_token}",
|
||
"Content-Type": "application/json"
|
||
},
|
||
"expected_status_code": 200
|
||
}
|
||
```
|
||
|
||
**步骤4:更新用户信息(使用步骤3的token和用户ID)**
|
||
```json
|
||
{
|
||
"test_case_id": "update_user_info",
|
||
"endpoint": "/api/users/${step.123.json_user_id}",
|
||
"http_method": "PUT",
|
||
"headers": {
|
||
"Authorization": "Bearer ${step.124.json_token}",
|
||
"Content-Type": "application/json"
|
||
},
|
||
"request_body": "{\"display_name\": \"Updated User\", \"bio\": \"This is my updated bio\"}",
|
||
"expected_status_code": 200
|
||
}
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. **变量解析顺序**:先解析全局变量,再解析步骤变量
|
||
2. **错误处理**:如果变量不存在,会保持原始占位符不变
|
||
3. **类型安全**:所有变量都会被转换为字符串
|
||
4. **性能考虑**:变量解析在每次步骤执行时进行,避免频繁的字符串操作
|
||
5. **调试支持**:工作流日志会记录变量解析过程
|
||
|
||
## 最佳实践
|
||
|
||
1. **使用有意义的变量名**:避免使用过于简单的变量名
|
||
2. **文档化变量**:在步骤描述中说明使用的变量
|
||
3. **测试变量解析**:在开发环境中测试变量解析是否正确
|
||
4. **错误处理**:在步骤参数中提供默认值或错误处理逻辑
|
||
5. **版本控制**:记录变量格式的变更,确保向后兼容
|
||
|
||
## 扩展功能
|
||
|
||
### 自定义变量提取器
|
||
可以通过扩展 `extractApiResultToGlobalVariables` 和 `extractUiResultToGlobalVariables` 函数来支持更多自定义字段的提取。
|
||
|
||
### 条件变量
|
||
可以基于步骤的成功/失败状态来设置不同的变量值。
|
||
|
||
### 变量验证
|
||
可以在变量解析时添加验证逻辑,确保必需的变量存在且格式正确。 |