如何从Go测试用例向Temporal工作流发送负载并无需Mock测试
测试Temporal工作流:发送负载并断言结果(无需Mock)
核心方案:使用Temporal Test Workflow Environment
Temporal Go SDK提供的testsuite.TestWorkflowEnvironment可以在本地测试环境中运行工作流,无需连接真实集群,也无需Mock工作流逻辑——它会实际执行你的工作流和活动代码,同时允许你传入负载、捕获执行结果并进行断言。
完整测试用例示例
假设你的工作流代码位于业务包中,以下是对应的测试代码:
package yourpackage import ( "encoding/json" "fmt" "testing" "github.com/stretchr/testify/assert" "go.temporal.io/sdk/testsuite" ) func TestCreateWorkflow_Success(t *testing.T) { // 初始化测试环境 suite := &testsuite.WorkflowTestSuite{} env := suite.NewTestWorkflowEnvironment() // 注册活动的实际实现(无需Mock,直接用工作流依赖的活动逻辑) workflow := &Exampleworkflow{} env.RegisterActivity(workflow.CheckCustomer) // 准备测试负载:构造符合业务格式的payloadBytes testMessageType := "customer_create" // 假设你的payload结构体定义为:type Payload struct { CustId string } testPayload := []byte(`{"CustId": "test_cust_001"}`) // 启动工作流,传入预设的负载参数 env.ExecuteWorkflow(workflow.CreateWorkflow, testMessageType, testPayload) // 断言工作流成功完成 assert.True(t, env.IsWorkflowCompleted()) // 断言工作流无错误返回 assert.NoError(t, env.GetWorkflowError()) // 可选:验证活动调用是否符合预期 activityHistory := env.GetActivityHistory() assert.Len(t, activityHistory, 1) calledActivity := activityHistory[0] assert.Equal(t, "CheckCustomer", calledActivity.ActivityType.Name) // 解析活动入参,断言传入的CustId正确 var activityInput string assert.NoError(t, json.Unmarshal(calledActivity.Input, &activityInput)) assert.Equal(t, "test_cust_001", activityInput) } func TestCreateWorkflow_CustomerNotFound(t *testing.T) { suite := &testsuite.WorkflowTestSuite{} env := suite.NewTestWorkflowEnvironment() // 定制活动实现以测试异常分支(仅针对错误场景,未Mock工作流本身) env.RegisterActivity(func(custId string) error { return fmt.Errorf("customer %s not found", custId) }) testMessageType := "customer_create" testPayload := []byte(`{"CustId": "invalid_cust"}`) env.ExecuteWorkflow((&Exampleworkflow{}).CreateWorkflow, testMessageType, testPayload) // 断言工作流因错误终止 assert.True(t, env.IsWorkflowCompleted()) workflowErr := env.GetWorkflowError() assert.Error(t, workflowErr) assert.Contains(t, workflowErr.Error(), "customer does not exists") }
关键说明
- 无需Mock工作流:测试环境会完整执行你的
CreateWorkflow代码逻辑,包括活动调用、错误处理分支。 - 负载传递:直接通过
ExecuteWorkflow的参数传递messageType和payloadBytes,和生产环境调用方式一致。 - 结果捕获:通过
env.GetWorkflowError()获取工作流返回的错误;若工作流返回其他类型结果,可使用env.GetWorkflowResult(&result)解析。 - 活动处理:如果活动依赖外部资源(如数据库),可以在测试前准备好测试数据(比如插入测试记录、启动测试容器),让活动执行真实逻辑,完全避免Mock。
内容的提问来源于stack exchange,提问作者Sujithkumar Sharone
相关产品推荐
相关产品推荐

