由James Beswick撰写于2023年11月16日,发布于亚马逊EventBridge、AWS无服务器应用模型、AWS状态机和无服务器
AWS 于今日宣布公开预览发布 AWS集成应用测试工具包 (IATK)。该工具包是一个帮助您为基于云的应用程序编写自动化测试的软件库。
本文将介绍 IATK 的几个初始功能,并以示例视频处理应用程序为例展示具体用法。若您刚开始进行无服务器测试,可访问 serverlesslandcom/testing 了解更多信息。
随着对无服务器服务的应用如 AWS Lambda、亚马逊EventBridge 和 AWS状态机的构建,许多组件无法在本地展开,只能存在于 AWS 云中。与本地部署的应用相反,这类应用通过云策略进行自动化测试。AWS IATK 旨在帮助您实施这些策略并支持 Python 应用程序,未来将支持其他语言。
编写对于云资源的自动化测试,您需要获取物理 ID。物理 ID 是 AWS 为资源创建后的名称。例如,要向 亚马逊API网关 发送请求,您需要物理 ID 作为 API 端点。
如果在不同的基础设施代码堆栈中部署云资源,可能会难以定位物理 ID。在 CloudFormation 中,您创建了模板中的逻辑 ID 以及堆栈名称。使用 IATK,只需提供逻辑 ID 和堆栈名称即可获取资源的物理 ID。此外,只需提供堆栈名称即可获取堆栈输出。这些便利的方法简化了位置资源的过程。
为事件驱动架构编写集成测试时,通过将应用程序划分为子系统来建立逻辑边界。子系统应简单易懂,且包含可理解的输入和输出。一种有用的测试子系统的技术是创建测试工具。测试工具是为特定测试子系统而创建的资源。
例如,集成测试可以通过对子系统传递输入测试事件来启动过程。IATK 可以为您创建一个监听亚马逊EventBridge输出事件的测试工具底层构造由一个 EventBridge 规则组成,将输出事件转发到亚马逊简单队列服务。接着,集成测试查询测试工具以检查输出,从而判断测试是否通过。这些工具帮助您在云中对事件驱动架构进行集成测试。
如果您编写的是同步服务,您在自动化测试中会立即获取请求响应。当架构采用异步方式时,服务接收请求,稍后进行一系列操作。如何在没有规定时限的情况下测试活动是否成功?
建议为异步系统设置合理的超时间隔,并将其记录为服务水平协议 (SLA)。您可以选择将 SLA 公开发布,或作为内部标准进行记录。IATK 包含一个轮询功能,允许您建立超时间隔,这有助于测试异步系统是否及时完成任务。
如果您希望获得应用程序内部细节的更高可见性,可以利用 AWS XRay。通过 AWS XRay,您可以追踪事件在多个服务中的路径。IATK 提供便利功能,帮助您设置 AWS XRay 采样率,获取跟踪树和断言跟踪持续时间。这些功能有助于更深入地观察和测试分布式系统。
为演示 IATK 的功能,本文使用了一个设计为插件架构的无服务器视频应用程序的一部分。核心开发团队负责主应用程序,分布式开发团队则负责插件的创建。一个 AWS CloudFormation 堆栈部署主应用,而各个插件则由独立的堆栈进行部署。
主应用和插件之间的通信由 EventBridge 总线管理。插件从总线中提取生命周期事件,并须在 20 秒内将完成通知事件重新放回总线。核心团队创建了一个 AWS 状态机工作流,该工作流通过发出格式正确的示例生命周期事件来模拟生产过程。开发人员在开发和测试环境中运行此测试工作流,以验证他们的插件与事件总线之间的通信是否正常。
以下演示展示了对示例应用程序的集成测试,以验证插件行为。在集成测试中,IATK 定位到状态机工作流,并创建一个测试工具,监听由插件发送的事件完成通知。测试运行工作流以启动生命周期过程并开始插件操作。然后,IATK 使用带有超时的轮询机制验证插件是否遵循 20 秒的服务水平协议。处理的顺序如下:
集成测试启动测试工作流的执行。工作流将生命周期事件放入总线上。插件从总线上提取生命周期事件。插件完成后,将完成事件放回总线上。集成测试对完成事件进行轮询,以确认测试是否在 SLA 内通过。请按照以下步骤回顾此应用程序,在本地构建、在您的 AWS 账户中部署并测试它:
bash git clone https//githubcom/awssamples/serverlesstestsamples
IATK 示例应用程序的根目录位于 pythontestsamples/integratedapplicationtestkit。进入此目录:bash cd serverlesstestsamples/pythontestsamples/integratedapplicationtestkit
在部署应用程序之前,请打开 plugins/2postvalidateplugins/pythonminimalplugin/tests/integration/testbypollingpy 文件,查看集成测试如何使用 IATK。测试类在文件顶部实例化 IATK。
pythoniatkclient = awsiatkAwsIatk(region=awsregion)
在 setUp() 方法中,测试类使用 IATK 获取 CloudFormation 堆栈输出。该输出是已部署云组件的引用,例如插件测试器 AWS 状态机 工作流:
pythonstackoutputs = selfiatkclientgetstackoutputs( stackname=selfplugintesterstackname outputnames=[ PluginLifecycleWorkflow PluginSuccessEventRuleName ])
测试类使用定义在堆栈输出中的事件规则附加一个监听器至默认事件总线。测试稍后会使用此监听器对事件进行轮询。
pythonaddlisteneroutput = selfiatkclientaddlistener( eventbusname=default rulename=selfexistingrulename)
测试类在 tearDown() 方法中清理监听器。
pythonselfiatkclientremovelisteners( ids=[selflistenerid])
一旦配置完成,testminimalplugineventpublishedpolling() 方法实现了实际测试。

测试首先初始化触发事件。
pythontriggerevent = { eventHook postValidate pluginTitle PythonMinimalPlugin}
接着,测试启动插件测试器状态机工作流的执行。它使用在 setUp 中获取的 plugintesterarn。
pythonselfstepfunctionsclientstartexecution( stateMachineArn=selfplugintesterarn input=jsondumps(triggerevent))
测试对监听器进行轮询,等待插件发出事件。它在超时超过 SLA 或达到最大消息数限制时停止轮询。
pythonpolloutput = selfiatkclientpollevents( listenerid=selflistenerid waittimeseconds=selfSLATIMEOUTSECONDS maxnumberofmessages=1)
最后,测试断言接收到的事件数量是否正确,并且格式是否良好。
pythonselfassertEqual(len(polloutputevents) 1)selfassertEqual(receivedevent[source] videopluginPythonMinimalPlugin)selfassertEqual(receivedevent[detailtype] plugincomplete)
构建此示例应用程序需要以下先决条件。
一个 AWS 账户安装 AWS无服务器应用模型 (AWS SAM) CLI,并具有管理 AWS 资源的凭据。Python 311Nodejs 18xDocker可选,但建议用于使用 AWS SAM 构建 Python 应用程序bash cd plugins/plugintester # 转到插件测试器目录 sam build usecontainer # 构建插件测试器
部署测试器:bash sam deploy guided # 部署插件测试器
一旦插件测试器部署成功,使用 AWS SAM 部署插件。bash cd /2postvalidateplugins/pythonminimalplugin # 转到插件目录 sam build usecontainer # 构建插件
部署插件:bash sam deploy guided # 部署插件
您可以使用标准 Python 测试运行器例如 unittest 和 pytest运行用 IATK 编写的测试。示例应用程序的测试使用 unittest。
使用 虚拟环境 来组织依赖项。从示例应用程序的根目录运行:bash python3 m venv venv # 创建虚拟环境 source venv/bin/activate # 激活虚拟环境
安装依赖项,包括 IATK:bash cd tests pip3 install r requirementstxt
运行测试,提供之前部署的必需环境变量。您可以在 plugintester 目录的 samconfigtoml 文件中找到正确的值。bash cd integration PLUGINTESTERSTACKNAME=videoplugintester AWSREGION=uswest2 python3 m unittest /testbypollingpy
您应该会看到 unittest 运行测试的输出。
在您的 AWS 账户中打开 AWS 状态机控制台,然后选择 PluginLifecycleWorkflowlt随机值gt 工作流以确认插件测试器成功运行。最新的执行显示为 成功 状态。
示例应用程序还展示了 IATK 的其他功能,如生成模拟事件和检索 AWS XRay 跟踪。
使用 AWS SAM 清理 AWS 账户中的插件及插件测试器资源。
删除插件资源:bash cd / # 转到插件目录 sam delete # 删除插件
删除插件测试器资源:bash cd //plugintester # 转到插件测试器目录 sam delete # 删除插件测试器
IATK 在测试过程中创建的临时测试工具资源将在 tearDown 方法运行时进行清理。如果在拆解过程中出现问题,某些资源可能无法被删除。IATK 为所有创建的资源添加标签,您可以使用这些标签进行查找 资源并手动将其删除。您也可以添加您自己的标签。
AWS集成应用测试工具包是一个软件库,提供便利功能,帮助您为云应用程序编写自动测试。本文展示了 IATK 初始 Python 版本的一些功能。
要了解更多有关无服务器应用程序自动化测试的信息,访问 serverlesslandcom/testing。您还可以在 serverlesslandcom/testing/patterns 或 AWS serverlesstestsamples 存储库 上查看代码示例。
加速器永久免费版官网欲获取更多无服务器学习资源,请访问 Serverless Land。
标签 贡献、无服务器
01-27
解开您的组织“乱麻”:高度对齐 云企业战略博客
解开组织混乱:高度一致的策略关键要点组织一致性 对于确保公司的目标和优先事项得到广泛理解至关重要。从 自上而下的目标设定 转变为意图传达能提升员工的参与感和理解。通过 相对指标 而非绝对指标来明确目标...
01-27
在 Amazon RDS 增强监控操作系统指标上设置 Amazon CloudWatch 警报 数据
在 Amazon RDS 增强监控 OS 指标上设置 Amazon CloudWatch 告警作者:Sameer Kumar Deepak Sharma Chaitanya Gummadi 和 Nir...
01-27
使用 AWS 弹性灾难恢复保护 Hyper
使用 AWS 弹性灾难恢复保护 HyperV 工作负载关键要点灾难恢复DR对于任何希望在发生如洪水、停电或勒索软件攻击等灾难时维护业务连续性的组织至关重要。AWS 弹性灾难恢复提供了涵盖物理和虚拟基础...
01-27
介绍 AWS 集成应用测试工具包 (IATK) 计算博客
AWS集成应用测试工具包 (IATK) 简介由James Beswick撰写于2023年11月16日,发布于亚马逊EventBridge、AWS无服务器应用模型、AWS状态机和无服务器关键要点AWS ...