背景
微信公众号有业务范畴,需要实现微信UI自动化,来提高回归效率,减轻测试压力。
测试需求分析
1.微信为第三方app,无微信源码
2.微信公众号UI自动化测试,如Android系统,细分Native,H5两块UI自动化
3.微信有黑厂
测试方案设计
1.微信是个比较成熟的软件,本身质量稳定,因此针对公众号测试更多关注的是公众号功能本身,即H5页面测试。考虑平台开放性,选择Android版本微信作为回归载体
2.在上述的基础上,公众号UI自动化框架选型FAutoTest。主要考虑FAutoTest为微信自研UI自动化框架,对微信H5自动化兼容性好;支持Native,H5两种自动化测试,满足测试需求。
环境搭建
FAutoTest官网:https://github.com/Tencent/FAutoTest
参考官网完成环境的搭建:依赖环境+FAutoTest开发环境
注意:
1.只支持Python2.7.x
2.安装Python库,确认pip对应Python2.7.x

测试用例编写
官网提供的用例相对简单,下述内容在demo基础上丰富用例,更接近实际应用场合
工程介绍
官网git下工程,使用pycharm打开,工程结果如下:

1.dist:fastAutoTest依赖框架,需要到该路目录下运行手动下载
pip install dist/fastAutoTest-xxx.whl(whl文件请在dist目录下手动下载)
2.docs:说明文档目录,API使用方法可以再次进行参考
3.fastAutoTest:核心代码文件夹
4.sample:测试脚本文件夹
Navtive UI API介绍
FAutoTest集成了uiautomator,使用uiautomator实现Native UI自动化,常用API方法如下:
- 应用启动
//adb 命令行启动微信
cmd = 'adb shell am start com.tencent.mm/com.tencent.mm.ui.LauncherUI'
- 连接设备
//依赖包名
from uiautomator import Device
//通过设备id,连接设备
androidDriver = Device('SJE5T17821003335')
- 控件获取/点击
from uiautomator import Device
androidDriver = Device('SJE5T17821003335')
self.driver=androidDriver
#文本获取控件
self.driver(text='控件文案').click() //控件点击
content=self.driver(text='控件文案').text //控件文案获取
#resourceId获取控件+点击
self.driver(resourceId='resourceId').click() //控件点击
content=self.driver(resourceId='resourceId').text //控件文案获取
#className获取控件+点击
self.driver(className='className').click() //控件点击
content=self.driver(className='className').text //控件文案获取
H5 UI API介绍
FautoTest提供API来实现H5页面的获取及操作,一般微信公众号常用操作行为大致为如下三类:点击,文案输入,页面滑动。从应用场景出发简单这三类操作模拟:
-
控件点击
def clickElementByXpath(self, xpath, visibleItemXpath =None, duration=50, tapCount=1)
接口说明: 点击指定xpath的控件当控件不可见时,会自动滑动到该控件可见时,再进行点击当container为空时,默认滑动点为整个屏幕中间
参数说明: xpath:要点击控件的xpath
visibleItemXpath:当有container时,传入container中任意一个当前可见item的xpath,之后将目标滑到该可见item的位置
duration:两次点击的间隔时间
tapCount:点击次数 -
控件文案输入
def textElementByXpath(self, xpath, text)
接口说明:先获取输入框的焦点,再使用Chrome debug协议的输入api,输入文字内容
参数说明: xpath:输入框的xpath
text:要输入的文字 -
屏幕滑动
def scrollWindow(self, x, y, xDistance, yDistance, speed=80)
接口说明:通过坐标来滑动(屏幕的左上角为(0,0),向下和向右坐标逐渐增大)
参数说明: x: 滑动的起始X点坐标
y: 滑动的起始Y点坐标
xDistance: X方向滑动的距离
yDistance: Y方向滑动的距离
speed: 滑动的速度 -
返回上一页
def returnLastPage(self)
接口说明:返回上一页 -
获取控件
def getElementClassNameByXpath(self, xpath)
接口说明: 获取目标的className
参数说明: xpath:目标的xpath -
控件是否存在
def isElementExist(self, xpath)
接口说明: 返回一个boolean,判断该element是否存在
参数说明: xpath: 目标的xpath
脚本demo
# coding=utf-8
import sys
import os
#添加运行环境描述,便于命令行启动
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
from fastAutoTest.core.h5.h5Engine import H5Driver
import unittest
from uiautomator import Device as d
from uiautomator import Device
from time import sleep
class wechatPublicTest(unittest.TestCase):
@classmethod
def setUpClass(self):
# cmd = 'adb shell am force-stop com.tencent.mm'
#使用adb命令调起微信
cmd = 'adb shell am start com.tencent.mm/com.tencent.mm.ui.LauncherUI'
os.system(cmd)
#对应设备的deviceName,对应多台设备
androidDriver = Device('SJE5T17821003335')
#对应pc只连接一台设备,执行用户暂时用这种方式,通用性好
# androidDriver = d
self.driver=androidDriver
#休眠一下,等待微信主页面加载完毕
sleep(2)
#微信原生界面流程测试(uiautomator框架),进度小说分站首页
def test_case0_public_native(self):
#找到微信主页面的“通讯录” 并点击
self.driver(text='通讯录').click()
#点击公众号
self.driver(text='公众号').click()
#上下滑动去找测试公众号
self.driver(scrollable=True).scroll.to(text="测试公众号")
self.driver(text='测试公众号').click()
sleep(1)
self.driver(text='阅读记录').click()
sleep(1)
self.driver(text='最爱小说').click()
sleep(3)
#书籍搜索
def test_case1_public_Search(self):
#初始化driver
h5Driver = H5Driver()
h5Driver.initDriver()
# 进入书城首页
h5Driver.clickFirstElementByText('首页')
sleep(2)
h5Driver.clickElementByXpath('//*[@class="icon icon-search"]')
sleep(2)
h5Driver.textElementByXpath('//*[@id="search-input"]', "民国奇人")
sleep(2)
h5Driver.clickElementByXpath('//*[@class="btn f-fr"]')
sleep(2)
bookName=h5Driver.getElementByXpath('//*[@class="bookDesc"]/h3').text
self.assertTrue((bookName == "民国奇人"), '搜索异常,无目标书籍《民国奇人》')
sleep(1)
h5Driver.clickElementByXpath('//*[@class="bookDesc"]')
sleep(1)
#书籍中文校验
print "begin"
content = h5Driver.getElementByXpath('//*[@class="m-content"]/p[1]').text
print len(content)
# 考虑到书籍文字会根据
self.assertTrue(len(content) > 1, "书籍中文加载失败")
#书籍章节名获取
articleTitle = h5Driver.getElementByXpath('//*[@class="m-content"]/h1[1]/span[1]').text
# print articleTitle
flag = (articleTitle=='第二章 鲁班教中师与徒')
#书籍中文滑动到底部
h5Driver.scrollWindow(0, 0, 0, 1000,160)
sleep(1)
h5Driver.clickFirstElementByText('目录')
#根据flag,选择目标章节的目录点击
sleep(1)
if flag:
h5Driver.clickFirstElementByText('第一章 三道坎镇有邪事')
else:
h5Driver.clickFirstElementByText('第二章 鲁班教中师与徒')
sleep(3)
title = h5Driver.getElementByXpath('//*[@class="m-content"]/h1[1]/span[1]').text
targetTitle="第二章 鲁班教中师与徒"
if flag:
targetTitle="第一章 三道坎镇有邪事"
print "targetTitle:" + targetTitle
print "title:" + title
self.assertTrue(title==targetTitle)
Jenkins持续继承
- 1.命令行启动测试脚本
cd /Users/jc/Documents/pythonWorkSpace/AndroidUI/FAutoTest/sample
python BookDemo.py
-
2.新建Jenkins测试任务,将上述命令行脚本输入构建shell中,如下图
-
3.设置Jenkins持续运行参数,如运行时间,结果抄送邮件
网友评论