Moto CodeBuild 模拟实战:在测试中 Mock AWS CodeBuild 项目与构建 API
Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载本篇技术指南围绕 moto 仓库中 CodeBuild 服务文档 展开系统梳理 moto 当前对 AWS CodeBuild API 的模拟覆盖范围并结合 models.py 与 responses.py 的源码实现讲解如何基于mock_aws装饰器在单元测试中创建构建项目、启动构建、查询构建详情与停止构建以及各 API 的参数校验规则和构建生命周期模拟机制。一、当前 API 实现覆盖情况CodeBuild 服务文档 以清单形式列出了该服务所有 API 的实现状态。截至目前已实现[X]的接口共 9 个API说明batch_get_builds按构建 ID 批量获取构建详情batch_get_projects按项目名或 ARN 批量获取项目元数据create_project创建构建项目delete_project删除构建项目list_builds列出当前账户/区域下所有构建 IDlist_builds_for_project列出指定项目的构建历史 IDlist_projects列出所有项目名称start_build对指定项目启动一次构建stop_build停止一个指定构建文档中其余接口如update_project、retry_build、start_build_batch、create_fleet、update_webhook、import_source_credentials等均未实现。因此如果你的测试代码依赖上述未列出的 APImoto 尚无法接管这些调用需要评估改造测试逻辑或等待社区补齐。二、快速上手用 boto3 模拟 CodeBuild 全流程以下示例改编自仓库官方测试 test_codebuild.py覆盖了创建项目、启动构建、查询构建详情、停止构建和删除项目的完整链路。import boto3 import pytest from botocore.exceptions import ClientError from moto import mock_aws from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID mock_aws def test_codebuild_lifecycle(): client boto3.client(codebuild, region_nameeu-central-1) source {type: S3, location: bucketname/path/file.zip} artifacts {type: NO_ARTIFACTS} environment { type: LINUX_CONTAINER, image: contents_not_validated, computeType: BUILD_GENERAL1_SMALL, } service_role farn:aws:iam::{ACCOUNT_ID}:role/service-role/my-codebuild-service-role # 1. 创建项目 project client.create_project( namesome_project, sourcesource, artifactsartifacts, environmentenvironment, serviceRoleservice_role, tags[{key: k1, value: v1}], )[project] assert project[name] some_project assert project[tags] [{key: k1, value: v1}] # 2. 启动构建可指定 sourceVersion / artifactsOverride 覆盖 build client.start_build(projectNamesome_project)[build] assert build[currentPhase] QUEUED # 3. 查询构建历史并获取构建详情 ids client.list_builds_for_project(projectNamesome_project)[ids] detail client.batch_get_builds(idsids)[builds][0] assert detail[currentPhase] COMPLETED assert detail[buildStatus] SUCCEEDED # 4. 停止构建 stopped client.stop_build(idids[0])[build] assert stopped[buildStatus] STOPPED # 5. 删除项目后再查询构建历史将抛 ResourceNotFoundException client.delete_project(namesome_project) with pytest.raises(ClientError) as err: client.list_builds_for_project(projectNamesome_project) assert err.value.response[Error][Code] ResourceNotFoundException运行前提安装 motopip install moto[server]视使用方式而定并配置 boto3。mock_aws装饰器接管期间所有发往codebuild.{region}.amazonaws.com域名的请求都会被路由到本地内存后端无需真实 AWS 凭据账户 ID 使用 moto 默认的DEFAULT_ACCOUNT_ID。三、请求路由与服务端点urls.py 定义了 moto 拦截 CodeBuild 请求的域名模式url_bases [rhttps?://codebuild\.(.)\.amazonaws\.com] url_paths {{0}/$: CodeBuildResponse.dispatch}即只要 boto3 客户端以 region 形式指向 CodeBuild 端点如codebuild.eu-central-1.amazonaws.com请求体就会交由 CodeBuildResponse 分发。exceptions.py 则定义了模拟服务端会抛出的三类 JSON 错误均继承自 moto 核心层的JsonRESTErrorHTTP 状态码统一为 400InvalidInputException参数非法名称、源类型、构建 ID 等ResourceNotFoundException项目或构建不存在ResourceAlreadyExistsException重复创建同名项目。四、create_project 的参数校验规则responses.py 中的create_project入口在执行前会依次调用五组校验函数这些规则决定了你在测试里构造请求参数时的合法取值范围1. 项目名_validate_required_params_project_name长度不得达到 150 字符len(name) 150即拒绝必须以字母开头、不能以特殊符号结尾正则要求名称只含字母数字、连字符与下划线见 responses.py#L78-L87。2. 源代码_validate_required_params_sourcesource.type必须是以下枚举之一BITBUCKET、CODECOMMIT、CODEPIPELINE、GITHUB、GITHUB_ENTERPRISE、NO_SOURCE、S3source.location必须存在且非空。3. 服务角色_validate_required_params_service_roleserviceRole必须以arn:{partition}:iam::{当前账户ID}:role/为前缀即角色 ARN 中的账户 ID 必须与调用者账户一致否则抛InvalidInputException。4. 构建产物_validate_required_params_artifactsartifacts.type必须是CODEPIPELINE、S3或NO_ARTIFACTS若类型为NO_ARTIFACTS则不允许再携带location字段其余类型必须提供非空location。5. 构建环境_validate_required_params_environmentenvironment.type支持WINDOWS_CONTAINER、LINUX_CONTAINER、LINUX_GPU_CONTAINER、ARM_CONTAINERenvironment.computeType支持BUILD_GENERAL1_SMALL、BUILD_GENERAL1_MEDIUM、BUILD_GENERAL1_LARGE、BUILD_GENERAL1_2XLARGE。此外若同区域已存在同名项目create_project会直接抛出ResourceAlreadyExistsException这一点在测试 test_codebuild_create_project_when_exists 中有对应断言。五、项目与构建的内存数据模型models.py 用三个核心结构维护全部状态均挂载在按区域隔离的codebuild_backendsBackendDict上codebuild_projects: dict[str, CodeBuild]项目名到项目对象的映射build_history: dict[str, list[str]]项目名到构建 ID 列表的映射构建历史build_metadata / build_metadata_history最新构建元数据及其历史副本。CodeBuild对象models.py#L94-L150会在构造时生成项目 ARNarn:{partition}:codebuild:{region}:{account}:project/{name}、把非 ARN 形式的serviceRole自动补全为 IAM 角色 ARN并把description、tags、cache默认{type: NO_CACHE}、timeoutInMinutes、queuedTimeoutInMinutes、sourceVersion、logsConfig、vpcConfig等可选字段写入project_metadata供batch_get_projects原样返回。batch_get_projects同时支持传入项目名或项目 ARN 两种寻址方式可在 test_codebuild_batch_get_projects 中验证。六、构建生命周期从 QUEUED 到 COMPLETEDstart_build是模拟构建的核心入口其实现细节值得逐点理解构建 ID 生成{project_name}:{uuid4}格式models.py#L226这也是为什么batch_get_builds、stop_build都强制要求 ID 中包含冒号——不含冒号的 ID 会触发InvalidInputException见_validate_required_params_id。初始状态CodeBuildProjectMetadata会把构建初始化为currentPhase QUEUED、buildStatus IN_PROGRESSsourceVersion未指定时回退为refs/heads/main并填充一套固定的source、environment、logs、phasesSUBMITTED QUEUED等字段models.py#L41-L59。状态推进调用batch_get_builds查询某个构建时后端会触发_set_phasesmodels.py#L248-L276把QUEUED阶段置为SUCCEEDED并追加PROVISIONING、DOWNLOAD_SOURCE、INSTALL、PRE_BUILD、BUILD、POST_BUILD、UPLOAD_ARTIFACTS、FINALIZING、COMPLETED共 9 个阶段加上初始 2 个阶段总计 11 个整体状态改为currentPhase COMPLETED、buildStatus SUCCEEDEDendTime取startTime之后 1~5 分钟的随机值。测试 test_codebuild_batch_get_builds_1_project 正是断言了phases数量为 11、buildNumber为整数。stop_build 的差异stop_build 走同样的阶段推进逻辑但将最终buildStatus置为STOPPED而非SUCCEEDED同样会补齐endTime。需要特别注意的模拟语义构建“完成”是惰性触发的——只有在查询batch_get_builds或停止stop_build时才把状态从 IN_PROGRESS 推进到终态且stop_build返回的是STOPPED状态这与真实 CodeBuild 中“停止后进入 FINALIZING 再置 STOPPED”的过程有简化差异编写断言时应以仓库测试的行为为准。七、边界行为与测试依据tests/test_codebuild/test_codebuild.py 覆盖了上述所有边界情况可作为编写断言时的参照无效输入名称超长、名称以!开头、服务角色 ARN 账户不匹配均抛InvalidInputExceptiontest_codebuild_create_project_with_invalid_inputs项目不存在时启动构建start_build抛ResourceNotFoundExceptiontest_codebuild_start_build_no_project多次构建累积对同一项目连续三次start_buildlist_builds返回 3 个 IDtest_codebuild_start_build_multiple_times构建覆盖参数start_build支持sourceVersion与artifactsOverride透传到构建元数据test_codebuild_start_build_with_overrides删除项目级联delete_project会同时清理该项目的构建元数据与项目记录之后list_builds_for_project抛ResourceNotFoundExceptiontest_codebuild_delete_project。八、小结与使用建议moto 的 CodeBuild 模拟聚焦“项目 CRUD 构建生命周期”这一最常用的测试场景9 个已实现 API 足以支撑 CI 流水线集成、构建状态轮询类逻辑的离线测试。使用时的三条建议只使用文档清单中标记为已实现的 API避免在update_project等未实现接口上投入改造成本断言构建状态时区分“start_build返回的初始 QUEUED 状态”与“batch_get_builds查询后的终态 SUCCEEDED”项目名、源类型、计算类型等参数必须严格匹配上文第四节的枚举与正则规则否则会触发与真实 AWS 一致的错误码语义InvalidInputException/ResourceNotFoundException/ResourceAlreadyExistsException。相关源码入口服务实现、请求分发与校验、异常定义、URL 路由、完整测试用例、API 覆盖清单。赞分享Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载相关推荐AWS CLI codebuild retry-build-batch 实战指南重试失败的 CodeBuild 批量构建AWS CLI codebuild retry build batch 实战指南重试失败的 CodeBuild 批量构建 导读 本文聚焦 AWS CLI 的开发工具云原生运维aws-cli 实战用 codebuild batch-get-builds 批量查询 AWS CodeBuild 构建详情aws cli 实战用 codebuild batch get builds 批量查询 AWS CodeBuild 构建详情 本篇技术指南聚焦 AWS CLI开发工具云原生运维AWS CLI 实战使用 codebuild delete-webhook 删除 CodeBuild 项目的 Webhook 构建触发器AWS CLI 实战使用 codebuild delete webhook 删除 CodeBuild 项目的 Webhook 构建触发器 导读 本文围绕 AW开发工具云原生运维上一篇Qwen3-VL-30B-A3B-Thinking-FP82025开源多模态大模型的性能革命下一篇Timefold Solver性能优化指南让你的规划问题求解速度提升10倍创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

并行加法器 vs 先行进位加法器:进位延迟、关键路径与工程实现

并行加法器 vs 先行进位加法器:进位延迟、关键路径与工程实现

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

2026/9/25 3:31:50 阅读更多 →
grammars-v4 中 R 语言 ANTLR 语法解析指南:掌握 RFilter 换行符预处理机制

grammars-v4 中 R 语言 ANTLR 语法解析指南:掌握 RFilter 换行符预处理机制

编程语言编译器开发工具 【免费下载链接】grammars-v4 Grammars written for ANTLR v4; expectation that the grammars are free of actions. 项目地址: https://gitcode.com/gh_mirrors/gr/grammars-v4 点击查看 免费下载 导读 在 grammars-v4 仓库的 r 目录下&…

2026/9/25 3:31:50 阅读更多 →
VoltAgent 接入 Deep Infra:使用 `deepinfra/<model>` 模型路由打通低成本高性能推理

VoltAgent 接入 Deep Infra:使用 `deepinfra/<model>` 模型路由打通低成本高性能推理

人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆 【免费下载链接】voltagent AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework 项目地址: https://gitcode.com/gh_mirrors/vo/voltagent 点击查看 免费下载 De…

2026/9/25 3:31:50 阅读更多 →

最新新闻

使用 Sinon 对 ES Module 导入进行 Stub:esm 包与 mutableNamespace 完整实战指南

使用 Sinon 对 ES Module 导入进行 Stub:esm 包与 mutableNamespace 完整实战指南

测试开发工具 【免费下载链接】sinon Test spies, stubs and mocks for JavaScript. 项目地址: https://gitcode.com/gh_mirrors/si/sinon 点击查看 免费下载 ES Modules(ESM)的绑定是**静态解析、实时(live)且不可变…

2026/9/25 5:41:31 阅读更多 →
RT-Thread 在 QEMU VExpress-A9 上的运行指南:BSP 编译、启动脚本、SD 卡文件系统与调试全解析

RT-Thread 在 QEMU VExpress-A9 上的运行指南:BSP 编译、启动脚本、SD 卡文件系统与调试全解析

操作系统嵌入式物联网嵌入式OSRTOS 【免费下载链接】rt-thread RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/ 项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread 点击查看 免费下载 本文围绕…

2026/9/25 5:41:31 阅读更多 →
GoogleTest Matchers 完全参考:用 gperftools 项目中的 gmocking 匹配器写出可读、可复用的断言

GoogleTest Matchers 完全参考:用 gperftools 项目中的 gmocking 匹配器写出可读、可复用的断言

性能剖析内存管理开发工具 【免费下载链接】gperftools Main gperftools repository 项目地址: https://gitcode.com/gh_mirrors/gp/gperftools 点击查看 免费下载 Matchers(匹配器)是 GoogleTest / GoogleMock 中用于校验单个参数的利器&am…

2026/9/25 5:41:31 阅读更多 →
jc --needrestart:把 needrestart -b 的开机重启建议输出转换为 JSON/YAML 的解析器

jc --needrestart:把 needrestart -b 的开机重启建议输出转换为 JSON/YAML 的解析器

开发工具 【免费下载链接】jc CLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.…

2026/9/25 5:41:31 阅读更多 →
AMD官网下载Vivado遇合规性失败?全流程排查与解决指南

AMD官网下载Vivado遇合规性失败?全流程排查与解决指南

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

2026/9/25 5:41:31 阅读更多 →
Atlas 300V 24G跑YOLO全流程:从环境搭建到推理优化

Atlas 300V 24G跑YOLO全流程:从环境搭建到推理优化

干了这么多年AI部署,说实话被各种推理卡折磨过不少回,Atlas 300V 24G 这张卡算是让我印象比较深的一张。一开始单纯以为它就是一张普通的 PCIe 加速卡,结果从驱动到算子适配到模型转换,每一步都有它自己的脾气。这篇文章就围绕 At…

2026/9/25 5:40:31 阅读更多 →

日新闻

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 阅读更多 →