temporal-python-testing - unit-testing
Temporal 工作流和活动单元测试使用 WorkflowEnvironment 和 ActivityEnvironment 隔离测试单个工作流和活动的重点指南。带时间跳跃的 WorkflowEnvironment目的: 在隔离环境中测试工作流时间即时推进数月的长工作流 → 数秒基本设置模式importpytestfromtemporalio.testingimportWorkflowEnvironmentfromtemporalio.workerimportWorkerpytest.fixtureasyncdefworkflow_env():Reusable time-skipping test environmentenvawaitWorkflowEnvironment.start_time_skipping()yieldenvawaitenv.shutdown()pytest.mark.asyncioasyncdeftest_workflow_execution(workflow_env):Test workflow with time-skippingasyncwithWorker(workflow_env.client,task_queuetest-queue,workflows[YourWorkflow],activities[your_activity],):resultawaitworkflow_env.client.execute_workflow(YourWorkflow.run,test-input,idtest-wf-id,task_queuetest-queue,)assertresultexpected-output关键优势workflow.sleep(timedelta(days30))立即完成快速反馈循环毫秒 vs 小时确定性的测试执行时间跳跃示例睡眠推进pytest.mark.asyncioasyncdeftest_workflow_with_delays(workflow_env):Workflow sleeps are instant in time-skipping modeworkflow.defnclassDelayedWorkflow:workflow.runasyncdefrun(self)-str:awaitworkflow.sleep(timedelta(hours24))# Instant in testsreturncompletedasyncwithWorker(workflow_env.client,task_queuetest,workflows[DelayedWorkflow],):resultawaitworkflow_env.client.execute_workflow(DelayedWorkflow.run,iddelayed-wf,task_queuetest,)assertresultcompleted手动时间控制pytest.mark.asyncioasyncdeftest_workflow_manual_time(workflow_env):Manually advance time for precise controlhandleawaitworkflow_env.client.start_workflow(TimeBasedWorkflow.run,idtime-wf,task_queuetest,)# Advance time by specific amountawaitworkflow_env.sleep(timedelta(hours1))# Verify intermediate state via querystateawaithandle.query(TimeBasedWorkflow.get_state)assertstateprocessing# Advance to completionawaitworkflow_env.sleep(timedelta(hours23))resultawaithandle.result()assertresultcompleted测试工作流逻辑决策测试pytest.mark.asyncioasyncdeftest_workflow_branching(workflow_env):Test different execution pathsworkflow.defnclassConditionalWorkflow:workflow.runasyncdefrun(self,condition:bool)-str:ifcondition:returnpath-areturnpath-basyncwithWorker(workflow_env.client,task_queuetest,workflows[ConditionalWorkflow],):# Test true pathresult_aawaitworkflow_env.client.execute_workflow(ConditionalWorkflow.run,True,idcond-wf-true,task_queuetest,)assertresult_apath-a# Test false pathresult_bawaitworkflow_env.client.execute_workflow(ConditionalWorkflow.run,False,idcond-wf-false,task_queuetest,)assertresult_bpath-bActivityEnvironment 测试目的: 在没有工作流或 Temporal 服务器的情况下隔离测试活动基本活动测试fromtemporalio.testingimportActivityEnvironmentasyncdeftest_activity_basic():Test activity without workflow contextactivity.defnasyncdefprocess_data(input:str)-str:returninput.upper()envActivityEnvironment()resultawaitenv.run(process_data,test)assertresultTEST测试活动上下文心跳测试asyncdeftest_activity_heartbeat():Verify heartbeat callsactivity.defnasyncdeflong_running_activity(total_items:int)-int:foriinrange(total_items):activity.heartbeat(i)# Report progressawaitasyncio.sleep(0.1)returntotal_items envActivityEnvironment()resultawaitenv.run(long_running_activity,10)assertresult10取消测试asyncdeftest_activity_cancellation():Test activity cancellation handlingactivity.defnasyncdefcancellable_activity()-str:try:whileTrue:ifactivity.is_cancelled():returncancelledawaitasyncio.sleep(0.1)exceptasyncio.CancelledError:returncancelledenvActivityEnvironment(cancellation_reasontest-cancel)resultawaitenv.run(cancellable_activity)assertresultcancelled测试错误处理异常传播asyncdeftest_activity_error():Test activity error handlingactivity.defnasyncdeffailing_activity(should_fail:bool)-str:ifshould_fail:raiseApplicationError(Validation failed,non_retryableTrue)returnsuccessenvActivityEnvironment()# Test success pathresultawaitenv.run(failing_activity,False)assertresultsuccess# Test error pathwithpytest.raises(ApplicationError)asexc_info:awaitenv.run(failing_activity,True)assertValidation failedinstr(exc_info.value)pytest 集成模式共享夹具# conftest.pyimportpytestfromtemporalio.testingimportWorkflowEnvironmentpytest.fixture(scopemodule)asyncdefworkflow_env():Module-scoped environment (reused across tests)envawaitWorkflowEnvironment.start_time_skipping()yieldenvawaitenv.shutdown()pytest.fixturedefactivity_env():Function-scoped environment (fresh per test)returnActivityEnvironment()参数化测试pytest.mark.parametrize(input,expected,[(test,TEST),(hello,HELLO),(123,123),])asyncdeftest_activity_parameterized(activity_env,input,expected):Test multiple input scenariosresultawaitactivity_env.run(process_data,input)assertresultexpected最佳实践快速执行: 所有工作流测试都使用时间跳跃隔离: 分别测试工作流和活动共享夹具: 在相关测试之间重用 WorkflowEnvironment覆盖率目标: 工作流逻辑 ≥80%模拟活动: 使用 ActivityEnvironment 测试活动特定逻辑确定性: 确保测试结果在多次运行间一致错误场景: 同时测试成功和失败场景常见模式测试重试逻辑pytest.mark.asyncioasyncdeftest_workflow_with_retries(workflow_env):Test activity retry behaviorcall_count0activity.defnasyncdefflaky_activity()-str:nonlocalcall_count call_count1ifcall_count3:raiseException(Transient error)returnsuccessworkflow.defnclassRetryWorkflow:workflow.runasyncdefrun(self)-str:returnawaitworkflow.execute_activity(flaky_activity,start_to_close_timeouttimedelta(seconds10),retry_policyRetryPolicy(initial_intervaltimedelta(milliseconds1),maximum_attempts5,),)asyncwithWorker(workflow_env.client,task_queuetest,workflows[RetryWorkflow],activities[flaky_activity],):resultawaitworkflow_env.client.execute_workflow(RetryWorkflow.run,idretry-wf,task_queuetest,)assertresultsuccessassertcall_count3# Verify retry attempts其他资源Python SDK 测试: docs.temporal.io/develop/python/testing-suitepytest 文档: docs.pytest.orgTemporal 示例: github.com/temporalio/samples-python

相关新闻

require、import()与静态import:动态引入、代码分割与Tree Shaking的取舍

require、import()与静态import:动态引入、代码分割与Tree Shaking的取舍

上周帮同事排查一个运行时错误,看到他把项目里一大部分import都改成了require,理由是“动态引入才能按需加载、加快首屏”。结果构建产物不减反增,tree shaking 几乎失效,因为require的写法把打包器的静态分析全给堵死了。这个误会…

2026/10/2 16:12:09 阅读更多 →
FileBrowser Quantum 开源文件管理器实战指南:特性解析、配置方式与源码架构

FileBrowser Quantum 开源文件管理器实战指南:特性解析、配置方式与源码架构

后端存储 【免费下载链接】filebrowser 📂 Web File Browser 项目地址: https://gitcode.com/GitHub_Trending/fileb/filebrowser 点击查看 免费下载 本文以项目仓库根目录的 README.md 为骨架,系统梳理 FileBrowser Quantum(一个…

2026/10/2 16:12:09 阅读更多 →
提示词工程参数调优与高级技巧实战指南

提示词工程参数调优与高级技巧实战指南

1. 为什么参数调优是提示词工程里最被低估的基本功很多人聊提示词工程,第一反应就是“写一段神奇的话让模型变聪明”。但我在实际项目里踩过最大的坑,恰恰不是措辞不够花哨,而是参数没配对。同一个提示词,温度值差0.3,…

2026/10/2 16:12:09 阅读更多 →

最新新闻

济南海尔集团家用电器购买品牌企业实力参考

济南海尔集团家用电器购买品牌企业实力参考

济南买大件家电怎么选?海尔集团全流程服务体系一文讲透选购空调、冰箱、洗衣机、热水器、厨电、电视这类大型家电,怕尺寸不合适、安装不专业、售后没人管?济南海尔集团家用电器购买品牌企业,依托海尔集团近四十年的制造与服务积淀,为济南家…

2026/10/2 17:31:45 阅读更多 →
《动手学深度学习》暂退法(Dropout)完全指南:从过拟合原理到四种框架实战

《动手学深度学习》暂退法(Dropout)完全指南:从过拟合原理到四种框架实战

人工智能深度学习机器学习教程 【免费下载链接】d2l-zh 《动手学深度学习》:面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。 项目地址: https://gitcode.com/GitHub_Trending/d2/d2l-zh 点击查看 免费下载 暂退法&#xf…

2026/10/2 17:31:44 阅读更多 →
婴儿硅胶牙胶正规厂家有哪些?实力参考与用户口碑力荐

婴儿硅胶牙胶正规厂家有哪些?实力参考与用户口碑力荐

东莞市旭轩五金塑胶有限公司作为专注婴童用品配件与毛绒玩具配件制造的源头工厂,东莞市旭轩五金塑胶有限公司围绕婴童用品配件 毛绒玩具配件两大主线,形成覆盖硅胶、塑胶、五金三大材质体系的完整产品矩阵,为外贸公司、品牌方与玩具工厂提供…

2026/10/2 17:31:44 阅读更多 →
义乌高性价比别墅装修公司有哪些,东阳大家装饰靠谱商家测评排名

义乌高性价比别墅装修公司有哪些,东阳大家装饰靠谱商家测评排名

义乌高性价比别墅装修公司怎么选:从行业常识到避坑决策的完整指南 别墅装修与普通家装的本质区别,多数业主第一次都不清楚很多业主在装修第一套别墅时,习惯性地把别墅装修当成放大版的家装,这是认知上的第一个误区。实际上&#x…

2026/10/2 17:31:44 阅读更多 →
重庆实力之选:河北诚舒橡塑制品有限公司用户力荐

重庆实力之选:河北诚舒橡塑制品有限公司用户力荐

河北诚舒橡塑制品有限公司是集研发、生产、销售、定制于一体的橡塑耐磨制品源头厂家,专注新型橡塑耐磨材料研发与深加工,深耕自动化、物流、包装、食品加工等装备配套领域,为客户提供一站式耐磨解决方案,主营超高分子聚乙烯耐磨件…

2026/10/2 17:31:44 阅读更多 →
[复现]基于改进MPC模型预测矢量控制的永磁同步电机仿真(三矢量+单矢量)

[复现]基于改进MPC模型预测矢量控制的永磁同步电机仿真(三矢量+单矢量)

✅作者简介:热爱科研的Matlab仿真开发者,擅长数学建模、数据处理、算法改进、程序设计科研仿真。🍎 往期回顾关注个人主页:完整代码获取 定制创新 论文复现私信🍊个人信条:做科研,博学之、审问之…

2026/10/2 17:30:44 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →