You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:45:25