zoukankan      html  css  js  c++  java
  • 《自拍教程51》Python adb批量生成App版本表格

    案例一:版本在软件研发阶段是很重要的, 不同的版本,
    已修复的Bug也不一样, 所实现的功能不一样,
    Android终端产品正式版本发布前,项目经理除了确保系统版本确定无误外,
    还会逐个验证所搭载的所有App的版本是否都是正确,
    防止App做系统集成的时候集成错了,导致App功能缺失或异常!
    案例二: 测试经理要求我做一个表,表格包含了系统的所有App名称,
    App版本信息, 用于做性能测试数据统计(CPU & Memory)。


    那问题来了,如何批量把Android里边的已经集成的所有App的版本列出来,并生成表格?
    以魅族Note5手机为例, 如果是手动记录登记,
    一般是设置-》应用程序管理-》一个一个的看版本:


    准备阶段
    1. adb shell pm list package 可以列出所有系统内的app包名,
      pm是package manger的简称,是Android的一个重要的app安装包管理工具,
      可用于安装app,卸载app,列出所有app等。
    2. adb shell dumpsys package + App包名可以解析version相关信息,
      dumpsys 是Android重要的解析工具,可以解析App package。
    3. 可以考虑用openpyxl模块来生成一个excel格式,当然也可以考虑做成csv文本格式,
      如果是excel操作,都建议用openpyxl,尽量不用xlrd, xlwt等过时的模块。

    Python批处理脚本形式

    批处理脚本的精髓就是顺序执行,可批量处理。

    # coding=utf-8
    
    import os
    import re
    import csv
    
    app_list = []  # 新建一个空的列表,用于存放所有app的package name用的。
    app_version_dict = {}  # 新建一个空字典,用于存放app package name及version信息。
    
    # 先读取系统内的所有App的package
    app_str = os.popen("adb shell pm list package").read()
    
    for line in app_str.splitlines():
        app_list.append(line.replace("package:", ""))
    print(app_list)
    
    # 获取各个App package的version信息
    for app in app_list:
        version_str = os.popen("adb shell "dumpsys package %s| grep versionName"" % app).read()
        version_name = re.findall(r"versionName=(.*)", version_str)[0]
        print("App : %s, Version : %s" % (app, version_name))
        app_version_dict[app] = version_name
    
    # 将app_version_dict字典写入CSV 表格中。
    table_title = ["App_Package_Name", "Version"]  # 表格第一行
    
    csvfile = "App_Version.csv"
    with open(csvfile, "w", newline='') as hf:
        writer = csv.DictWriter(hf, fieldnames=table_title)  # 将字典填写进csv,建议用DictWriter类
        writer.writeheader()
        for key, value in app_version_dict.items():
            writer.writerow({'App_Package_Name': key, 'Version': value})
    
    print("App的包名与其版本信息,已经存储到了%s" % os.path.abspath(csvfile))
    os.system("pause")
    

    Python面向过程函数形式
    # coding=utf-8
    
    import os
    import re
    import csv
    
    
    def get_package():
        app_list = []  # 新建一个空的列表,用于存放所有app的package name用的。
        app_str = os.popen("adb shell pm list package").read()
        for line in app_str.splitlines():
            app_list.append(line.replace("package:", ""))
        return app_list
    
    
    def get_app_version(app_package):
        '''获取指定app的版本号'''
        version_str = os.popen("adb shell "dumpsys package %s| grep versionName"" % app_package).read()
        version_name = re.findall(r"versionName=(.*)", version_str)[0]
        print("App : %s,  Version : %s" % (app_package, version_name))
        return version_name
    
    
    def get_all_apps_version():
        '''获取所有app的版本号'''
        app_version_dict = {}  # 新建一个空字典,用于存放app package name及version信息。
        for app in get_package():
            version_name = get_app_version(app)
            app_version_dict[app] = version_name
        return app_version_dict
    
    
    def write_csv(input_dict, csvfile):
        '''将app_version_dict字典写入CSV 表格中'''
        table_title = ["App_Package_Name", "Version"]  # 表格第一行
        with open(csvfile, "w", newline='') as hf:
            writer = csv.DictWriter(hf, fieldnames=table_title)
            writer.writeheader()
            for key, value in input_dict.items():
                writer.writerow({'App_Package_Name': key, 'Version': value})
        print("App的包名与其版本信息,已经存储到了%s" % os.path.abspath(csvfile))
    
    
    app_version_dict = get_all_apps_version()  # 获取所有的App及其版本组成的字典
    csvfile = "App_Version.csv"  # 自定义指定保存到哪个csvfile
    write_csv(app_version_dict, csvfile)  # 将字典写入csv
    os.system("pause")
    

    Python面向对象类形式
    # coding=utf-8
    
    import os
    import re
    import csv
    
    
    class PackageVersionGetter():
        def __init__(self):
            self.app_list = []  # 新建一个空的列表,用于存放所有app的package name用的。
            self.app_version_dict = []  # 新建一个空字典,用于存放app package name及version信息。
    
        def get_package(self):
            app_str = os.popen("adb shell pm list package").read()
            for line in app_str.splitlines():
                self.app_list.append(line.replace("package:", ""))
    
        def get_app_version(self, app_package):
            '''获取指定app的版本号'''
            version_str = os.popen("adb shell "dumpsys package %s| grep versionName"" % app_package).read()
            version_name = re.findall(r"versionName=(.*)", version_str)[0]
            print("App : %s,  Version : %s" % (app_package, version_name))
            return version_name
    
        def get_all_apps_version(self):
            '''获取所有app的版本号'''
            self.get_package()  # 确保self.app_list里边有数据,不会是空列表
            for app in self.app_list:
                version_name = self.get_app_version(app)
                self.app_version_dict[app] = version_name
            return self.app_version_dict
    
    
    class CsvWriter():
        def __init__(self, csvfile, input_dict):
            self.csvfile = csvfile
            self.input_dict = input_dict
    
        def write_csv(self):
            '''将app_version_dict字典写入CSV 表格中'''
            table_title = ["App_Package_Name", "Version"]  # 表格第一行
            with open(self.csvfile, "w", newline='') as hf:
                writer = csv.DictWriter(hf, fieldnames=table_title)
                writer.writeheader()
                for key, value in self.input_dict.items():
                    writer.writerow({'App_Package_Name': key, 'Version': value})
            print("App的包名与其版本信息,已经存储到了%s" % os.path.abspath(csvfile))
    
    
    if __name__ == '__main__':
        p_obj = PackageVersionGetter()
        app_version_dict = p_obj.get_all_apps_version()  # 获取所有的App及其版本组成的字典
    
        csvfile = "App_Version.csv"  # 自定义指定保存到哪个csvfile
        c_obj = CsvWriter(csvfile, app_version_dict)
        c_obj.write_csv()  # 将字典写入csv
        os.system("pause")
    

    运行方式与效果

    确保Android设备通过USB线与电脑连接了,adb设备有效连接,
    以上代码的3种实现形式都可以直接运行,比如保存为get_app_version.py并放在桌面,
    建议python get_app_version.py运行,当然也可以双击运行。
    效果如下:备注有些版本是7是正常的,因为这些是google自带的Android7版本的App.


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

  • 相关阅读:
    redis集群报错,(error) MOVED 15495 127.0.0.1:7003
    在云服务器上时候,我关闭了防火墙还是不能连接!
    redis 集群安装 3主3从3台云主机
    ajax完成团队信息异步添加【实际项目】
    众创项目首页推荐需求
    添加删除表格(js完成)【自己实际项目】
    【JPA 级联保存/级联删除】@OneToMany (双向) 一对多【转】
    页面提交 string数组和list对象集合举例
    Form表单如何传递List数组对象到后台的解决办法(转)
    实现同时提交多个form(基础方法) 收集(转)
  • 原文地址:https://www.cnblogs.com/zipython/p/12600130.html
Copyright © 2011-2022 走看看