测试 Web 应用程序的用户界面是开发生命周期的重要组成部分。在这篇文章中,我将介绍如何使用无服务器技术(包括 AWS CodePipeline、AWS CodeBuild 和 AWS Lambda)自动执行 UI 测试。
我构建了一个托管在 S3 中的 UI 测试网站。我使用 Selenium 在 Chrome、Firefox 和 PhantomJS 上执行跨浏览器 UI 测试,PhantomJS 是一个带有 Ghost Driver 的无头 WebKit 浏览器,是 WebDriver Wire 协议的实现。我使用 Python 为 ChromeDriver、FirefoxDriver 或 PhatomJSDriver 创建测试用例,这些测试用例基于执行测试的浏览器。
本文中提到的资源,包括 AWS CloudFormation 模板、S3 中托管的测试和状态网站、AWS CodeBuild 构建规范文件、AWS Lambda 函数以及执行测试的 Python 脚本,可在 serverless-automated-ui-testing GitHub 存储库中找到。
S3 托管测试网站:
AWS CodeBuild 支持自定义容器,因此我们可以使用 Selenium/standalone-Firefox 和 Selenium/standalone-Chrome 容器,它们分别包括预构建的 Firefox 和 Chrome 浏览器。Xvfb 在虚拟内存中执行图形操作,无需任何显示硬件。它将在安装阶段安装在 CodeBuild 容器中。
Chrome 和 Firefox 的构建规范
Chrome 和 Firefox 测试的构建规范包括多个阶段:
- 环境变量部分包含一组默认变量,这些变量在创建生成项目或触发生成时被覆盖。
- 作为安装阶段的一部分,使用 yum 安装所需的软件包,如 Xvfb 和 Selenium。
- 在pre_build阶段,测试平台为测试执行做好准备。
- 在构建阶段,将设置相应的 DISPLAY 并执行测试。
由于 Ghost Driver 无头运行,因此可以在 AWS Lambda 上执行。为了与即发即弃模型保持一致,我使用 CodeBuild 创建了 PhantomJS Lambda 函数,并并行触发了 Lambda 上的测试调用。这很强大,因为许多测试可以在 Lambda 上并行执行。
PhantomJS 的构建规范
PhantomJS 测试的构建规范还包括多个阶段。它与前面的示例略有不同,因为我们使用 AWS Lambda 执行测试。
- 环境变量部分包含一组默认变量,这些变量在创建生成项目或触发生成时被覆盖。
- 作为安装阶段的一部分,使用 yum 安装所需的软件包(如 Selenium 和 AWS CLI)。
- 在pre_build阶段,测试平台为测试执行做好准备。
- 在构建阶段,将创建一个用于创建 PhantomJS Lambda 函数的 zip 文件,并在 Lambda 函数上执行测试。
测试用例列表以及属于每个用例的测试模块存储在 Amazon DynamoDB 表中。根据作为参数传递给 CodeBuild 项目的模块列表,CodeBuild 从该表中获取测试用例并执行它们。测试执行状态和结果存储在另一个 Amazon DynamoDB 表中。它将从 DynamoDB 中的状态表中读取测试状态并显示它。
AWS CodeBuild 和 AWS Lambda 将测试执行作为单独的任务。AWS CodePipeline 通过支持持续交付和并行执行测试以实现优化测试,在这方面发挥着重要作用。
这是如何做到的:
在 AWS CodePipeline 中,创建包含四个阶段的管道:
- 源 (AWS CodeCommit)
- UI 测试(AWS Lambda 和 AWS CodeBuild)
- 审批(手动审批)
- 生产 (AWS Lambda)
下图显示了管道阶段、每个阶段中的操作以及阶段之间的转换。
在 AWS CodePipeline 中实现的此设计如下所示:
CodePipeline 会自动检测源存储库中的更改并触发管道的执行。
在 UITest 阶段,有两个并行操作:
- DeployTestWebsite 调用 Lambda 函数,将 S3 中的测试网站部署为 S3 网站。
- DeployStatusPage 调用另一个 Lambda 函数,将 S3 中的状态网站并行部署为 S3 网站。
接下来,有三个并行操作触发 CodeBuild 项目:
- TestOnChrome 启动一个容器以在 Chrome 上执行 Selenium 测试。
- TestOnFirefox 启动另一个容器来在 Firefox 上执行 Selenium 测试。
- TestOnPhantomJS 创建一个 Lambda 函数,并为每个测试用例调用单个 Lambda 函数以并行执行测试用例。
您可以在状态网站上监视测试执行的状态,如下所示:
成功完成 UI 测试后,管道将继续进入审批阶段,在该阶段将向配置的 SNS 主题发送通知。指定的团队成员查看测试状态并批准或拒绝部署。获得批准后,管道将继续进入生产阶段,在该阶段调用 Lambda 函数并将网站部署到生产 S3 存储桶。
我使用 CloudFormation 模板来设置持续交付管道。gitHub 提供的 automated-ui-testing.yaml 模板设置了一个功能齐全的管道。
当我使用模板创建管道时,我指定了以下内容:
- AWS CodeCommit 存储库。
- 用于发送批准通知的 SNS 主题。
- 存储构件的 S3 存储桶名称。
堆栈名称应遵循 S3 存储桶命名规则,因为它将成为 S3 存储桶名称的一部分。
成功创建堆栈后,测试网站和状态网站的 URL 将显示在 Outputs (输出) 部分中,如下所示:
结论
在这篇文章中,我展示了如何使用 AWS CodePipeline、AWS CodeBuild、AWS Lambda 和手动审批流程来创建用于无服务器自动化 UI 测试的持续交付管道。在 Amazon EC2 实例或 AWS Elastic Beanstalk 上运行的网站也可以使用类似的方法进行测试。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/312606.html