AWS 文档 SDK 示例仓库 PHP 代码测试生成指南:PHPUnit、MockHandler 与集成测试的完整实践
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载本文是 aws-doc-sdk-examples 仓库中 PHP 技术规范steering_docs/php-tech 的测试生成指南解读。它定义了在该仓库的 PHP 目录php/下为 AWS 代码示例编写测试套件的统一标准使用 PHPUnit 作为测试框架、以 AWS SDK for PHP 的MockHandler完成单元测试中的客户端模拟、通过group注解区分单元与集成测试并覆盖完整 AWS 数据结构与全部错误条件。读完本文你将能按照仓库规范独立产出可运行、可维护、可被phpunit直接执行的 PHP 测试文件与phpunit.xml配置同时掌握如何复用testable_readline实现命令行交互代码的自动化测试。一、测试生成的目标与硬性要求PHP 测试生成的总体目标是基于 PHPUnit 框架生成包含单元测试与集成测试的完整测试套件并在测试中使用正确的模拟方式与完整的 AWS 数据结构。其核心要求可以归纳为四点数据完整Complete Data测试中必须使用完整的 AWS 数据结构例如完整填充Buckets、Items、Labels等响应字段不能使用残缺的占位数据否则无法验证 SDK 客户端与业务代码之间的真实契约。注解规范Proper Attributes使用 PHPUnit 注解group unit、group integ对测试进行分类便于按组过滤执行。错误覆盖Error Coverage测试规范SPECIFICATION中列出的所有错误条件都必须有对应的测试用例。模拟框架Mock Framework单元测试统一使用 AWS SDK 自带的MockHandler来模拟客户端响应避免单元测试真正访问 AWS 网络端点。仓库中的真实示例正是这一标准的落点例如 php/example_code/iam/tests/IAMBasicsTest.php 同时承载group integ的集成测试直接驱动GettingStartedWithIAM.php运行与group unit的单元测试直接调用服务类方法并断言返回结构可对照阅读。二、强制第一步知识库咨询Knowledge Base Consultation规范强调在任何代码生成之前必须先完成知识库咨询否则会产生错误的代码结构文档原文警告FAILURE TO COMPLETE KNOWLEDGE BASE CONSULTATION WILL RESULT IN INCORRECT CODE STRUCTURE。标准流程如下# Step 1: List available knowledge bases ListKnowledgeBases() # Step 2: Query coding standards (REQUIRED) QueryKnowledgeBases(coding-standards-KB, PHP-code-example-standards) # Step 3: Query implementation patterns (REQUIRED) QueryKnowledgeBases(PHP-premium-KB, PHP implementation patterns testing) # Step 4: AWS service research (REQUIRED) search_documentation(What is [AWS Service] and what are its key API operations?) read_documentation(https://docs.aws.amazon.com/[service]/latest/[relevant-page])其中前三步列出知识库、查询编码标准、查询实现模式与第四步检索目标 AWS 服务的关键 API 操作与官方文档均为必选项。这条规则背后的理由是PHP 示例代码必须与 AWS SDK 的真实 API 形态保持一致而编码规范与实现模式决定了测试文件的组织方式因此生成测试前必须对齐这两类输入。三、测试文件目录结构每个服务的测试统一放在该服务示例代码目录下的tests/子目录中php/example_code/{service}/tests/ ├── {Service}Test.php # 单元与集成测试 └── phpunit.xml # PHPUnit 配置以仓库实际目录印证php/example_code/iam/tests/包含IAMBasicsTest.php与IAMServiceTest.php两个测试文件对应的phpunit.xml位于 php/example_code/iam/phpunit.xml。php/applications/photo_asset_manager/tests/包含PAMDetectLabelsTest.php、PAMDownloadTest.php、PAMLabelsTest.php、PAMUploadTest.php四个测试文件其配置在 php/applications/photo_asset_manager/phpunit.xml。此外仓库根目录还提供了汇总配置 php/phpunit.xml通过两个 testsuitescenarios与applications使用目录通配符一次性扫描example_code/*/*/tests/、example_code/*/tests/与applications/*/tests/下的全部测试并在coverage中排除vendor与tests目录本身。这说明每个服务一个phpunit.xml与根级聚合配置两种组织方式可以共存。四、PHPUnit 配置phpunit.xml规范给出了强制性的phpunit.xml结构核心要点是 bootstrap 指向../vendor/autoload.php、开启颜色输出、把 PHP 的 errors/notices/warnings 全部转换为异常并让 testsuite 扫描当前目录同时通过groups显式纳入unit与integ两个分组?xml version1.0 encodingUTF-8? phpunit bootstrap../vendor/autoload.php colorstrue convertErrorsToExceptionstrue convertNoticesToExceptionstrue convertWarningsToExceptionstrue processIsolationfalse stopOnFailurefalse testsuites testsuite nameunit directory./directory /testsuite /testsuites groups include groupunit/group groupinteg/group /include /groups /phpunit参数含义速查属性取值作用bootstrap../vendor/autoload.php先加载 Composer 自动加载器使Aws\*与PHPUnit\Framework\*类可解析依赖须已通过composer install安装colorstrue终端输出彩色结果便于快速区分通过/失败/跳过convertErrorsToExceptionstrue把 PHP Error 转换为异常抛出convertNoticesToExceptionstrue把 PHP Notice 转换为异常抛出convertWarningsToExceptionstrue把 PHP Warning 转换为异常抛出processIsolationfalse测试不在独立进程中运行加快执行速度stopOnFailurefalse遇到第一个失败不停止完整跑完所有测试groupsincludeunit、integ纳入这两个分组再配合命令行--group即可实现按类型过滤仓库中的真实配置与规范模板略有差异但同源。例如 php/example_code/iam/phpunit.xml 增加了executionOrderdepends,defects、beStrictAboutTodoAnnotatedTeststrue、verbosetrue等严格模式选项并使用testsuite nameiamdirectorytests/directory/testsuite把 testsuite 收敛到本服务目录同时通过coverageexclude排除vendor。这说明规范模板是最低基线实际项目可按需开启更严格的检查。五、测试类骨架MockHandler ServiceClass规范的测试类骨架把 AWS SDK 的MockHandler注入客户端让每个测试方法都能以追加预期响应 → 调用业务方法 → 断言结果的方式运行?php // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 use PHPUnit\Framework\TestCase; use Aws\MockHandler; use Aws\Result; use Aws\CommandInterface; use Psr\Http\Message\RequestInterface; class ServiceTest extends TestCase { private $mockHandler; private $service; protected function setUp(): void { $this-mockHandler new MockHandler(); $this-service new ServiceClass([ handler $this-mockHandler, region us-east-1 ]); } /** * group unit */ public function testHelloService(): void { $this-mockHandler-append(new Result([Buckets []])); $result $this-service-helloService(); $this-assertIsArray($result); } /** * group integ */ public function testIntegrationExample(): void { // Integration test with real AWS service $result $this-service-realServiceCall(); $this-assertNotNull($result); } }要点拆解setUp()中构造被测对象每个测试方法执行前都会重建MockHandler与ServiceClass避免用例间状态泄漏。handler $this-mockHandler这是 AWS SDK for PHP 客户端配置项指示客户端把请求交给 MockHandler 而不是真实的 HTTP 传输层。region us-east-1客户端必须显式设置区域。这既是 SDK 实例化的必要参数也直接对应规范Common Test Failures中忘记设置 AWS region的常见错误。append(new Result([...]))把期望的 AWS 响应Aws\Result按调用顺序追加进队列客户端每发起一次请求就消费一个。group unit/group integ分别标记单元测试与集成测试是后续按组执行与纳入/排除的依据。从实现原理看Aws\MockHandler位于 AWS SDK for PHP 的核心 handler 体系中当传入的 handler 是 MockHandler 时SDK 的 handler 栈会直接从中取出预设结果返回从而完全绕开对真实 AWS 端点的网络调用——这正是单元测试快、稳、不依赖凭据的根本原因。六、单元测试模式数据提供器 错误条件全覆盖单元测试模式的核心是用dataProvider驱动同一动作、多条件的用例矩阵并通过MockHandler-append分别注入成功响应与AwsException实现对成功分支和全部错误分支的覆盖/** * group unit * dataProvider errorCodeProvider */ public function testActionWithVariousConditions(?string $errorCode): void { // Arrange $paramValue test-value; $expectedResponse new Result([ ResponseKey response-value ]); if ($errorCode null) { $this-mockHandler-append($expectedResponse); } else { $this-mockHandler-append(function (CommandInterface $cmd, RequestInterface $req) use ($errorCode) { return new \Aws\Exception\AwsException($errorCode, $cmd); }); } // Act Assert if ($errorCode null) { $result $this-service-performAction($paramValue); $this-assertEquals(response-value, $result[ResponseKey]); } else { $this-expectException(\Aws\Exception\AwsException::class); $this-service-performAction($paramValue); } } public function errorCodeProvider(): array { return [ success [null], bad_request [BadRequestException], internal_error [InternalServerErrorException], ]; }值得注意的实现细节dataProvider errorCodeProvider数据提供器返回[success [null], bad_request [BadRequestException], ...]这样的关联数组每个键对应一个可读的用例名PHPUnit 会在失败报告中以方法名 用例名的形式标识具体是哪个场景失败。成功与失败使用不同的append形态成功时直接append一个Aws\Result失败时append一个接收CommandInterface与RequestInterface的闭包闭包返回new \Aws\Exception\AwsException($errorCode, $cmd)。MockHandler 同时支持预置结果与惰性回调两种注入方式这给了错误模拟极大的灵活性。$this-expectException(AwsException::class)先声明预期异常类型再调用被测方法PHPUnit 断言该方法确实抛出该异常从而验证业务代码对错误场景的传播行为。断言的数据结构必须完整成功用例中断言$result[ResponseKey]等于response-value这就要求测试中构造的Aws\Result与真实 AWS 响应结构保持一致——这正是规范Complete Data要求的直接体现。七、集成测试模式真实服务调用与资源生命周期集成测试不注入 MockHandler而是使用真实 AWS 客户端因此必须格外关注资源清理避免在账号中留下孤儿资源。规范给出了两类集成测试范式范式一简单调用不抛异常/** * group integ */ public function testServiceIntegration(): void { // Arrange $service new ServiceClass(); // Act - This should not raise an exception $result $service-listResources(); // Assert - Verify result structure $this-assertIsArray($result); }范式二创建→使用→清理的生命周期闭环/** * group integ */ public function testResourceLifecycleIntegration(): void { // Arrange $service new ServiceClass(); $resourceId null; try { // Act - Create resource $resourceId $service-createResource(test-resource); $this-assertNotNull($resourceId); // Use resource $result $service-getResource($resourceId); $this-assertNotNull($result); } finally { // Clean up if ($resourceId ! null) { try { $service-deleteResource($resourceId); } catch (Exception $e) { // Ignore cleanup errors } } } }finally 内层try/catch的双保险是生命周期测试的关键即使测试中途断言失败finally也能保证清理逻辑必然执行而清理本身的异常被吞掉避免清理失败掩盖原始失败。仓库中的 IAMBasicsTest.php 是对这一范式的完整放大版它在类级setUpBeforeClass()创建IAMService实例在tearDownAfterClass()中逐一回收测试期间创建的 users、policies、roles先删内联/附加策略与访问密钥再删用户/角色并对IamException采用 do-while 重试直到服务端确认无残留可删。测试方法还大量使用depends注解建立用例之间的依赖传递例如testCreateRole依赖testCreateUser的返回用户验证了规范允许通过depends串联集成场景这一未在模板中展开的实战技巧。八、测试执行命令测试按分组执行命令如下单元测试phpunit --group unit集成测试phpunit --group integ全部测试phpunit当执行环境在仓库根目录时也可以直接使用汇总配置运行全部场景与应用测试phpunit -c php/phpunit.xml对应根级配置 php/phpunit.xml进入具体服务目录后则用该服务自己的phpunit.xml。执行前请确保已在对应目录完成composer install使vendor/autoload.php存在且 PHPUnit 可解析。九、可测试的交互输入testable_readline规范特别强调了一条容易被忽略的标准在命令行交互式示例中使用testable_readline函数替代原生的readline使测试可以向程序注入预定义输入值而不是阻塞等待用户从 stdin 键入。仓库对此提供了两套实现均在 php/example_code/aws_utilities/TestableReadline.php命名空间函数AwsUtilities\testable_readline($prompt)先检查全局变量$LINES若其中还有值则array_shift弹出首个值作为返回值否则回退到原生readline($prompt)。因此测试只需把输入序列预先放进全局$argv或$LINES即可让交互式示例自己完成输入。辅助函数AwsUtilities\pressEnter()封装按回车继续的提示底层同样调用testable_readline。接入方式按文件注释有两种在类头部use function AwsUtilities\testable_readline;或把../../aws_utilities/TestableReadline.php加入composer.json的files数组实现自动加载。仓库中 php/example_code/dynamodb/dynamodb_basics/GettingStartedWithDynamoDB.php、php/example_code/s3/PresignedURL.php、php/example_code/kms/KmsBasics.php 等命令行示例均已采用该机制。这一设计让交互式 CLI 示例也能被 CI 全自动驱动是 PHP 测试生成规范中与业务代码可测性强相关的配套组件。十、测试要求验收清单生成测试后按下述清单逐项核对全部通过才算合规已创建含正确 bootstrap 的PHPUnit 配置文件phpunit.xml已搭建Mock 框架单元测试使用 AWSMockHandler模拟客户端所有测试使用完整的 AWS 数据结构已使用正确的PHPUnit 注解group unit、group integ规范SPECIFICATION中的错误条件全部覆盖包含针对真实 AWS 服务调用的集成测试使用**数据提供器data providers**覆盖多个测试场景集成测试中进行恰当的清理cleanup并在tearDown()方法中妥善释放资源交互式示例改用testable_readline确保测试可注入输入十一、测试标准速查测试框架使用 PHPUnit并配合恰当的注解。集成测试用group integ注解标记。单元测试用group unit注解标记。测试命名方法名以test前缀开头并具描述性如testCreateUser、testActionWithVariousConditions。测试类型偏好优先提供集成测试覆盖Integration test coverage单元测试作为快速反馈补充。资源管理在tearDown()以及集成场景中的tearDownAfterClass()中完成清理。可测交互用testable_readline替代readline让测试传入值而非等待 stdin。十二、需要避免的常见测试失败❌ 单元测试未使用MockHandler导致测试依赖真实网络或凭据而脆弱、缓慢。❌ 单元测试中使用不完整的 AWS 数据结构无法验证真实契约。❌缺少 PHPUnit 注解导致测试无法按unit/integ分组过滤。❌未覆盖规范中的全部错误条件错误处理分支留白。❌忘记在测试客户端中设置 AWS region例如漏掉region us-east-1。❌ 集成测试不清理资源在账号中累积孤儿资源并可能产生费用。❌缺少数据提供器同一动作的多个场景只能重复复制代码。十三、仓库中的参考实现以下仓库路径可作为编写测试时的直接范本根级聚合配置php/phpunit.xmlscenarios applications 两个 testsuite自动发现全部 PHP 测试IAM 服务测试配置与实现php/example_code/iam/phpunit.xml、php/example_code/iam/tests/IAMBasicsTest.phpgroup混用、depends串联、类级tearDownAfterClass三重清理应用级单元测试php/applications/photo_asset_manager/tests/PAMLabelsTest.phpgroup unitcreateMockPHPMock组合验证getAllLabels对 DynamoDBscan返回结构的解析可测试交互组件php/example_code/aws_utilities/TestableReadline.php将本文的规范模板与上述真实文件对照阅读即可在 AWS 代码示例仓库中稳定产出风格统一、可自动执行、错误覆盖完整的 PHP 测试套件。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐CANN opbase 算子开发框架 aclOpExecutor 预留接口全解析host 侧执行上下文内部机制详解CANN opbase 算子开发框架 aclOpExecutor 预留接口全解析host 侧执行上下文内部机制详解 导读 本文聚焦 CANN opbase 算示例工程教程后端AWS SDK for PHP v3 代码示例实战指南环境搭建、示例运行、PHPUnit 测试与 Docker 容器化AWS SDK for PHP v3 代码示例实战指南环境搭建、示例运行、PHPUnit 测试与 Docker 容器化 本指南以 AWS 官方代码示例仓库中的示例工程教程后端一文读懂NVIDIA-Nemotron-3-Ultra-550B-A55B-GenRM评分机制从1到5的helpfulness分数与6级 ranking体系全解析一文读懂NVIDIA Nemotron 3 Ultra 550B A55B GenRM评分机制从1到5的helpfulness分数与6级 ranking体系全人工智能大模型模型评测上一篇基于 Rube MCP 与 Composio 实现 Hashnode 自动化awesome-codex-skills 实战指南下一篇基于分析的开源实现gh_mirrors/an/analysis_claude_code项目代码贡献指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考