完善TestRunWorkflow中文注释,增加详细参数说明及逻辑注解以提升代码可读性

This commit is contained in:
longpeng 2025-06-20 19:33:50 +08:00
parent bf5c5602ed
commit 61afb0a8db

View File

@ -1,6 +1,6 @@
package workflows
// 定义 Temporal Workflow
// workflows 包定义了 Temporal 工作流的实现
import (
"beacon/pkg/pb"
"fmt"
@ -10,80 +10,118 @@ import (
)
// TestRunWorkflow 定义了整个测试执行的工作流
// 该工作流负责协调和执行 API 测试和 UI 测试的整个流程
// 参数:
// - ctx: Temporal 工作流上下文,用于控制工作流的执行
// - input: 测试运行的输入参数,包含运行配置和标识
//
// 返回值:
// - *pb.TestRunOutput: 测试运行的结果输出
// - error: 执行过程中的错误信息
func TestRunWorkflow(ctx workflow.Context, input *pb.TestRunInput) (*pb.TestRunOutput, error) {
// 获取工作流日志记录器,用于记录执行过程中的关键信息
logger := workflow.GetLogger(ctx)
logger.Info("TestRunWorkflow started", "runID", input.RunId)
// 配置 Activity 的执行选项,包括超时时间和重试策略
ctx = workflow.WithActivityOptions(ctx, workflow.ActivityOptions{
StartToCloseTimeout: 10 * time.Minute, // Activity 执行超时时间
HeartbeatTimeout: 30 * time.Second, // Heartbeat 防止 Worker 假死
RetryPolicy: &temporal.RetryPolicy{ // Activity 级别的重试策略
InitialInterval: time.Second,
BackoffCoefficient: 2.0,
MaximumInterval: time.Minute,
MaximumAttempts: 3,
NonRetryableErrorTypes: []string{"NonRetryableErrorType"}, // 自定义不可重试的错误
StartToCloseTimeout: 10 * time.Minute, // Activity 从开始到完成的最大允许时间
HeartbeatTimeout: 30 * time.Second, // Heartbeat 超时时间,防止 Worker 假死
RetryPolicy: &temporal.RetryPolicy{ // Activity 级别的重试策略配置
InitialInterval: time.Second, // 首次重试前的等待时间
BackoffCoefficient: 2.0, // 重试间隔的递增系数
MaximumInterval: time.Minute, // 重试间隔的最大值
MaximumAttempts: 3, // 最大重试次数
NonRetryableErrorTypes: []string{"NonRetryableErrorType"}, // 自定义不可重试的错误类型
},
})
// 初始化变量用于存储测试结果和状态
var (
apiResults []*pb.ApiTestResult
uiResults []*pb.UiTestResult
overallSuccess = true
completionMessage = "Test run completed successfully."
apiResults []*pb.ApiTestResult // 存储所有 API 测试的结果
uiResults []*pb.UiTestResult // 存储所有 UI 测试的结果
overallSuccess = true // 整体测试是否成功的标志
completionMessage = "Test run completed successfully." // 完成时的状态消息
)
// 执行 API 测试 Activity
// 条件执行 API 测试 Activity
// 只有当输入配置中指定需要运行 API 测试时才执行
if input.RunApiTests {
// 构造 API 测试的请求参数
// 这里使用硬编码的示例数据,实际应用中应该从配置或输入中获取
apiTestInput := &pb.ApiTestRequest{
TestCaseId: "api-example-1",
Endpoint: "/api/v1/data",
HttpMethod: "GET",
Headers: map[string]string{"Authorization": "Bearer token123"},
ExpectedStatusCode: 200,
TestCaseId: "api-example-1", // 测试用例唯一标识
Endpoint: "/api/v1/data", // 要测试的 API 端点
HttpMethod: "GET", // HTTP 请求方法
Headers: map[string]string{"Authorization": "Bearer token123"}, // 请求头信息
ExpectedStatusCode: 200, // 预期的 HTTP 状态码
}
// 声明变量用于接收 API 测试的结果
var apiRes pb.ApiTestResult
// 执行 API 测试 Activity 并等待结果
// "run_api_test" 是注册的 Activity 名称
err := workflow.ExecuteActivity(ctx, "run_api_test", apiTestInput).Get(ctx, &apiRes)
if err != nil {
// API 测试执行失败时的错误处理
logger.Error("API test activity failed", "error", err)
// 可以选择标记为失败或者继续执行UI测试
// 标记整体测试为失败,但继续执行后续测试
overallSuccess = false
// 设置测试结果的失败状态和错误信息
apiRes.BaseResult.Success = false
apiRes.BaseResult.Message = fmt.Sprintf("API Test Failed: %v", err)
}
// 将 API 测试结果添加到结果集合中
apiResults = append(apiResults, &apiRes)
}
// 执行 UI 测试 Activity
// 条件执行 UI 测试 Activity
// 只有当输入配置中指定需要运行 UI 测试时才执行
if input.RunUiTests {
// 构造 UI 测试的请求参数
// 包含浏览器配置和测试页面信息
uiTestInput := &pb.UiTestRequest{
TestCaseId: "ui-example-1",
UrlPath: "/dashboard",
BrowserType: "chromium",
Headless: true,
UserData: map[string]string{"user": "test", "pass": "password"},
TestCaseId: "ui-example-1", // UI 测试用例标识
UrlPath: "/dashboard", // 要测试的页面路径
BrowserType: "chromium", // 使用的浏览器类型
Headless: true, // 是否使用无头模式运行浏览器
UserData: map[string]string{"user": "test", "pass": "password"}, // 测试用的用户数据
}
// 声明变量用于接收 UI 测试的结果
var uiRes pb.UiTestResult
// 执行 UI 测试 Activity 并等待结果
// "run_ui_test" 是注册的 Activity 名称
err := workflow.ExecuteActivity(ctx, "run_ui_test", uiTestInput).Get(ctx, &uiRes)
if err != nil {
// UI 测试执行失败时的错误处理
logger.Error("UI test activity failed", "error", err)
// 标记整体测试为失败
overallSuccess = false
// 设置测试结果的失败状态和错误信息
uiRes.BaseResult.Success = false
uiRes.BaseResult.Message = fmt.Sprintf("UI Test Failed: %v", err)
}
// 将 UI 测试结果添加到结果集合中
uiResults = append(uiResults, &uiRes)
}
// 根据整体测试结果更新完成消息
if !overallSuccess {
completionMessage = "Test run completed with failures."
}
// 记录工作流完成的日志信息
logger.Info("TestRunWorkflow completed", "overallSuccess", overallSuccess)
// 构造并返回测试运行的完整结果
return &pb.TestRunOutput{
RunId: input.RunId,
OverallSuccess: overallSuccess,
CompletionMessage: completionMessage,
ApiResults: apiResults,
UiResults: uiResults,
RunId: input.RunId, // 测试运行的唯一标识
OverallSuccess: overallSuccess, // 整体测试是否成功
CompletionMessage: completionMessage, // 完成状态消息
ApiResults: apiResults, // 所有 API 测试结果
UiResults: uiResults, // 所有 UI 测试结果
}, nil
}