• 《自拍教程61》Python adb反复启动退出高德地图App


    案例故事: Android车载测试过程中,客户反馈低概率偶现高德地图App启动过程中,
    出现了报错:“高德地图无法继续运行”,客户说只碰到过一次,后续再没复现过,

    测试经理安排我们负责压测,反复进行高德地图打开关闭,
    并在打开过程中,截一张图,打开加载完毕后再截取一张图,
    测试经理希望自动化实现截取一晚上!


    准备阶段
    1. adb shell am start + 指定的Package包名 + Activity活动页面,可以打开App
    2. 可以通过adb shell 里边的pm list package | grep amap来查看包名
      最终我们获取到高德地图的包名是:com.autonavi.amapauto,
    3. 可以在高德地图App界面,通过adb shell 里边的dumpsys window | grep Activity,来查看当前活动窗口的Activity,
      最终是: com.autonavi.amapauto/com.autonavi.amapauto.MainMapActivity
    4. adb shell am force-stop + 指定的Package包名,可以直接关闭App,无需加Activity。
    5. 注意:自动截取过程中,需要确保后台的logcat日志,高德地图log,tombstone等都是正常在后台打开并持续截取的。

    Python批处理脚本形式

    记住批处理脚本的精髓:顺序批量执行

    # coding=utf-8
    
    import os
    import time
    
    for i in range(100000):
        print("正在进行第%s轮高德地图重启测试" % i)
        os.system("adb shell am start com.autonavi.amapauto/com.autonavi.amapauto.MainMapActivity")
        os.system("adb shell screencap -p /sdcard/a.png")
        os.system("adb pull /sdcard/a.png D:\MapTest\once_%s.png" % i)  # App启动中的截图
        time.sleep(5)
        os.system("adb shell screencap -p /sdcard/a.png")
        os.system("adb pull /sdcard/a.png D:\MapTest\twice_%s.png" % i)  # App启动完成的截图
        os.system("adb shell am force-stop com.autonavi.amapauto")
    
    os.system("pause")
    

    Python面向过程函数形式

    只需要一个函数reboot_apk,但是需要传递2个参数进去。

    # coding=utf-8
    
    import os
    import time
    
    # 封装,只留2个参数接口
    def reboot_app(package_name, activity_name):
        os.system("adb shell am start %s/%s" % (package_name, activity_name))
        os.system("adb shell screencap -p /sdcard/a.png")
        os.system("adb pull /sdcard/a.png D:\MapTest\once_%s.png" % i)  # App启动中的截图
        time.sleep(5)
        os.system("adb shell screencap -p /sdcard/a.png")
        os.system("adb pull /sdcard/a.png D:\MapTest\twice_%s.png" % i)  # App启动完成的截图
        os.system("adb shell am force-stop %s" % package_name)
    
    # 调用
    for i in range(1000000):
        print("正在进行第%s轮高德地图重启测试" % i)
        reboot_app("com.autonavi.amapauto", "com.autonavi.amapauto.MainMapActivity")
    os.system("pause")
    

    Python面向对象类形式
    1. 以"万物皆可归类"的思想, 先抽象化出一个类来,
      类名一般建议用"名词", 所以我们命名为"AppRebooter",
      代表App反复重启器, 且一般要驼峰式(首字母大写)来规范类的命名.
    2. 养成良好的类的初始化(init)的习惯,
      初始化过程中,需要说明是什么App的package和acitivity
    3. 这个AppRebooter类, 目前只需要一个重启apk的函数(动作功能)就足够了,
      函数的命名一般建议用"动词", 所以我们命名为: "reboot_apk" .
    4. 类是一个抽象的事物, 必须实例化成具体的对象后,
      才能进行调用, 所以我们实例化并命名成了a_obj, 表明是一个对象.
    5. 实例化成具体对象后, 对象就可以调用reboot_apk这个函数了.
    # coding=utf-8
    
    import os
    import time
    
    
    class AppRebooter():
        def __init__(self, package_name, activity_name):
            self.package_name = package_name
            self.activity_name = activity_name
    
        def reboot_app(self):
            os.system("adb shell am start %s/%s" % (self.package_name, self.activity_name))
            os.system("adb shell screencap -p /sdcard/a.png")
            os.system("adb pull /sdcard/a.png D:\MapTest\once_%s.png" % i)  # App启动中的截图
            time.sleep(5)
            os.system("adb shell screencap -p /sdcard/a.png")
            os.system("adb pull /sdcard/a.png D:\MapTest\twice_%s.png" % i)  # App启动完成的截图
            os.system("adb shell am force-stop %s" % self.package_name)
    
    
    if __name__ == '__main__':
        a_obj = AppRebooter("com.autonavi.amapauto", "com.autonavi.amapauto.MainMapActivity")
        for i in range(1000000):
    		print("正在进行第%s轮高德地图重启测试" % i)
            a_obj.reboot_app()
        os.system("pause")
    

    运行方式与效果

    确保Android设备通过USB线与电脑连接了,adb设备有效连接,
    以上代码的3种实现形式都可以直接运行,比如保存为reboot_amap_100000.py并放在桌面,
    建议python reboot_amap_100000.py运行,当然也可以双击运行,
    运行一晚上后,第二天早上来,可以根据截图的文件大小,判断是否出现异常情况。
    理论上说,图片的每个像素点都代表了不用的数据量,假如出现某个图片大小与其他的图片相差较大,
    则说明这张图片的图像内容与别的不同,可能存在包含报错:“高德地图无法继续运行”的图片。
    需要再手动check一下图片。


    更多更好的原创文章,请访问官方网站:www.zipython.com
    自拍教程(自动化测试Python教程,武散人编著)
    原文链接:https://www.zipython.com/#/detail?id=f03fb024569c4dec9b5d59d9b1314bc0
    也可关注“武散人”微信订阅号,随时接受文章推送。

  • 相关阅读:
    JavaWeb项目报错:The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
    Linux+Nginx+Tomcat+Redis实现负载均衡,应用集群及session共享
    CENTOS7下安装REDIS
    centOS7访问nginx失败解决-.0:80 failed (98: Address already in use)解决
    Nginx 配置反向代理后,页面中取绝对URL地址的问题显示代理端口
    linux中安装jdk
    在linux系统防火墙中放开对8080端口的限制
    Removing obsolete files from server... Could not clean server of obsolete files
    js关于小数点失精算法修正0.07*100竟然=7.000000000000001
    jquery ajax后台向前台传list 前台用jquery $.each遍历list
  • 原文地址:https://www.cnblogs.com/zipython/p/12770002.html
Copyright © 2020-2023  润新知