移动测试支持执行遵循Appium测试框架编写的自动化测试代码。
移动测试平台目前可支持pytest、unittest和robotframework等三方测试框架,如需其他支持,联系技术支持。
前提条件
- 了解使用Appium进行自动化测试的方法。具体说明请参见Appium官方文档。 
- 具备Python编程基础。 
背景信息
编写Android测试脚本,包含如下操作:
- 编写测试脚本:编写Capabilities文件和测试脚本,Capabilities文件用于执行测试脚本时指定所需的测试环境。详细操作请参见步骤一、创建Capabilities文件和步骤二、编写测试脚本。 
- 验证测试脚本:在本地启动Appium Server,以验证编写完成的测试脚本。详细操作请参见步骤三、启动Appium Server和步骤四、验证测试脚本。 
- 上传移动测试平台:测试脚本验证无误后,上传至移动测试平台。详细操作请参见步骤五、上传至移动测试平台。 
步骤一、创建Capabilities文件
使用Python语言编写Capabilities文件,用于执行测试脚本时指定所需的测试环境。放在项目根目录下(/desired_capabilities.py),文件命名为desired_capabilities.py。
desired_capabilities.py仅用于本地执行测试脚本时,指定测试环境。
desired_capabilities.py文件包括get_uri()和get_desired_capabilities()2个函数。
| 函数 | 说明 | 
| 
 | 获取本次会话的参数。 参数可根据实际需求进行设置。具体说明请参见Appium Desired Capabilities。 | 
| 
 | 返回Appium Server的地址。 | 
示例代码
#!/usr/bin/env python
def get_desired_capabilities():
    desired_caps = {
        'platformName': 'Android',
        'platformVersion': '7.0',
        'deviceName': 'V8xxx',
        'appPackage': 'com.example.Android.myapp',
        'appWaitPackage': 'com.example.Android.myapp',
        'app': 'D:/home/xx/xx/xx/xx/xx.apk',
        'newCommandTimeout': 30,
        'automationName': 'Appium'
    }
    return desired_caps
def get_uri():
    return "http://localhost:50000/wd/hub"示例说明
- 本地启动的Appium Server,监听端口默认设置为50000,则返回值为 - http://localhost:50000/wd/hub。
- 在 - get_desired_capabilities()函数中设置了8个参数:
| 参数 | 说明 | 
| platformName | 测试设备的系统类型。可选Android或iOS平台。 | 
| platformVersion | 测试设备的系统版本。 | 
| deviceName | 测试设备的名称。 | 
| appPackage | 待测应用的包名。仅适用于Android平台。 | 
| appWaitPackage | 测试时等待启动的应用包名。仅适用于Android平台。 | 
| app | 待测应用安装文件的存储位置。 | 
| newCommandTimeout | 两条指令之间允许的最长时间间隔(单位:秒)。 如两条指令之间的时间间隔超过预设取值,则Appium Server将终止本次会话。 | 
| automationName | 本次会话所使用的自动化引擎。 
 | 
步骤二、编写测试脚本
使用Python语言编写测试脚本,作为执行自动化测试的入口,放在项目根目录下(/main.py),文件命名为main.py。
移动测试平台通过执行测试脚本main.py,实施功能测试。
示例代码及说明如下:
# -*- coding: utf-8 -*-
from appium import webdriver
# 引入刚刚创建的同目录下的desired_capabilities.py
import desired_capabilities
# 使用python的unittest作为单元测试工具
from unittest import TestCase
# 使用python的unittest作为单元测试工具
import unittest
# 使用time.sleep(xx)函数进行等待
import time
class MqcTest(TestCase):
   global automationName
   def setUp(self):
       # 获取我们设定的capabilities,通知Appium Server创建相应的会话。
       desired_caps = desired_capabilities.get_desired_capabilities()
       # 获取server的地址。
       uri = desired_capabilities.get_uri()
       # 获取使用的测试框架
       self.automationName = desired_caps.get('automationName')
       # 创建会话,得到driver对象,driver对象封装了所有的设备操作。
       self.driver = webdriver.Remote(uri, desired_caps)
   def test_searchbox(self):
        # 找到包含“Tab4”字符串的控件。
        if self.automationName == 'Appium':
            tab4 = self.driver.find_element_by_name("Tab4")
        else:
            tab4 = self.driver.find_element_by_link_text("Tab4")
        # 点击.
        tab4.click()
        # 等待2秒钟
        time.sleep(2)
        # 通过控件类名找到用户名和密码输入框。
        editTexts = self.driver.find_elements_by_class_name("android.widget.EditText")
        # 输入用户名和密码,[0]表示用户名,[1]表示密码
        editTexts[0].send_keys("admin")
        editTexts[1].send_keys("admin")
        # 隐藏出现的软键盘
        self.driver.hide_keyboard()
        # 找到包含“登录”的按钮并点击
        if self.automationName == 'Appium':
            self.driver.find_element_by_name("登录").click()
        else:
            self.driver.find_element_by_link_text("登录").click()
        # 等待3秒钟,等待登录成功。 
        time.sleep(3)
   def tearDown(self): 
        # 测试结束,退出会话。 
        self.driver.quit()
if __name__ == '__main__':
    unittest.main()步骤三、启动Appium Server
在本地命令行,执行appium命令,启动Appium Server。例如:appium -p 50000。
参数释义
| 参数 | 说明 | 
| -p | 指定Appium Server监听的端口号。 | 
| -a | 指定Appium Server的IP地址。 | 
| -selendroid-port | 在Selendroid模式下,指定adb forward的端口。 | 
| -U | 当Appium Server挂载多个设备时,指定用于测试的设备的串号。 | 
| --full-reset | 设置测试用例执行完成后,对设备进行完全清理。 | 
步骤四、验证测试脚本
- 在本地添加手机。 - 本地添加已开启开发者模式的手机。 
- 远程连接云真机,执行 - adb connect,远程挂载云真机到本地。
 
- 在本地命令行,执行 - python main.py命令,执行并验证测试脚本- main.py。
步骤五、上传至移动测试平台
- 在根目录下将 - main.py文件压缩为zip文件。
- 在移动测试控制台,新建上传脚本,上传 - main.py,用于后续的Android功能测试。- 新建脚本的详细操作请参见:新建脚本。