编写iOS测试脚本

移动测试支持执行遵循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个函数。

函数

说明

get_desired_capabilities()

获取本次会话的参数。

参数可根据实际需求进行设置。具体说明请参见Appium Desired Capabilities

get_uri()

返回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

本次会话所使用的自动化引擎。

  • Android 4.2以下:设置为Selendroid

  • iOS/Android 4.2以上(含):设置为Appium

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

设置测试用例执行完成后,对设备进行完全清理。

执行测试脚本

  1. 本地添加已开启开发者模式的手机。

  2. 在本地命令行,执行python main.py -v命令,执行并验证测试脚本功能正常。

提交至移动测试

1:将测试文件打包为zip文件。

说明

main.py文件必须放在根目录下。

2:在移动测试操作页面,新建上传脚本,用于后续的iOS功能测试。具体操作请参见新建脚本