原文:https://medium.com/genymobile/how-to-run-parallel-tests-using-genymotion-cloud-saas-8858ffe0947f
翻译:胡八
Genymotion Cloud以 SaaS(软件即服务)的形式,或者作为AWS、GCP或阿里云(PaaS,平台即服务)上的虚拟镜像,作为宿主机承载着基于云的 Android 模拟器。在这篇文章中,我们将聚焦 SaaS。它能让你使用多个设备版本(从 Android 4.1 到 Android 8)来测试应用程序。
启动自动化测试可能会需要很长时间,所以在本教程中,你将学习如何并行化测试,以便尽快找出 bug,并在测试上花费更少的时间。
要求:
在整篇教程中,我们使用的是 Python,但是你可以使用你喜欢的语言;只需要参考用其他语言编写的 Appium 客户端的 Appium 文档。
这一步骤会创建并启动多台 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 脚本:
# 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 脚本:
pytest test_example.py
PyTest 每次只会在一台设备上运行测试。这不是我们想要的。为了尽快得到结果,我们要同时运行所有的测试。要做到这一点,我们可以用 pyTest-xdist 插件,运行以下命令:
pytest -n 3 test_example.py
就这么简单!你已经能够在几台 Genymotion Cloud SaaS 的虚拟镜像上,用appium
和pytest
来并行测试了。
如果你也想在 PaaS 设备上测试,那很容易,只需使用其他提供的工具(即用于 AWS 的EC2 APIs/CLI)来启动和停止设备。你也可以参考教程来设置。
非常感谢 Appium 的维护者之一,Cloud Grey的创始人Jonathan Lipps审阅了这篇文章。
如果想了解更多 Genymotion Cloud,参看下面的资源:
如果想用 Java 而不是 Python 来并行测试,参看Github上Ellinor Kwok的项目