moto 中的 AWS CodeDeploy 模拟:已实现 API 清单、源码实现解析与 boto3 测试实战
Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载本文以 moto 官方服务文档codedeploy.rst的核心内容——CodeDeploy 服务已实现/未实现的 API 清单为骨架结合 moto/codedeploy/models.py、moto/codedeploy/responses.py 等源码与 tests/test_codedeploy/test_codedeploy.py 测试用例讲解 moto 如何 mock CodeDeploy 的 Application、DeploymentGroup、Deployment 三层资源模型读者可以据此判断自己的 CodeDeploy 测试代码能否被 moto 覆盖并直接复用可运行的测试代码与错误码断言。文档定位CodeDeploy 的 API 覆盖情况moto 的服务文档位于 docs/docs/services/codedeploy.rst它通过autoclass引用moto.codedeploy.models.CodeDeployBackend展示后端接口并给出该服务的 Implemented features for this service 清单。根目录的 IMPLEMENTATION_COVERAGE.md 也给出了同一结论CodeDeploy 约有 29% 的 API 已实现。已实现的 16 个 API以下 API 在当前仓库中均有对应实现是编写本地测试可以依赖的能力边界API作用后端实现位置create_application创建 CodeDeploy 应用支持 Server / Lambda / ECS 计算平台与 tagsmodels.pycreate_deployment_group为应用创建部署组含服务角色、部署配置、蓝绿配置等字段models.pycreate_deployment在部署组下创建一次部署revision 支持 S3 / GitHub / Stringmodels.pyget_application按名称查询应用详情models.pybatch_get_applications批量查询多个应用models.pyget_deployment按 deploymentId 查询部署详情models.pybatch_get_deployments批量查询部署models.pyget_deployment_group按应用名 部署组名查询部署组models.pylist_applications列出全部应用名源码标注分页尚未实现models.pylist_deployments按应用/部署组/状态过滤列出部署 IDmodels.pylist_deployment_groups列出指定应用下的部署组名models.pytag_resource给资源 ARN 打标签models.pyuntag_resource按 tag key 移除标签models.pylist_tags_for_resource查询资源 ARN 的标签列表models.py尚未实现的 API写测试前需要知道的限制以下 API 在文档清单中标记为未勾选- [ ]如果你的测试依赖它们当前版本的 moto 无法模拟部署配置管理create_deployment_config、get_deployment_config、delete_deployment_config、list_deployment_configs删除类操作delete_application、delete_deployment_config、delete_deployment_group、delete_git_hub_account_token、delete_resources_by_external_id修订版本管理register_application_revision、get_application_revision、list_application_revisions、batch_get_application_revisions实例级别查询batch_get_deployment_instances、get_deployment_instance、list_deployment_instances、batch_get_deployment_groups、batch_get_deployment_targets、get_deployment_target、list_deployment_targets混合/本地实例管理add_tags_to_on_premises_instances、batch_get_on_premises_instances、get_on_premises_instance、list_on_premises_instances、register_on_premises_instance、deregister_on_premises_instance、remove_tags_from_on_premises_instances部署生命周期控制continue_deployment、stop_deployment、put_lifecycle_event_hook_execution_status、skip_wait_time_for_instance_termination更新类操作update_application、update_deployment_group账户 Token 列表list_git_hub_account_token_names。此外源码中 models.py 的list_applications与 models.py 的list_deployment_groups均带有TODO: implement pagination注释list_deployments的externalId、createTimeRange参数虽然会被解析见 responses.py但从源码结构看后端过滤逻辑目前主要实现了应用名/部署组名/状态过滤时间范围过滤尚未生效——使用时应意识到这是与真实 AWS 行为的差异。资源模型Application / DeploymentGroup / Deployment 三层结构从源码结构看moto 的 CodeDeploy 模拟完整遵循了 AWS 的资源层级定义在 moto/codedeploy/models.py 中Applicationmodels.py#L23-L46持有applicationIdUUID4 生成、applicationName、computePlatform、createTimeISO-8601 毫秒时间戳。源码注释特别说明 Boto 文档说该字段是 datetime而 AWS API 返回的是字符串数值格式moto 按 AWS 行为用iso_8601_datetime_with_milliseconds()生成。DeploymentGroupmodels.py#L71-L142字段覆盖很全包括ec2TagFilters、onPremisesInstanceTagFilters、autoScalingGroups、serviceRoleArn、triggerConfigurations、alarmConfiguration、autoRollbackConfiguration、deploymentStyle、blueGreenDeploymentConfiguration、loadBalancerInfo、ecsServices、terminationHookEnabled等。其中targetRevision、lastSuccessfulDeployment、lastAttemptedDeployment在to_dict()中是# TODO占位空字典意味着这些字段目前返回空结构而非真实数据。DeploymentInfomodels.py#L145-L236新建部署的status固定为CreatedstartTime/completeTime初始为NonedeploymentOverview各状态计数Pending / InProgress / Succeeded / Failed / Skipped / Ready初始全为 0creator默认为user。默认部署配置的回退逻辑CodeDeployBackend.create_deployment_group中有一个值得注意的行为如果调用方没有传deploymentConfigName会回退到内置默认值CodeDeployDefault.OneAtATimemodels.py#L416-L418。该枚举models.py#L49-L56内置了 AWS 官方三种部署配置AllAtOnce、HalfAtATime、OneAtATime。进一步看create_deploymentmodels.py#L351-L355若部署时未显式指定deploymentConfigName会继承所属部署组的配置名。因此在 mock 环境下get_deployment返回的deploymentConfigName会是字符串形式枚举的__str__会返回CodeDeployDefault.OneAtATime这样的类限定名测试中若断言该字段需留意这一点。校验规则与错误码moto 对创建操作做了与 AWS 一致的语义校验所有异常定义在 moto/codedeploy/exceptions.py均为 400 状态的JsonRESTError触发场景异常类错误码应用/部署/部署组不存在ApplicationDoesNotExistException、DeploymentDoesNotExistException、DeploymentGroupDoesNotExistException重复创建同名应用/部署组ApplicationAlreadyExistsException、DeploymentGroupAlreadyExistsExceptioncreate_deployment缺少deploymentGroupNameDeploymentGroupNameRequiredExceptionmodels.py#L346-L349list_deployments只传了applicationName未传部署组名DeploymentGroupNameRequiredExceptionmodels.py#L467-L470list_deployments只传了deploymentGroupName未传应用名ApplicationNameRequiredExceptionmodels.py#L472-L475这些错误码是测试断言的直接依据后文测试示例会用到。请求路由从 boto3 调用到后端的调用链理解 mock 如何拦截请求可以看 moto/codedeploy/urls.pyURL 基础匹配https?://codedeploy\.(.)\.amazonaws\.com即 boto3 客户端发往codedeploy.region.amazonaws.com的 JSON 请求会被 moto 接管大多数 API 走CodeDeployResponse.dispatch通用分发按操作名路由到对应 handlerlist-tags-for-resource、tag-resource、untag-resource三个操作走独立的 URL 路径{0}/tag-resource$等这是因为它们属于 CodeDeploy 的 REST JSON 协议而非 query 协议。handler 实现位于 moto/codedeploy/responses.pyCodeDeployResponse的codedeploy_backend属性按current_account region 从codedeploy_backendsBackendDict(CodeDeployBackend, codedeploy)models.py#L531取出后端实例。每个 handler 通过self._get_param(...)从 JSON body 中取参如 create_deployment handler 解析了applicationName、deploymentGroupName、revision、description、autoRollbackConfiguration等全部参数调用后端方法后以 JSON 字符串返回Content-Type 固定为application/json。测试实战可复制运行的完整示例以下示例全部取自仓库内 tests/test_codedeploy/test_codedeploy.py配合mock_aws装饰器即可本地运行覆盖了已实现 API 的典型用法。1. 创建应用与查询import boto3 from moto import mock_aws mock_aws def test_create_application(): client boto3.client(codedeploy, region_nameap-southeast-1) for platform in [Server, Lambda, ECS]: name ftest-application-{platform} response client.create_application( applicationNamename, computePlatformplatform, tags[{Key: Name, Value: Test}], ) assert applicationId in response resp client.get_application(applicationNamename) application resp[application] assert application[applicationId] response[applicationId] assert application[applicationName] name assert application[computePlatform] platform assert createTime in application重复创建同名应用会返回ApplicationAlreadyExistsException对应 test_create_application_existing。2. 创建部署组与三种 revision 类型create_deployment的revision参数是字典revisionType可以是S3、GitHub、String三种moto 会原样存储并在get_deployment时返回对应 test_create_deployment_revision_s3、test_create_deployment_revision_github、test_get_deploymentmock_aws def test_create_deployment_revision_s3(): client boto3.client(codedeploy, region_nameus-west-2) application_name mytestapp deployment_group_name test-deployment-group service_role_arn arn:aws:iam::123456789012:role/CodeDeployDemoRole client.create_application(applicationNameapplication_name, computePlatformServer) client.create_deployment_group( applicationNameapplication_name, deploymentGroupNamedeployment_group_name, serviceRoleArnservice_role_arn, ) revision_S3 { revisionType: S3, s3Location: { bucket: my-bucket, key: my-key, bundleType: zip, version: 1, eTag: my-etag, }, } response client.create_deployment( applicationNameapplication_name, deploymentGroupNamedeployment_group_name, revisionrevision_S3, descriptionTest deployment, ) deployment_id response[deploymentId] response client.get_deployment(deploymentIddeployment_id) assert response[deploymentInfo][revision][revisionType] S3 assert ( response[deploymentInfo][revision][s3Location] revision_S3[s3Location] ) assert response[deploymentInfo][status] Created assert createTime in response[deploymentInfo]3. 批量查询与列表操作mock_aws def test_batch_and_list(): client boto3.client(codedeploy, region_nameus-east-2) # 批量获取应用 client.create_application(applicationNamesample_app1, computePlatformLambda) client.create_application(applicationNamesample_app2, computePlatformServer) resp client.batch_get_applications(applicationNames[sample_app1, sample_app2]) assert len(resp[applicationsInfo]) 2 # 列出部署 service_role_arn arn:aws:iam::123456789012:role/CodeDeployDemoRole client.create_deployment_group( applicationNamesample_app1, deploymentGroupNamedg-1, serviceRoleArnservice_role_arn, ) client.create_deployment( applicationNamesample_app1, deploymentGroupNamedg-1, revision{revisionType: String, string: {content: c, sha256: s}}, ) resp client.list_deployments() assert len(resp[deployments]) 1 # 列出部署组 resp client.list_deployment_groups(applicationNamesample_app1) assert resp[deploymentGroups] [dg-1]list_deployments的参数配对校验同样值得在测试中固化对应 test_list_deployments_group_required、test_list_deployments_app_requiredmock_aws def test_list_deployments_validation(): client boto3.client(codedeploy, region_nameap-southeast-1) # 只给 applicationName必须同时给 deploymentGroupName with pytest.raises(ClientError) as exc: client.list_deployments(applicationNamemytestapp) assert exc.value.response[Error][Code] DeploymentGroupNameRequiredException # 只给 deploymentGroupName必须同时给 applicationName with pytest.raises(ClientError) as exc: client.list_deployments(deploymentGroupNamemygroupname) assert exc.value.response[Error][Code] ApplicationNameRequiredException4. 标签应用、部署组与部署的标签继承标签功能基于通用TaggingServicemodels.py#L247资源 ARN 格式为应用arn:aws:codedeploy:region:account:application:name部署组arn:aws:codedeploy:region:account:deploymentgroup:app/group部署arn:aws:codedeploy:region:account:deployment:deploymentId一个有意思的行为是部署会继承部署组的标签create_deployment时如果所属部署组带有 tags会把同样的 tags 打到部署 ARN 上models.py#L374-L379该行为由 test_deployment_inherits_tags 验证mock_aws def test_deployment_inherits_tags(): client boto3.client(codedeploy, region_nameus-west-2) app_name test-tag-inherit-app dg_name test-tag-inherit-group service_role_arn arn:aws:iam::123456789012:role/CodeDeployDemoRole client.create_application(applicationNameapp_name, computePlatformServer) client.create_deployment_group( applicationNameapp_name, deploymentGroupNamedg_name, serviceRoleArnservice_role_arn, tags[{Key: Environment, Value: Production}], ) response client.create_deployment( applicationNameapp_name, deploymentGroupNamedg_name, revision{revisionType: S3, s3Location: {bucket: b, key: k, bundleType: zip, version: 1, eTag: e}}, ) deployment_arn ( farn:aws:codedeploy:us-west-2:123456789012:deployment:{response[deploymentId]} ) response client.list_tags_for_resource(ResourceArndeployment_arn) assert response[Tags][0][Key] Environment应用与部署组自身的标签查询分别对应 test_application_tagging 与 test_deployment_group_tagging。使用前提与限制小结装饰器用法所有示例均基于from moto import mock_awsmock_aws装饰器context manager 或mock_aws.start()/stop()用法同理与 docs/docs/getting_started.rst 介绍的一致安装可用pip install moto[codedeploy]或moto[all]。能力边界只能模拟上文已实现的 16 个 API部署生命周期状态不会从Created自动流转startTime、completeTime保持None也不存在真实的 EC2/ASG 实例部署结果——如果你的测试断言部署最终变为Succeeded需要自行模拟。未实现 API 会直接失败调用清单中未勾选的 API如stop_deployment、delete_application、create_deployment_config时由于 dispatch 找不到对应 handler 会抛异常编写测试前先对照 docs/docs/services/codedeploy.rst 的清单。多区域隔离后端按account region存储BackendDict(CodeDeployBackend, codedeploy)不同 region 的客户端看到的资源互不干扰这与 test_list_deployments 等用例中显式指定region_name的写法一致。赞分享Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载相关推荐moto 中的 CloudHSM V2 模拟:API 覆盖范围、后端实现与 mock 测试实战moto 中的 CloudHSM V2 模拟:API 覆盖范围、后端实现与 mock 测试实战 本文基于 moto 仓库的服务文档 cloudhsmv2.rstMock测试Moto CodeBuild 模拟实战在测试中 Mock AWS CodeBuild 项目与构建 APIMoto CodeBuild 模拟实战在测试中 Mock AWS CodeBuild 项目与构建 API 本篇技术指南围绕 moto 仓库中 CodeBuilMock测试boto3单元测试模拟框架moto vs localstackboto3单元测试模拟框架moto vs localstack 你是否还在为AWS服务单元测试发愁本地环境搭建复杂、测试成本高、依赖外部网络本文将对比两款后端云原生上一篇go2rtc项目中流媒体连接中断问题的分析与解决下一篇致命BUG修复实录Destiny 2 Solo Enabler布尔值解析异常深度排查与架构优化方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Senparc.Weixin SDK 全平台示例导览:从 Samples/All 快速搭建微信公众号、小程序、企业微信与支付的多模块开发环境

Senparc.Weixin SDK 全平台示例导览:从 Samples/All 快速搭建微信公众号、小程序、企业微信与支付的多模块开发环境

后端即时通讯金融科技 【免费下载链接】WeiXinMPSDK 微信全平台 .NET SDK, Senparc.Weixin for C#,支持 .NET Framework 及 .NET Core、.NET 10.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 …

2026/9/25 2:41:17 阅读更多 →
Moto:用 mock_aws 在单元测试中模拟 AWS 服务的完整实践指南

Moto:用 mock_aws 在单元测试中模拟 AWS 服务的完整实践指南

Mock测试 【免费下载链接】moto A library that allows you to easily mock out tests based on AWS infrastructure. 项目地址: https://gitcode.com/gh_mirrors/mo/moto 点击查看 免费下载 Moto 是一个让你在测试中轻松模拟(mock)AWS 服务…

2026/9/25 2:41:17 阅读更多 →
使用 Windows.Devices.Sensors.Pedometer API 构建 UWP 计步应用:Pedometer 示例全场景解析

使用 Windows.Devices.Sensors.Pedometer API 构建 UWP 计步应用:Pedometer 示例全场景解析

示例工程 【免费下载链接】Windows-universal-samples API samples for the Universal Windows Platform. 项目地址: https://gitcode.com/gh_mirrors/wi/Windows-universal-samples 点击查看 免费下载 本指南围绕 Windows-universal-samples 仓库中的 Pedometer 示…

2026/9/25 2:40:16 阅读更多 →

最新新闻

MCP Streamable HTTP 传输的 SSE 轮询机制:SEP-1699 服务端主动断开(Server-Side Disconnect)规范解读

MCP Streamable HTTP 传输的 SSE 轮询机制:SEP-1699 服务端主动断开(Server-Side Disconnect)规范解读

人工智能AI Agent工具调用 【免费下载链接】specification Specification and documentation for the Model Context Protocol 项目地址: https://gitcode.com/gh_mirrors/specification2/specification 点击查看 免费下载 导读:SEP-1699(St…

2026/9/25 3:27:48 阅读更多 →
Loop Engineering 研究与实践:oh-my-opencode-slim 的五块积木、Ralph 循环与最小闭环

Loop Engineering 研究与实践:oh-my-opencode-slim 的五块积木、Ralph 循环与最小闭环

人工智能AI AgentAgent 编排AI 技能 【免费下载链接】oh-my-opencode-slim Lean, fine tuned Opencode multi agent suite Mix any models Auto delegate tasks 项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-opencode-slim 点击查看 免费下载 本文以仓库内…

2026/9/25 3:27:48 阅读更多 →
Humanizer 文化感知字符串转换:ICulturedStringTransformer 接口深度指南

Humanizer 文化感知字符串转换:ICulturedStringTransformer 接口深度指南

开发工具 【免费下载链接】Humanizer Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities 项目地址: https://gitcode.com/gh_mirrors/hu/Humanizer 点击查看 免费下载 导读 …

2026/9/25 3:27:48 阅读更多 →
如何修复MobaXterm-Chinese的显示难题:深浅主题切换与高分屏错位一步解决

如何修复MobaXterm-Chinese的显示难题:深浅主题切换与高分屏错位一步解决

如何修复MobaXterm-Chinese的显示难题:深浅主题切换与高分屏错位一步解决 【免费下载链接】Mobaxterm-Chinese Mobaxterm simplified Chinese version. Mobaxterm 的简体中文版. 项目地址: https://gitcode.com/gh_mirrors/mo/Mobaxterm-Chinese MobaXterm-C…

2026/9/25 3:27:48 阅读更多 →
深入解读 Mosquitto 1.2.2 发布:Broker 流控与客户端 Inflight 计数的缺陷修复

深入解读 Mosquitto 1.2.2 发布:Broker 流控与客户端 Inflight 计数的缺陷修复

物联网消息队列后端网络/通信 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mo/mosquitto 点击查看 免费下载 Eclipse Mosquitto 1.2.2 是一次纯缺陷修复发布(2013-10-21&…

2026/9/25 3:27:48 阅读更多 →
眼动模块串口接线指南:P1/P2/P8/P12/P15/P16引脚怎么选?软硬串口一文讲清

眼动模块串口接线指南:P1/P2/P8/P12/P15/P16引脚怎么选?软硬串口一文讲清

眼动模块串口接线指南:P1/P2/P8/P12/P15/P16引脚怎么选?软硬串口一文讲清 【免费下载链接】eye-tracking-module 源师兄扩展项目: 眼动模块 | 由源师兄组织创建 项目地址: https://gitcode.com/yuanshixiong/eye-tracking-module 眼动模块&#x…

2026/9/25 3:26:48 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →