Skip to content

多设备自动化测试

多设备自动化测试

简介

多设备自动化测试是指使用自动化工具和技术,对多种设备和操作系统进行测试,以确保应用程序在各种设备和操作系统上都能正常运行。

为什么需要多设备自动化测试?

为了保证用户体验,应用需要适配不同的操作系统以及手机设备。在不同的设备上进行手动测试是非常费时和困难的。所以则需要通过自动化的方式,完成对于多设备的兼容性测试。

STF系统版本 STF常用设备列表

实现方案

既然需要实现多设备的自动化测试,第一步则需要具备对应的硬件基础。再通过对应的技术,调用不同的硬件设备,完成自动化测试。

硬件基础

实现多设备通常需要对应的硬件基础去连接多个手机。

  • 终端机:Ubuntu、Mac
  • usb hub
  • 移动设备:
  • 自购
  • 中小公司 10~30
  • 大公司 50~200
  • 云端租用

多设备自动化测试实现原理

在进行多设备管理操作的的过程中,主要是分为四个模块,如下图所示。

uml diagram

而多设备自动化测试也有多种实现方式:

  1. STF 多设备管理平台,通过 adb 命令实现。
  2. 跨平台设备管理方案 seleniumgrid。
  3. 基于 jenkins 的自动化调度,通过 jenkins 的分布式能力调用不同的节点实现不同的自动化测试。
  4. 通过 AppiumServer 的多 Session 机制实现。
STF 多设备管理平台

多设备管理平台 STF 可以帮助开发人员和测试人员管理和控制多个设备,以便更好地进行测试。

操控多设备的方法其中有一个就是通过编写 shell 脚本,使用 adb 进行控制多个设备,其中 stf 就是通过此方法实现多设备管理的:

这样的实现方法的优点为除了 adb 之外,不依赖任何其他的工具,定制性更强。缺点就是较难上手,因为涉及到了很多 tcp 相关的协议编程和 shell 脚本编程。

uml diagram

跨平台设备管理方案 seleniumgrid

跨平台设备管理方案 Selenium Grid 可以帮助开发人员和测试人员在多个设备和操作系统上运行同一套测试用例。Selenium Grid 可以将测试用例分发到不同的设备上进行测试,并将测试结果汇总到一个测试报告中。

  • 分布式测试工具。
  • 在多台设备上并行运行 Appium 测试,可以快测试速度并提高测试效率。
  • 使用一个中心控制器(hub)来管理测试节点(node),将测试任务分配给可用的节点,并收集测试结果。

uml diagram

具体的实现方式见参考后续章节。

基于 jenkins 的自动化调度详解

Jenkins 本身就支持分布式运行与 API 调用,可以将 Jenkins 作为一个类似于 SeleniumGrid 的中控中心,每个 Jenkins 的 Node 对应一台手机设备进行用例的调用。

uml diagram

Appium 多 Session 控制设备

除了上述的方法之外,还可以依赖 Appium 本身的机制实现多设备操作。Appium 在 2.x 版本之后,提升了对于多 Session 的支持能力,可以通过多个 Session 完成对于不同移动设备的控制。

uml diagram

具体的实现思路。

  1. 通过测试框架的的并行机制实现。
  2. 需要启动多个设备。
  3. 使用同个 AppiumServer。

  4. Java 版本

@Execution(ExecutionMode.CONCURRENT)
public class TestMulitiSession {
    @Test
    public void startUpOne() throws InterruptedException {
        UiAutomator2Options uiAutomator2Options = new UiAutomator2Options()
                .setPlatformName("Android")
                .setAutomationName("uiautomator2")
                .setNoReset(true)
                // 使用不同的udid连接不同的设备
                .setUdid("emulator-5554")
                .amend("appium:appPackage", "com.android.settings")
                .amend("appium:appActivity", ".Settings")
                .amend("appium:forceAppLaunch", true)
                .amend("appium:shouldTerminateApp", true);
        try {
            AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723"), uiAutomator2Options);
            Thread.sleep(2000);
            driver.quit();
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    }
    @Test
    public void startUpTwo() throws InterruptedException {
        UiAutomator2Options uiAutomator2Options = new UiAutomator2Options()
                .setPlatformName("Android")
                .setAutomationName("uiautomator2")
                .setNoReset(true)
                // 使用不同的udid连接不同的设备
                .setUdid("emulator-5556")
                .amend("appium:appPackage", "com.android.settings")
                .amend("appium:appActivity", ".Settings")
                .amend("appium:forceAppLaunch", true)
                .amend("appium:shouldTerminateApp", true);
        try {
            AndroidDriver driver2 = new AndroidDriver(new URL("http://127.0.0.1:4723"), uiAutomator2Options);
            Thread.sleep(2000);
            driver2.quit();

        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    }
}
  • Python 版本

class TestMultipleSession:

    @pytest.mark.parametrize("udid", ["emulator-5554", "emulator-5556"])
    def test_multiple_session(self, udid):
        """
        测试多个session
        :return:
        """
        print(udid)
        caps = {}
        # 设置 app 安装平台
        caps["appium:platformName"] = "Android"
        # 设置 app 安装平台的版本
        caps["appium:platformVersion"] = "6"
        # 设备的名字
        caps["appium:deviceName"] = "MyDevice"
        # 设置driver
        caps["appium:automationName"] = "UiAutomator2"
        # 设置 app 的包名
        caps["appium:appPackage"] = "com.android.settings"
        # 设置 app 启动页
        caps["appium:appActivity"] = ".Settings"
        # 设置 udid
        caps["appium:udid"] = udid
        # 不清空缓存
        caps["appium:noReset"] = True
        # 设置以下两个参数来控制启动app和关闭掉app
        caps["appium:forceAppLaunch"] = True
        caps["appium:shouldTerminateApp"] = True
        options = AppiumOptions().load_capabilities(caps)
        driver = webdriver.Remote("http://localhost:4723", options=options)
        time.sleep(5)
        driver.quit()
# 需要先安装  pytest-xdist
pip install pytest-xdist
# 运行方式
pytest -s -v  -n 2 test_multiple_session.py

总结

综上所述,多设备自动化测试是一种高效、可靠的测试方法,可以加速测试过程,减少测试成本,并提高测试的可靠性。使用 Jenkins 的自动化调度、多设备管理平台 STF 和跨平台设备管理方案 Selenium Grid 可以方便地进行多设备自动化测试。