使用 AWS CodePipeline、AWS CodeBuild 和 AWS Lambda 进行无服务器自动化 UI 测试

测试 Web 应用程序的用户界面是开发生命周期的重要组成部分。在这篇文章中,我将介绍如何使用无服务器技术(包括 AWS CodePipelineAWS 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 CodePipeline、AWS CodeBuild 和 AWS Lambda 进行无服务器自动化 UI 测试

AWS CodeBuild 支持自定义容器,因此我们可以使用 Selenium/standalone-Firefox 和 Selenium/standalone-Chrome 容器,它们分别包括预构建的 Firefox 和 Chrome 浏览器。Xvfb 在虚拟内存中执行图形操作,无需任何显示硬件。它将在安装阶段安装在 CodeBuild 容器中。

Chrome 和 Firefox 的构建规范

Chrome 和 Firefox 测试的构建规范包括多个阶段:

  • 环境变量部分包含一组默认变量,这些变量在创建生成项目或触发生成时被覆盖。
  • 作为安装阶段的一部分,使用 yum 安装所需的软件包,如 Xvfb 和 Selenium。
  • 在pre_build阶段,测试平台为测试执行做好准备。
  • 在构建阶段,将设置相应的 DISPLAY 并执行测试。
version: 0.2

env:
  variables:
    BROWSER: "chrome"
    WebURL: "https://sampletestweb.s3-eu-west-1.amazonaws.com/website/index.html"
    ArtifactBucket: "codebuild-demo-artifact-repository"
    MODULES: "mod1"
    ModuleTable: "test-modules"
    StatusTable: "blog-test-status"

phases:
  install:
    commands:
      - apt-get update
      - apt-get -y upgrade
      - apt-get install xvfb python python-pip build-essential -y
      - pip install --upgrade pip
      - pip install selenium
      - pip install awscli
      - pip install requests
      - pip install boto3
      - cp xvfb.init /etc/init.d/xvfb
      - chmod +x /etc/init.d/xvfb
      - update-rc.d xvfb defaults
      - service xvfb start
      - export PATH="$PATH:`pwd`/webdrivers"
  pre_build:
    commands:
      - python prepare_test.py
  build:
    commands:
      - export DISPLAY=:5
      - cd tests
      - echo "Executing simple test..."
      - python testsuite.py
YAML公司

由于 Ghost Driver 无头运行,因此可以在 AWS Lambda 上执行。为了与即发即弃模型保持一致,我使用 CodeBuild 创建了 PhantomJS Lambda 函数,并并行触发了 Lambda 上的测试调用。这很强大,因为许多测试可以在 Lambda 上并行执行。

PhantomJS 的构建规范

PhantomJS 测试的构建规范还包括多个阶段。它与前面的示例略有不同,因为我们使用 AWS Lambda 执行测试。

  • 环境变量部分包含一组默认变量,这些变量在创建生成项目或触发生成时被覆盖。
  • 作为安装阶段的一部分,使用 yum 安装所需的软件包(如 Selenium 和 AWS CLI)。
  • 在pre_build阶段,测试平台为测试执行做好准备。
  • 在构建阶段,将创建一个用于创建 PhantomJS Lambda 函数的 zip 文件,并在 Lambda 函数上执行测试。
version: 0.2

env:
  variables:
    BROWSER: "phantomjs"
    WebURL: "https://sampletestweb.s3-eu-west-1.amazonaws.com/website/index.html"
    ArtifactBucket: "codebuild-demo-artifact-repository"
    MODULES: "mod1"
    ModuleTable: "test-modules"
    StatusTable: "blog-test-status"
    LambdaRole: "arn:aws:iam::account-id:role/role-name"

phases:
  install:
    commands:
      - apt-get update
      - apt-get -y upgrade
      - apt-get install python python-pip build-essential -y
      - apt-get install zip unzip -y
      - pip install --upgrade pip
      - pip install selenium
      - pip install awscli
      - pip install requests
      - pip install boto3
  pre_build:
    commands:
      - python prepare_test.py
  build:
    commands:
      - cd lambda_function
      - echo "Packaging Lambda Function..."
      - zip -r /tmp/lambda_function.zip ./*
      - func_name=`echo $CODEBUILD_BUILD_ID | awk -F ':' '{print $1}'`-phantomjs
      - echo "Creating Lambda Function..."
      - chmod 777 phantomjs
      - |
         func_list=`aws lambda list-functions | grep FunctionName | awk -F':' '{print $2}' | tr -d ', "'`
         if echo "$func_list" | grep -qw $func_name
         then
             echo "Lambda function already exists."
         else
             aws lambda create-function --function-name $func_name --runtime "python2.7" --role $LambdaRole --handler "testsuite.lambda_handler" --zip-file fileb:///tmp/lambda_function.zip --timeout 150 --memory-size 1024 --environment Variables="{WebURL=$WebURL, StatusTable=$StatusTable}" --tags Name=$func_name
         fi
      - export PhantomJSFunction=$func_name
      - cd ../tests/
      - python testsuite.py
YAML公司

测试用例列表以及属于每个用例的测试模块存储在 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、AWS CodeBuild 和 AWS Lambda 进行无服务器自动化 UI 测试

在 AWS CodePipeline 中实现的此设计如下所示:

使用 AWS CodePipeline、AWS CodeBuild 和 AWS Lambda 进行无服务器自动化 UI 测试

CodePipeline 会自动检测源存储库中的更改并触发管道的执行。

在 UITest 阶段,有两个并行操作:

  • DeployTestWebsite 调用 Lambda 函数,将 S3 中的测试网站部署为 S3 网站。
  • DeployStatusPage 调用另一个 Lambda 函数,将 S3 中的状态网站并行部署为 S3 网站。

接下来,有三个并行操作触发 CodeBuild 项目:

  • TestOnChrome 启动一个容器以在 Chrome 上执行 Selenium 测试。
  • TestOnFirefox 启动另一个容器来在 Firefox 上执行 Selenium 测试。
  • TestOnPhantomJS 创建一个 Lambda 函数,并为每个测试用例调用单个 Lambda 函数以并行执行测试用例。

您可以在状态网站上监视测试执行的状态,如下所示:

使用 AWS CodePipeline、AWS CodeBuild 和 AWS Lambda 进行无服务器自动化 UI 测试

成功完成 UI 测试后,管道将继续进入审批阶段,在该阶段将向配置的 SNS 主题发送通知。指定的团队成员查看测试状态并批准或拒绝部署。获得批准后,管道将继续进入生产阶段,在该阶段调用 Lambda 函数并将网站部署到生产 S3 存储桶。

我使用 CloudFormation 模板来设置持续交付管道。gitHub 提供的 automated-ui-testing.yaml 模板设置了一个功能齐全的管道。

当我使用模板创建管道时,我指定了以下内容:

  • AWS CodeCommit 存储库。
  • 用于发送批准通知的 SNS 主题。
  • 存储构件的 S3 存储桶名称。

使用 AWS CodePipeline、AWS CodeBuild 和 AWS Lambda 进行无服务器自动化 UI 测试

堆栈名称应遵循 S3 存储桶命名规则,因为它将成为 S3 存储桶名称的一部分。

成功创建堆栈后,测试网站和状态网站的 URL 将显示在 Outputs (输出) 部分中,如下所示:

使用 AWS CodePipeline、AWS CodeBuild 和 AWS Lambda 进行无服务器自动化 UI 测试

结论

在这篇文章中,我展示了如何使用 AWS CodePipeline、AWS CodeBuild、AWS Lambda 和手动审批流程来创建用于无服务器自动化 UI 测试的持续交付管道。在 Amazon EC2 实例或 AWS Elastic Beanstalk 上运行的网站也可以使用类似的方法进行测试。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/312606.html

(0)
上一篇 2024年4月1日
下一篇 2024年4月2日

相关推荐

发表回复

登录后才能评论