Airtest Project是网易开发的一款开源的UI自动化测试项目,它主要用于游戏和App的UI自动化测试,不了解的可以进入其官网看看文档:[http://airtest.netease.com/](http://airtest.netease.com/),这里呢,主要记录一下在Android平台上进行的App 性能测试的总结。
Airtest Project是一个面向UI自动化测试的项目,为什么说做的是性能测试呢,因为这次过程中,我是主要是用Airtest Project来识别App控件,使用其跨平台的API来操控App,结合腾讯的GT(手机端监控手机状态,收集手机数据:cpu,内存等,以得到被测App的性能数据)来做的。
想要利用脚本完成自动化测试,需要将PC端的安装包发送到手机上安装App,这里可以使用两种方案,一是在Python脚本中使用安卓adb命令执行安装:需要导入import os模块和from airtest.core.android.adb import ADB,使用os.system()来执行adb命令,二是使用android.install_app()API来实现,需导入from airtest.core.android.android import Android;先写android = Android(serialno=None, host=None, cap_method=’MINICAP_STREAM’, touch_method=’MINITOUCH’, ime_method=’YOSEMITEIME’, ori_method=’MINICAPORI’)。
对于使用poco控件识别,需要写poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False),airtest和poco提供了很多App内的手势操作API(官网可见),如:poco.start_gesture([0.5, 0.8]).to([0.5, 0]).up()是上拉或下滑操作,0.5,0.8分别是手机屏幕的X,Y轴坐标,前者是起点,后者是终点;poco(text=”xxx”).click()这是对某个控件的点击操作。
安装App时各个手机会弹出询问框如:是否允许USB安装应用? 这时,无法使用if判断去做出同意操作,因为,if判断在安装语句android.install_app()的前面或后面,是顺序执行,安装时弹出框,后面if无法处理到(不安装成功不会执行android.install_app()下面的if判断),这时,需要些多线程来处理,如下:
class permission_deal_thread(threading.Thread): #处理权限
def init(self):
threading.Thread.init(self)
def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
permission_deal()
def permission_deal():
while True:
if flag == False:
break;
try:
if poco(text=’允许’).exists:
poco(text=’允许’).click()
except:
pass
thread1 = usb_install_thread()
thread1.start()
android.install_app(“xx/xx/xx/GT_2.2.6.5.apk”,replace=True)
这样安装时的弹窗才会被线程检测到,做出:允许:的点击操作。之后在编辑脚本时可以利用python的循环,判断来处理App的各种逻辑判断,做出操作。在使用airtest,poco编写程序后运行可能会偶尔失效,运行成功率不可靠,这时需要编写者对各个处理语句做出时间间隔,可以使用seelp(1.0)来间隔一秒(场景:打开某页面,点击其某控件时由于手机原因或网速,打开此页面的速度不可控,点击click()一定时间内未检测到此控件,就往下执行了就会报错),也可以使用如poco(“com.tencent.wstt.gt:id/select_app”).wait_for_appearance()中的wait_for_appearance(),意思是等待这个控件出现(默认120秒)再点击,这个方法可靠性更高。
如果需要将手机的数据文件导出,可以使用dev=ADB().devices(state=”device”)[0][0];
copy = ADB(serialno=dev, adb_path=None, server_addr=None);
copy.pull(local,path); 这里dev是使用adb命令的 adb devices 来检测手机序列号,用于ADB(serialno=dev, adb_path=None, server_addr=None)中serialno参数(指定手机),pull就是导出local本机文件地址,path是pc存放地址,地址不可有中文。
最后,不同的手机做App自动化测试,需要针对不同的手机做适配代码编写,因为手机型号,厂家,系统版本,UI界面的差异,需要作出不同的判断和处理,poco检测的空间name有时候在不同的手机上会不一样,因此可配合airtest图像识别使用。下面将本次用到的模块列出:
from airtest.core.api import *
from airtest.core.android.android import Android
from airtest.core.android.adb import ADB
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
from poco.exceptions import PocoNoSuchNodeException
import threading
from airtest.core.error import *
import urllib
import os
import datetime
android = Android(serialno=None, host=None, cap_method=’MINICAP_STREAM’, touch_method=’MINITOUCH’, ime_method=’YOSEMITEIME’, ori_method=’MINICAPORI’)
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)