如何使用 pytest 为 Temporal Python 工作流编写测试
解决分布式工作流测试难点:通过 AI 指导使用 pytest 和 Temporal 专用测试环境,实现快速的时间跳跃测试、Activity Mock 模拟以及生产历史重放验证。
为什么需要这个技能
Temporal 工作流通常涉及长达数天甚至数月的运行周期,且依赖于外部 Activity。如果直接在生产环境或实时环境中测试,将面临等待时间过长、外部依赖不可控以及难以验证“确定性(Determinism)”等问题。
本技能教你如何利用 WorkflowEnvironment 的时间跳跃(Time-skipping)特性将月级工作流在数秒内跑完,并通过 Mock 机制隔离外部依赖,确保工作流逻辑在各种边缘情况下都能正确运行。
适用场景
- 单元测试:快速验证单个 Workflow 或 Activity 的逻辑,尤其是包含
sleep的长时工作流。 - 集成测试:在 Mock 外部 Activity 的情况下,测试工作流的整体编排逻辑。
- 重放测试(Replay Testing):在部署新版本前,使用生产环境的历史记录验证代码变更是否破坏了确定性。
- CI/CD 集成:构建自动化测试流水线,确保代码覆盖率达到 80% 以上。
核心工作流
- 环境搭建:配置
pytest-asyncio并使用WorkflowEnvironment.start_time_skipping()启动支持时间跳跃的测试环境。 - 逻辑隔离:
- 使用
ActivityEnvironment独立测试 Activity。 - 在 Workflow 测试中使用 Mock 替代真实 Activity 接口。
- 使用
- 确定性验证:通过重放测试,对比新旧代码在相同事件流下的状态转换是否一致。
- 覆盖率分析:针对 Workflow 编排路径和 Activity 业务逻辑分别进行覆盖率检查。
快速上手示例
基础工作流测试:
import pytest
from temporalio.testing import WorkflowEnvironment
from temporalio.worker import Worker
@pytest.fixture
async def workflow_env():
env = await WorkflowEnvironment.start_time_skipping()
yield env
await env.shutdown()
@pytest.mark.asyncio
async def test_workflow(workflow_env):
async with Worker(
workflow_env.client,
task_queue="test-queue",
workflows=[YourWorkflow],
activities=[your_activity],
):
result = await workflow_env.client.execute_workflow(
YourWorkflow.run,
args,
id="test-wf-id",
task_queue="test-queue",
)
assert result == expected
基础 Activity 测试:
from temporalio.testing import ActivityEnvironment
async def test_activity():
env = ActivityEnvironment()
result = await env.run(your_activity, "test-input")
assert result == expected_output
下载和安装
下载 temporal-python-testing 中文版 Skill ZIP
解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md。
你可能还需要
暂无推荐