亚马逊AWS官方博客

在 AWS Device Farm 上支持 Airtest 测试框架

引言

AWS Device Farm 的自动化测试

AWS Device Farm 是一种云端移动应用测试服务,它支持多种自动化测试方式和范围,包括 Appium、Calabash、Espresso、XCUITest 和 UI Automator 等。这些测试框架能够在真实的移动设备上执行测试用例,以验证应用的功能和性能。

在自动化测试完成后,AWS Device Farm 会提供详细的测试报告,包括日志和录屏等,以帮助开发者分析测试结果并定位问题。此外,AWS Device Farm 还提供了实时设备监控功能,可以让开发者观察测试用例在真实设备上的执行情况,以及与设备的交互过程。

尽管 AWS Device Farm 支持多种自动化测试框架,但它仍然存在一些局限性。例如,一些新的测试框架可能不被支持。此外,AWS Device Farm 不支持从本地执行脚本,必须将脚本上传到云端才能执行测试。

Airtest 框架

Airtest 是一个跨平台的开源自动化测试框架,具有简洁易用的 API 和内置 AI 视觉识别引擎等优势。它支持多种操作系统、编程语言和应用类型的自动化测试,包括 Android、iOS、Windows、Web 等。Airtest 还支持可视化的测试录制和回放功能,可以快速编写和执行自动化测试用例。

除了上述的优势,Airtest 还具有支持 AI 的方式识别测试对象的特点。Airtest 内置了基于 AI 的视觉识别引擎,可以通过图像识别技术自动完成测试对象的定位和操作,无需依赖应用的控件 ID 或坐标等信息。

这种基于 AI 的视觉识别技术可以使得测试用例更加健壮,即使应用界面发生了变化或者控件位置发生了偏移,Airtest 仍然能够准确地识别和定位对象,保证测试的稳定性和准确性。相比传统的控件 ID 或坐标等方式,基于 AI 的视觉识别技术更加智能化和灵活化,适用于更多的测试场景。因此,Airtest 在中国国内的应用场景越来越广泛。

Device Farm 自定义测试环境方案总览

Airtest 在 Device Farm 上运行的挑战

将 Airtest 框架在 AWS Device Farm 上运行是一项具有挑战性的任务。

  • 首先,AWS Device Farm 自动化测试框架中并不支持 Airtest 框架。这意味着,我们需要对 Airtest 框架进行一些调整,以使其能够在 AWS Device Farm 上执行。
  • 其次,Airtest 框架对于测试环境的组件有深层次的定制,包括 Python 版本和依赖库,以及 ADB 版本等。这些组件需要与 AWS Device Farm 的测试环境匹配,才能正确地执行测试用例。如果测试环境不匹配,就会导致测试失败或者出现错误结果的情况。

为了解决这些挑战,我们需要进行一些额外的工作。首先,我们需要对 Airtest 框架进行定制,以使其可以在 AWS Device Farm 上运行。这包括调整 Airtest 框架的依赖库和版本,以确保其与 AWS Device Farm 的测试环境匹配。其次,我们需要对 AWS Device Farm 进行配置,以确保其能够正确执行 Airtest 框架的测试用例。这包括配置 Python 和 ADB 等组件,以及安装必要的依赖库。

利用 Device Farm 的自定义测试环境功能支持 Airtest

为了在 AWS Device Farm 上支持 Airtest 框架,我们可以利用 Device Farm 的自定义测试环境(https://docs.aws.amazon.com/devicefarm/latest/developerguide/custom-test-environments.html)功能。该功能通过使用 YAML 模板文件,将测试环境中的 install、pre_test、test 和 post_test 四个阶段的环境配置开放给用户,使得用户可以自定义测试环境,以满足不同的测试需求。

具体来说,在支持 Airtest 的方案中,需要进行以下步骤。首先,我们需要创建一个外壳项目,将 Airtest 项目包装成 Device Farm 可以识别的项目。在本方案中,我们选择使用 Appium Python 项目作为外壳项目。然后,我们需要利用自定义环境的 YAML 文件,配置安装 Airtest 所需要的依赖环境,例如安装 Python 依赖库,将 Device Farm 所需要的定制版 ADB 组件复制到 Airtest 预置的目录下。

接下来,我们需要在自定义环境的 YAML 脚本中,为 Airtest 项目对应的可执行文件赋予运行权限,并启动 Airtest 测试。在这个过程中,我们可以通过调整 YAML 文件中的配置选项,以满足不同的测试需求。

总的来说,通过利用 Device Farm 的自定义测试环境功能,我们可以支持 Airtest 框架在 AWS Device Farm 上执行测试。这种方案需要进行一些额外的工作,包括创建外壳项目、配置 YAML 文件中的环境变量和启动脚本等,但可以满足 Airtest 在 AWS Device Farm 上的测试需求,使得测试用例可以更加准确和稳定地执行。

    # The install phase includes commands that install dependencies that your tests use.
  # Default dependencies for testing frameworks supported on Device Farm are already installed.
  install:
    commands:
      # Device Farm support two major versions of Python, each with one minor version: 2 (minor version 2.7), and 3 (minor version 3.7.4).
      # The default Python version is 3, but you can switch to 2 by setting the following variable to 2:
      - export PYTHON_VERSION=3

      # This command will install your dependencies and verify that they're using the proper versions that you specified in your requirements.txt file. Because Device Farm preconfigures your environment within a
      # Python Virtual Environment in its setup phase, you can use pip to install any Python packages just as you would locally.
      - cd $DEVICEFARM_TEST_PACKAGE_PATH
      - . bin/activate
      - pip install -r requirements.txt
  # The test phase includes commands that run your test suite execution.
  test:
    commands:
      # Your test package is downloaded in $DEVICEFARM_TEST_PACKAGE_PATH so we first change directory to that path.
      # We already setup python virtual environment on $DEVICEFARM_TEST_PACKAGE_PATH
      # and installed required libraries. You can run your test under $DEVICEFARM_TEST_PACKAGE_PATH
      - echo "Navigate to test package directory"
      - dir=`python -c "import sys; print(sys.path[-1])"`/airtest/core/android/static/adb/linux
      - cd $DEVICEFARM_TEST_PACKAGE_PATH
      - mkdir -p $dir
      - cp adb $dir/adb
      - chmod +x $dir/adb
      - echo "Start AirTest test"
      - python -V
      # By default, the following command is used by Device Farm to run your Appium Python test.
      # The goal is to run all your tests files in the test package.
      # Alternatively, You may specify your customized command.
      # Note: For most use cases, the default command works fine.
      # Please refer "https://docs.pytest.org/en/latest/usage.html" for more options on running pytests from command line.
      - python airtest.py

配置和运行流程

这个流程的资源的脚本可以通过 https://github.com/yoreland/airtest_DeviceFarm 获取。

构建 airtest 项目包

  • 将原本的 airtest 项目 copy 到 github 项目的 test_package 目录下,并执行./package_test.sh,这将把项目生成一个 device farm 可以识别的 appium python 项目;
  • 打开 device farm 控制台,新建一个 Automated test 项目;
  • 先上传带测试的应用;
  • 在配置项目这一步,测试框架选择 Appium Python,然后执行环境选择 custom environment,最后 yaml 脚本选择编辑,并粘贴 github 项目中的 yaml 脚本;
  • 最后用默认配置走完剩余的过程,Airtest 脚本就会在 device farm 所提供的云真机上运行了。

结论

在本文中,我们探讨了如何在 AWS Device Farm 上支持 Airtest 框架的自动化测试。通过使用 Device Farm 的自定义测试环境功能,我们可以配置 Airtest 所需的环境变量和依赖库,并将其与 Device Farm 的测试环境进行匹配,从而确保测试用例可以准确地执行。

这种方案的价值在于,它使得 Airtest 框架可以在 AWS Device Farm 上执行测试,从而拓展了 Airtest 框架的应用场景。同时,它还可以提高测试用例的准确性和稳定性,使得开发者可以更加便捷地进行自动化测试。

我们可以通过创建一个外壳项目,并利用 Device Farm 的自定义测试环境功能,为 Airtest 框架配置所需的环境变量和依赖库,从而在 AWS Device Farm 上支持 Airtest 的自动化测试。此外,我们还提供了一个开源的 Github 项目,可以方便地将现有的 Airtest 项目转换为 Device Farm 可以兼容的项目。

最后需要注意的是,目前我们的方案暂时没有对 iOS 设备做支持。如果您有对应的需求,可以联系本篇博客的作者进行进一步的讨论和探讨。

本篇作者

夏宁

亚马逊云科技解决方案架构师,曾就职惠普软件和声网,超过 10 年前端后端开发经验,主导过各类软件项目设计。熟悉移动互联网,音视频,云计算相关领域。

杨俊

亚马逊云科技资深解决方案架构师。加入亚马逊云科技之前,主要从事电商和零售相关的系统开发工作,具备丰富的零售行业经验和企业上云实践经验。

Dora Gui

亚马逊云科技技术客户经理,主要支持游戏、互联网行业客户的架构优化、成本管理、技术咨询等工作,并专注在 IAAS、大数据和容器等方向的技术选型、方案落地和实践。在加入亚马逊云科技之前,曾就职于 EMC 和微软、腾讯等科技公司,拥有近 10 年虚拟化与公有云领域的架构优化和技术支持经验。