写文章原因:在手机厂商(小厂)工作,常规测试已经不能满足平常工作以及售后问题,所以在学习适合工作的技术。
网上找了一大圈相关移动端自动化测试的课程、线下的书籍,基本上都是一些培训机构对于python+uiautomator2的基本操作公开课,真正的干货的东西还是在大佬的博客中一个一个尝试出来的,所以决定自己记录总结下来,方便回顾。
为什么选这个方案
pytest这个方案只能在线运行,严格来说并不适合手机厂商,因为平常工作追求高效率应该用JAVA+uiautomator2+junit根据系统key生成apk离线跑更合适,但是找了一大圈资料实在是没找到,在appium与uiautomator2之中选了其次合适的。
先写一个pytest+uiautomator2压测通话脚本(也就是外面那种一个小时学会自动化测试的课程)
python==3.10 sdk ==android 9-12(写java时用到) adb ==用的sdk自带的
pycharm中使用命令安装
pip install -i pypi.tuna.tsinghua.edu.cn/simple/ uiautomator2
手机安装小黄车atx
python -m uiautomator2 init
元素定位选择adb自带
多设备拨打脚本如下
class callup():
def __init__(self, count, deviceid):
self.count = count
self.deviceid = deviceid
def connectPhone(self):
deviceA = u2.connect_usb(deviceid)
class child(callup):
#实列化父类
callup = callup()
def startCall(self):
callup.deviceA(text="拨打电话").click()
import time
from os.path import exists
import uiautomator2 as u2
class callup():
def __init__(self, count):
self.count = count
def startCall(self):
if deviceA(text='拨打电话').exists:
deviceA(text='拨打电话').click()
else:
print('已在拨打电话界面')
if deviceA(resourceId='com.android.dialer:id/dialpad_floating_action_button').exists:
print("拨号盘已打开")
time.sleep(2)
if deviceA(resourceId='com.android.dialer:id/fab').exists:
print("拨号盘已收缩")
deviceA(resourceId='com.android.dialer:id/fab').click()
def takeCall(self):
deviceA(resourceId='com.android.dialer:id/one').click()
deviceA(resourceId='com.android.dialer:id/zero').click()
deviceA(resourceId='com.android.dialer:id/zero').click()
deviceA(resourceId='com.android.dialer:id/eight').click()
deviceA(resourceId='com.android.dialer:id/six').click()
deviceA(resourceId='com.android.dialer:id/dialpad_floating_action_button').click()
deviceA(resourceId='com.android.dialer:id/contactgrid_bottom_timer').wait(timeout=15.0)
time.sleep(5)
deviceA(resourceId='com.android.dialer:id/incall_end_call').click()
def repeatTake(self):
i = 1
while (self.count > 0):
self.startCall()
self.takeCall()
print("第 %d 次拨打" % i+'成功')
i = i + 1
self.count = self.count - 1
time.sleep(5)
if __name__ == '__main__':
deviceid = str(input("请输入序列号:"))
deviceA = u2.connect_usb(deviceid)
count = int(input("请输入电话次数:"))
deviceA.implicitly_wait(3)
callup = callup(count)
callup.repeatTake()
上面脚本通过python窗口输入的sn号与压测次数,通过resourceId或text属性定位元素,达到压测通话功能的目的。
但是会有3个问题:
1.如果在测试当中,某个元素因第三方因素或机器异常无法识别,该脚本就直接停止,并保留现象。无法达到咱们一个压测次数或时长的目的(这就需要失败重跑了)
2.假设测试过程中异常了,咱们还想看到当时现场的时间以及相关截图以便分析(这就需要加log打印以及截图了)
3.领导想看整体的测试报告,无法给出