移动测试支持执行遵循Appium测试框架编写的自动化测试代码。本文介绍如何使用Appium对iOS 10设备进行功能测试的方法。
移动测试平台目前可支持pytest、unittest和robotframework等三方库。如需其他支持,请联系技术支持。
前提条件
了解使用Appium进行自动化测试的方法。具体说明请参见Appium官方文档。
具备Python编程基础。
配置环境
本文以iOS 10为例进行说明,相应环境要求如下:
macOS 10.11.5及以上
Xcode 8.0及以上
Appium 1.6.0及以上
创建Capabilities文件
使用Python语言编写Capabilities文件,指定执行测试脚本所需测试环境,文件命名为desired_capabilities.py
。
其中包括get_uri()
和get_desired_capabilities()
2个函数。
函数 | 说明 |
| 获取本次会话的参数。 参数可根据实际需求进行设置。具体说明请参见Appium Desired Capabilities。 |
| 返回Appium Server的地址。 |
示例代码
#!/usr/bin/env python
import sys
def get_desired_capabilities():
desired_caps = {
'platformName': 'iOS',
'platformVersion': '10.0',
'deviceName': 'iPhone 6s',
'udid': '36317c0f81086d7f4f99a9771179720b7962a2ad',
'realDeviceLogger':'/usr/local/lib/node_modules/deviceconsole/deviceconsole',
'app': '/Users/adam/iosapp.app',
'bundleId':'net.oschina.iosapp',
'newCommandTimeout': 60,
'automationName': 'Appium',
'noReset': True
}
return desired_caps
def get_uri():
return "http://localhost:56000/wd/hub"
def flushio():
sys.stdout.flush()
示例说明
1:在get_desired_capabilities()
函数中设置了10个参数:
参数 | 说明 |
platformName | 测试设备的系统类型。 |
platformVersion | 测试设备的系统版本。 |
deviceName | 测试设备的名称。 |
udid | 测试设备的ID。 |
realDeviceLogger | deviceconsole工具存储路径,用于获取测试设备的日志。 |
app | 应用安装程序的存储路径。 如不填写,则默认为bundleId运行手机上已安装应用的路径。 |
bundleId | 应用的bundleId。 |
newCommandTimeout | 两条指令之间允许的最长时间间隔。 如两条指令之间的时间间隔超过预设取值,则Appium Server将终止本次会话。 |
automationName | 本次会话所使用的自动化引擎。
|
noReset | 本次会话之前是否重置应用。 |
2:本地启动的Appium Server,监听端口默认设置为50000,则返回值为http://localhost:50000/wd/hub
。
desired_capabilities.py
仅用于本地执行/验证测试脚本,待测试脚本打包上传后,移动测试平台自动生成并替换该文件。
创建入口脚本文件
使用Python语言编写测试脚本,作为执行自动化测试的入口,文件命名为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):
def setUp(self):
# 获取我们设定的capabilities,通知Appium Server创建相应的会话。
desired_caps = desired_capabilities.get_desired_capabilities()
# 获取server的地址
uri = desired_capabilities.get_uri()
# 创建会话,得到driver对象,driver对象封装了所有的设备操作。
self.driver = webdriver.Remote(uri, desired_caps)
# 等待app完全加载
time.sleep(3)
# 第1个用例,如果检测到弹框,就点掉
def test_case_a_dismiss_alert(self):
while True:
time.sleep(3)
alertEle = self.driver.find_elements_by_class_name("XCUIElementTypeAlert")
if alertEle:
print 'find an alert'
notAllowBtn = self.driver.find_element_by_xpath("//XCUIElementTypeButton[@label='不允许']")
notAllowBtn.click()
else:
break
# 第2个用例,登录
def test_case_b_login(self):
# 取得导航栏的左侧按钮
leftBtn = self.driver.find_element_by_xpath("//XCUIElementTypeButton[@label='navigationbar sidebar']")
leftBtn.click()
time.sleep(3)
# 点击“点击头像登录”按钮
potraitEle = self.driver.find_element_by_xpath("//XCUIElementTypeStaticText[@label='点击头像登录']")
potraitEle.click()
time.sleep(3)
# 开始登录,输入账号密码
tfEle = self.driver.find_element_by_class_name("XCUIElementTypeTextField")
stfEle = self.driver.find_element_by_class_name("XCUIElementTypeSecureTextField")
tfEle.send_keys("mqctest".decode('UTF-8'))
time.sleep(1)
stfEle.send_keys("123456".decode('UTF-8'))
time.sleep(2)
# 点击“登录”按钮
loginBtn = self.driver.find_element_by_xpath("//XCUIElementTypeButton[@label='登录']")
loginBtn.click()
# 等待登录成功
time.sleep(5)
def tearDown(self):
# 测试结束,退出会话
self.driver.quit()
if __name__ == '__main__':
try: unittest.main()
except SystemExit: pass
移动测试平台通过执行main.py
文件的测试脚本实施功能测试。
启动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 | 设置测试用例执行完成后,对设备进行完全清理。 |
执行测试脚本
本地添加已开启开发者模式的手机。
在本地命令行,执行
python main.py -v
命令,执行并验证测试脚本功能正常。
提交至移动测试
1:将测试文件打包为zip文件。
main.py文件必须放在根目录下。
2:在移动测试操作页面,新建上传脚本,用于后续的iOS功能测试。具体操作请参见新建脚本。