python+pytest+uiautomator2+allure移动端测试(一)

243 阅读2分钟

写文章原因:在手机厂商(小厂)工作,常规测试已经不能满足平常工作以及售后问题,所以在学习适合工作的技术。

网上找了一大圈相关移动端自动化测试的课程、线下的书籍,基本上都是一些培训机构对于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.领导想看整体的测试报告,无法给出

所以这种只能自用,对工作以及技术发展并没有太大的帮助噢