《自拍教程51》Python_adb批量生成App版本表格
案例一:版本在软件研发阶段是很重要的, 不同的版本,
已修复的Bug也不一样, 所实现的功能不一样,
Android终端产品正式版本发布前,项目经理除了确保系统版本确定无误外,
还会逐个验证所搭载的所有App的版本是否都是正确,
防止App做系统集成的时候集成错了,导致App功能缺失或异常!
案例二: 测试经理要求我做一个表,表格包含了系统的所有App名称,
App版本信息, 用于做性能测试数据统计(CPU & Memory)。
那问题来了,如何批量把Android里边的已经集成的所有App的版本列出来,并生成表格?
以魅族Note5手机为例, 如果是手动记录登记,
一般是设置-》应用程序管理-》一个一个的看版本:
准备阶段
- adb shell pm list package 可以列出所有系统内的app包名,
pm是package manger的简称,是Android的一个重要的app安装包管理工具,
可用于安装app,卸载app,列出所有app等。 - adb shell dumpsys package + App包名可以解析version相关信息,
dumpsys 是Android重要的解析工具,可以解析App package。 - 可以考虑用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
也可关注“武散人”微信订阅号,随时接受文章推送。
《自拍教程51》Python_adb批量生成App版本表格的更多相关文章
- 《自拍教程52》Python_adb运行Shell脚本
Android作为一款Linux终端,肯定是支持.sh后缀的Shell脚本的运行的, 有时候测试环境准备或者长时间截取复杂的日志等,开发会给到一些Shell脚本. Shell脚本的执行的优势: 快捷高 ...
- 《自拍教程45》Python_adb实时监控Logcat日志
接上一篇:adb命令_一键截取logcat日志, 有一天, 系统稳定性开发负责人找到我,希望我能在跑android 系统monkey的时候, 实时监控logcat的输出,如果一旦发现"jav ...
- 《自拍教程46》Python_adb自动拍照100张
Android手机测试, 涉及照相机(Camera)应用程序的稳定性测试的用例, 需要涉及100张照片的拍照自动化测试. 准备阶段 先清理老照片,照片一般存放在/scard/DCIM目录下 adb s ...
- 如何使用CodeSmith批量生成代码(原创系列教程)
在上一篇我们已经用PowerDesigner创建好了需要的测试数据库,下面就可以开始用它完成批量代码生成的工作啦. 下面我会一步步的解释如何用CodeSmith实现预期的结果的,事先声明一下,在此只做 ...
- 【转】- 使用T4模板批量生成代码
前言 之前在 “使用T4模板生成代码 - 初探” 文章简单的使用了T4模板的生成功能,但对于一个模板生成多个实例文件,如何实现这个方式呢?无意发现一个解决方案 “MultipleOutputHelpe ...
- Hybrid App技术批量制作APP应用与跨平台解决方案
前言 简单的聊一聊我开发了4年之久的Hybrid App(混合模式移动应用)平台开发,目前一直在持续开发与维护,支持无编程快速开发! 其本意也不是要吹捧前端有多么强大,只是用自己的实际项目阐述下对于前 ...
- 代码批量生成WORD的遇到的问题及解决
好久没搞工具了,最近因为处理大规模公文处理单文档,自己写了个批量处理WORD的程序:在调试过程中,主要遇到两个问题 第一个是WORD的模板 数据很多,但是WORD模板只需要一个,将数据替换WORD里标 ...
- C# 程序自动批量生成 google maps 的KML文件
原文:C# 程序自动批量生成 google maps 的KML文件 google maps 的 KML 文件可以用于静态的地图标注,在某些应用中,我们手上往往有成百上千个地址,我们需要把这些地址和描述 ...
- webpack4 系列教程(十三):自动生成HTML文件
作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十三):自动生成 HTML 文件>原文地址.更欢迎来我的小站看更多原创内容:go ...
随机推荐
- CALL/APPLY、一些编程基础以及一些基础知识、正则
call.apply.bind 求数组的最大值和最小值: 数组排序(SORT的原理->localeCompare实现汉字比较),取头取尾 假设法 利用APPLY传参传递的是一个数组的机制,借用M ...
- CSS——NO.3(CSS选择器)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 这么香的Chrome插件,你都安装了吗?
工欲善其事必先利其器,今天长话短说,介绍13个敏捷.高效的Chrome插件 根据使用方式,本人将其划分为三大类: 开发者工具 日常效率工具类 浏览器管理类 开发者工具 1. Web Developer ...
- [译]HTML&CSS Lesson7: 设置背景和渐变色
背景对网站的设计有重大的影响.它有利于建立网站的整体感觉,设置分组,分配优先级,对网站的可用性也有相当大的影响. 在CSS中,元素的背景可以是一个纯色,一张图,一个渐变色或者它们的组合.在我们决定如何 ...
- 适配iphoneX
tips iphone6设备宽高为375×667,屏幕分辨率为750×1334,故其设备像素比(dpr)为2.iphoneX的设备宽高375*812,屏幕分辨率为1125x2436,故dpr=3 适配 ...
- HDFS DataNode详解
1. datanode介绍 1.1 datanode datanode是负责当前节点上的数据的管理,具体目录内容是在初始阶段自动创建的,保存的文件夹位置由配置选项{dfs.data.dir}决定 1. ...
- 手机抓包app在python中使用
使用python+airtesr+无线模式控制手机 官方文档中,在airtest.readthedocs.io/zh_CN/lates…有一段介绍如何连接安卓手机的例子: 但是这个线接模板,无线模式的 ...
- 前端BOM和DOM
前端基础之BOM和DOM 前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些 ...
- ubutu 12.04
1.[系统设置]->[外观]->[行为]->[自动隐藏启动器],隐藏左侧边栏后,可以按快捷键[CTRL+a]弹出侧边栏. 2.QtCreator调试,提示[ptrace不允许的操作] ...
- react 装 router - yarn add react-router-dom@next
react 装 router yarn add react-router-dom@next