## 视频
<video src="https://dev-media.amazoncloud.cn/30-LibaiGenerate/31-LiBaiRebrandingVideo/XNT308-Test_automation_for__NET_applications_running_on_AWS-LBrebrandingWCaptionCN.mp4" class="bytemdVideo" controls="controls"></video>
## 导读
软件开发人员需要在不牺牲质量的情况下快速开发新功能。随着软件的增长,构建和部署越来越复杂的代码库变得困难且容易出错。此外,开发人员使用基于云的服务以及微服务和 Serverless 应用程序,这些都无法在开发机器上测试。在本论坛中,探索可以用于测试 .NET 微服务和 Serverless 应用程序的、不同类型的自动化测试工具;还能学习如何应用自动化测试,创建支持项目成功的一致和有效的测试。
## 演讲精华
<font color = "grey">以下是小编为您整理的本次演讲的精华,共1100字,阅读时间大约是6分钟。如果您想进一步了解演讲内容或者观看演讲全文,请观看演讲完整视频或者下面的演讲原文。</font>
Helper博士,作为我们的演讲嘉宾,向我们描述了一个常见的场景:经过数不尽的夜晚开发后,应用程序终于被部署到了亚马逊云科技云上,但一启动就立即崩溃。紧接着是一段漫长的痛苦调试过程,试图找出问题所在。这是一个令人畏惧的过程:重新部署到亚马逊云科技,再次调试,仔细阅读数百行代码和数千行日志,试图找到问题,修复它,然后重复这个过程。
然而,Helpler博士还描绘了一个理想的情况,那就是通过自动化测试完全避免这种不幸的情况,从而在亚马逊云科技云部署之前就能捕捉到错误和问题。作为一名微软的专业解决方案架构师,他为亚马逊云科技客户工作,亲身经历过这些问题,并看到了这些问题给他的客户带来的困扰。
在这次演讲中,Helpler博士承诺不会展示任何新的亚马逊云科技服务,而是展示一种有效的策略和方法,以确保未来的项目不受这些问题的影响。为了说明现实生活中的例子,他将使用ASP.NET Core微服务架构,这些架构相互调用并利用亚马逊云科技服务,如Lambda[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)函数、用于存储的S3和DynamoDB数据库。他强调了在通往亚马逊云科技上部署无懈可击的应用程序的道路上,测试每个组件之间的关键相似之处和差异的重要性。
Helpler博士承认,在亚马逊云科技API上调用数十个服务的复杂微服务架构的正确测试绝非易事。一个有一个数据库的服务很简单,但是微服务涉及到许多服务相互调用,异步的SQS消息队列,Docker容器,[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)Lambda函数等等。
他概述了如何测试这些复杂的基于亚马逊云科技的系统需要结合单元测试(用于验证逻辑)、集成测试(用于验证组件之间交互)和端到端测试(用于检查从开始到结束的整个工作流程)。
从单元测试开始,他解释道,它们只关注于测试核心逻辑代码是否按预期工作。通过模拟外部亚马逊云科技依赖项,如S3和DynamoDB,并提取要测试的唯一组件,单元测试可以在亚马逊云科技云部署之前提供业务逻辑的快而隔离的验证。
他展示了一个C#单元测试示例,并解释了如何采用常见的安排-行动-断言模式使测试更具可读性。然而,他强调了需要进行多个单元测试,而不仅仅是孤立的一个测试,以便充分覆盖特定功能的各个方面。
在迁移到亚马逊云科技的Lambda函数过程中,他展示了如何通过模拟亚马逊云科技服务依赖关系并在Lambda处理程序方法内验证逻辑来实现类似的单元测试。单元测试框架能够自动管理设置和拆卸方法,使其非常适用于为每个可能运行的数千个测试以干净的方式初始化依赖项。
在过渡到集成测试阶段,Helper博士解释称,这些测试主要关注组件之间以及外部亚马逊云科技依赖项(如S3、DynamoDB或SQS)之间的交互和数据流。尽管仍然使用单元测试框架,但集成测试使用的是真实的亚马逊云科技依赖项,而非模拟或mock。
他展示了一个集成测试示例,该示例在测试设置期间设置一个真实的DynamoDB数据库连接,在测试期间对数据库进行操作,然后在之后对其进行清理。这验证了数据库访问代码可以从头到尾正常工作,而不仅仅是在模拟数据库层上。
然而,他指出,与真实亚马逊云科技依赖项一起工作时会面临一些挑战,如复杂的初始化过程可能需要几分钟时间,导致测试执行速度较慢,以及在重复使用同一DynamoDB表的情况下,测试运行之间可能存在脆弱的共享状态。
策略如Docker可以帮助管理一些依赖项,例如通过为每个测试执行旋转起隔离的容器实例。对于亚马逊云科技服务,他在每个测试中建议使用单独的资源,或者使用模仿实时亚马逊云科技环境的本地DynamoDB和S3模拟器。在实际准确性、成本、延迟和其他因素方面,存在真实亚马逊云科技服务和模拟器之间的权衡。
在处理异步SQS操作时,Helper博士建议将依赖项拆分为独立的测试,然后引入一个循环来等待预期结果,然后再进行断言——这使得测试具有确定性,而不是基于时间。这样可以避免错误的测试通过或失败。
在服务级别上,虽然单元和集成测试验证了业务逻辑和输出,但没有检验服务的触发机制和输入。这就是服务集成测试的目的,即测试单个服务的完整输入到输出工作流程。
关于ASP.NET服务的应用,他展示了如何通过编程方式启动测试实例来实现测试配置,从而使作为真实客户端的HTTP调用成为可能。在.NET 6中,使用WebApplicationFactory的方法也是一样的。与过去一样,可以通过Docker或亚马逊云科技模拟器来管理依赖项。对于外部服务,可以使用Mountebank或MockServer等工具来模拟依赖项。
最终,Helper博士阐述了端到端测试如何在实际部署好的亚马逊云科技基础设施上验证整个系统的工作流程,这与用于较低级别测试的模拟器和仿真器有所不同。他展示了一个示例测试,该测试使用亚马逊云科技SDK写入S3并验证Lambda函数的执行,从而在测试环境中实际演练生产线系统。
对于具有数十个服务和亚马逊云科技组件的复杂微服务,他建议仅对最关键的路径进行端到端测试,因为较低级别的测试更有效地覆盖了细节。
总的来说,Helper博士回顾了不同测试级别如何满足不同的需求:单元测试用于逻辑,集成测试用于交互,服务测试用于工作流程,端到端测试用于关键路径。测试不应重复覆盖——例如,单元测试可能会消除对某些集成测试的需求。
测试金字塔概念为每个级别的适当测试量提供了指导,即下级有更多的单元测试比上级更多的端到端测试。
他以提供GitHub链接作为结束,这些链接展示了如何使用各种语言(如C#、Java和TypeScript)演示这些自动化测试方法,以支持ASP.NET微服务和亚马逊云科技Lambda函数。
Helper博士邀请与会者通过会议应用程序提供反馈,因为这对于改进他的演讲和提供有关利用亚马逊云科技服务的最有用的培训至关重要。
**下面是一些演讲现场的精彩瞬间:**
在软件开发过程中,开发者有时会面临修改代码时意外破坏现有功能的问题。
![](https://d1trpeugzwbig5.cloudfront.net/XNT308-Test_automation_for__NET_applications_running_on_AWS/images/rebranded/XNT308-Test_automation_for__NET_applications_running_on_AWS_0.png)
为了解决这个问题,强大的系统变得至关重要。
![](https://d1trpeugzwbig5.cloudfront.net/XNT308-Test_automation_for__NET_applications_running_on_AWS/images/rebranded/XNT308-Test_automation_for__NET_applications_running_on_AWS_1.png)
通过模拟亚马逊云科技的服务,如S3和DynamoDB,来测试[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)应用程序,使得开发人员在没有外部依赖的情况下能够进行单元测试。
![](https://d1trpeugzwbig5.cloudfront.net/XNT308-Test_automation_for__NET_applications_running_on_AWS/images/rebranded/XNT308-Test_automation_for__NET_applications_running_on_AWS_2.png)
演讲者在演讲中强调了外部依赖(例如复杂的初始化、同步操作、高成本和共享状态问题)可能在测试过程中引发的问题。
![](https://d1trpeugzwbig5.cloudfront.net/XNT308-Test_automation_for__NET_applications_running_on_AWS/images/rebranded/XNT308-Test_automation_for__NET_applications_running_on_AWS_3.png)
利用ASP.NET中的TestHost,可以实现从API层到数据库再到API层的端到端测试。
![](https://d1trpeugzwbig5.cloudfront.net/XNT308-Test_automation_for__NET_applications_running_on_AWS/images/rebranded/XNT308-Test_automation_for__NET_applications_running_on_AWS_4.png)
为了实现这一目标,演讲者还讨论了在测试过程中使用模拟服务器来模拟亚马逊云科技服务的方法。
![](https://d1trpeugzwbig5.cloudfront.net/XNT308-Test_automation_for__NET_applications_running_on_AWS/images/rebranded/XNT308-Test_automation_for__NET_applications_running_on_AWS_5.png)
演讲者鼓励观众提供关于演讲的反馈,并强调他们的意见将对未来改进演讲产生重要影响。
![](https://d1trpeugzwbig5.cloudfront.net/XNT308-Test_automation_for__NET_applications_running_on_AWS/images/rebranded/XNT308-Test_automation_for__NET_applications_running_on_AWS_6.png)
## 总结
本次演讲强调了自动化测试在确保部署到亚马逊云科技的.NET应用程序正常运行中的重要性。演讲者概述了三种主要的测试策略:单元测试用于验证逻辑,集成测试用于确认组件之间的正确交互,以及端到端测试用于验证整个系统的正常运行。在进行单元测试时,通常会使用依赖项模拟器以独立地测试逻辑。然而,集成测试需要利用真实的依赖项,因此演讲者建议采用Docker容器来管理和简化环境设置与拆卸。对于端到端测试,实际的云环境是必需的,以便捕捉到权限等问题。演讲者还探讨了[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)架构的特别考虑因素。例如,如队列等异步操作需要通过轮询来实现可预测的测试结果。总体目标是为应用程序建立一个测试金字塔结构,底部有更多专注于单元测试,而顶部则较少但范围广泛地进行端到端测试。演讲者提供了一些示例存储库,其中包括针对.NET服务和亚马逊云科技Lambda函数的一系列测试类型实例。
## 演讲原文
## 想了解更多精彩完整内容吗?立即访问re:Invent 官网中文网站!
[2023亚马逊云科技re:Invent全球大会 - 官方网站](https://webinar.amazoncloud.cn/reInvent2023/?s=8739&smid=19458 "2023亚马逊云科技re:Invent全球大会 - 官方网站")
[点击此处](https://aws.amazon.com/cn/new/?trk=6dd7cc20-6afa-4abf-9359-2d6976ff9600&trk=cndc-detail "点击此处"),一键获取亚马逊云科技全球最新产品/服务资讯!
[点击此处](https://www.amazonaws.cn/new/?trk=2ab098aa-0793-48b1-85e6-a9d261bd8cd4&trk=cndc-detail "点击此处"),一键获取亚马逊云科技中国区最新产品/服务资讯!
## 即刻注册亚马逊云科技账户,开启云端之旅!
[【免费】亚马逊云科技“100 余种核心云服务产品免费试用”](https://aws.amazon.com/cn/campaigns/freecenter/?trk=f079813d-3a13-4a50-b67b-e31d930f36a4&sc_channel=el&trk=cndc-detail "【免费】亚马逊云科技“100 余种核心云服务产品免费试用“")
[【免费】亚马逊云科技中国区“40 余种核心云服务产品免费试用”](https://www.amazonaws.cn/campaign/CloudService/?trk=2cdb6245-f491-42bc-b931-c1693fe92be1&sc_channel=el&trk=cndc-detail "【免费】亚马逊云科技中国区“40 余种核心云服务产品免费试用“")