原文:https://medium.com/genymobile/how-to-run-parallel-tests-using-genymotion-cloud-saas-8858ffe0947f
翻译:胡八

如何使用 Genymotion Cloud (SaaS) 来跑并行测试

Genymotion Cloud以 SaaS(软件即服务)的形式,或者作为AWSGCP阿里云(PaaS,平台即服务)上的虚拟镜像,作为宿主机承载着基于云的 Android 模拟器。在这篇文章中,我们将聚焦 SaaS。它能让你使用多个设备版本(从 Android 4.1 到 Android 8)来测试应用程序。

启动自动化测试可能会需要很长时间,所以在本教程中,你将学习如何并行化测试,以便尽快找出 bug,并在测试上花费更少的时间。

要求:

在整篇教程中,我们使用的是 Python,但是你可以使用你喜欢的语言;只需要参考用其他语言编写的 Appium 客户端的 Appium 文档。

在 Genymotion Cloud 启动多台设备

这一步骤会创建并启动多台 Genymotion 设备

> gmtool --cloud admin startdisposable "Google Nexus 5X - 8.0 - API 26 - > 1080x1920" device_8.0 &
> gmtool --cloud admin startdisposable "Google Nexus 6P - 7.1.0 - API 25 - 1440x2560" device_7.1 &
> gmtool --cloud admin startdisposable "Google Nexus 6 - 7.0.0 - API 24 - 1440x2560" device_7.0 &

一旦这些设备启动了,ADB 通道就建立好了,云上的设备可以当做本地设备来使用了。因此,你可以使用adb devices命令查看你的设备:

> adb devices

List of devices attached
localhost:44953 device
localhost:34295 device
localhost:44497 device

把上面的端口号记好,因为你要用它们来配置 Appium 服务器。

如果你需要长时间使用一个 adb 端口,那么你可以在gmtool命令后加上--adb--serial port这个参数:

>gmtool --cloud admin startdisposable "Google Nexus 6 - 7.0.0 - API 24 - 1440x2560" device_7.0 --adb-serial-port 32123

运行adb devices以后,这台设备就会显示成localhost:32123 device

# 启动 appium 服务器
从 Appium 1.7 开始,只用一台 appium 服务器就很容易地进行并行测试。在此之前,我们必须启动 N 台 appium 服务器,才能并行测试 N 台设备。

那我们就来启动 Appium 服务器吧,只需要用一个基本的命令:

appium

用 Python 来写测试

(再次说明一下,整篇教程是用 Python 来写的,但你可以用你自己喜欢的语言。)

我们选择 Python 作为我们的测试框架。它有几个很有用的插件:

这是一段简单的 python 脚本:

# test_example.py
# -*- coding: utf-8 -*-
import pytest
from appium import webdriver

@pytest.mark.parametrize("udid, systemPort", [
       ("localhost:44953", "8201"),
       ("localhost:34295", "8202"),
       ("localhost:44497", "8203"),
       ]
)
def test_sum(udid, systemPort):

   capabilities = {
       'platformName': 'Android',
       'deviceName': 'Genymotion Cloud',
       'appPackage': 'com.android.calculator2',
       'appActivity': '.Calculator',
       'udid':udid,
       'systemPort': systemPort,
       'automationName': 'UiAutomator2',
       'noReset': True,
   }
   url = 'http://localhost:4723/wd/hub'
   driver = webdriver.Remote(url, capabilities)

   try:
       digit1_btn = driver.find_element_by_id("com.android.calculator2:id/digit_1")
       digit1_btn.click()

       add_btn = driver.find_element_by_id("com.android.calculator2:id/op_add")
       add_btn.click()

       digit2_btn = driver.find_element_by_id("com.android.calculator2:id/digit_2")
       digit2_btn.click()

       equal_btn = driver.find_element_by_id("com.android.calculator2:id/eq")
       equal_btn.click()

       sum_input = driver.find_element_by_id("com.android.calculator2:id/result").text
       assert sum_input == "3"

   finally:
       # teardown appium
       driver.quit()

如何并行地去跑 python 测试

现在是时候在所有设备上运行测试了。

如果我们运行下面的 python 脚本:

pytest test_example.py

PyTest 每次只会在一台设备上运行测试。这不是我们想要的。为了尽快得到结果,我们要同时运行所有的测试。要做到这一点,我们可以用 pyTest-xdist 插件,运行以下命令:

pytest -n 3 test_example.py

就这么简单!你已经能够在几台 Genymotion Cloud SaaS 的虚拟镜像上,用appiumpytest来并行测试了。

如果你也想在 PaaS 设备上测试,那很容易,只需使用其他提供的工具(即用于 AWS 的EC2 APIs/CLI)来启动和停止设备。你也可以参考教程来设置。

非常感谢 Appium 的维护者之一,Cloud Grey的创始人Jonathan Lipps审阅了这篇文章。

如果想了解更多 Genymotion Cloud,参看下面的资源:

如果想用 Java 而不是 Python 来并行测试,参看GithubEllinor Kwok的项目


↙↙↙阅读原文可查看相关链接,并与作者交流