ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Moto CodeBuild 模拟实战:在测试中 Mock AWS CodeBuild 项目与构建 API

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),仅供参考
返回列表