1 前言
在之前的内容里面已经大致介绍了python如何实现自动化的操作android设备。
这边细分下读取文件内容并且根据相关的数据来画对应的图。
首先我上一个系统做的是python自动化测试android设备camera并且记录其内存PSS部分的内容。
我们需要使用相关的命令把camera 对应的PSS dump下来保存到一个文件中。
对应的adb命令如下,只要把这个命令嵌入到python脚本中即可。
adb shell dumpsys meminfo camerahalserver |grep -iE "TOTAL PSS" >> hal_PSS.txt
然后我们写个函数去读取这个文件的内容解析数据并画图即可。
是不是很简单。
2 读取文件
filename = "hal_PSS.txt" #文件名字,我这边是做成一个函数,所以我并不在乎实际的文件名。反正都可以随便拼接
逐行读取文件里面的内容,在这个循环内进行操作:
for line in fileinput.input(filename):
然后我们分析下hal_PSS.txt文件里面的内容,相关的内容如下:
TOTAL PSS: 79355 TOTAL RSS: 104520 TOTAL SWAP (KB): 0
TOTAL PSS: 79372 TOTAL RSS: 104520 TOTAL SWAP (KB): 0
TOTAL PSS: 86361 TOTAL RSS: 111872 TOTAL SWAP (KB): 0
TOTAL PSS: 91069 TOTAL RSS: 116888 TOTAL SWAP (KB): 0
TOTAL PSS: 360285 TOTAL RSS: 386116 TOTAL SWAP (KB): 0
TOTAL PSS: 351685 TOTAL RSS: 377516 TOTAL SWAP (KB): 0
TOTAL PSS: 348977 TOTAL RSS: 374808 TOTAL SWAP (KB): 0
TOTAL PSS: 359813 TOTAL RSS: 385644 TOTAL SWAP (KB): 0
TOTAL PSS: 89932 TOTAL RSS: 115696 TOTAL SWAP (KB): 0
TOTAL PSS: 92000 TOTAL RSS: 117764 TOTAL SWAP (KB): 0
TOTAL PSS: 91940 TOTAL RSS: 117704 TOTAL SWAP (KB): 0
TOTAL PSS: 92296 TOTAL RSS: 118060 TOTAL SWAP (KB): 0
TOTAL PSS: 92273 TOTAL RSS: 118080 TOTAL SWAP (KB): 0
TOTAL PSS: 92310 TOTAL RSS: 118124 TOTAL SWAP (KB): 0
TOTAL PSS: 92326 TOTAL RSS: 118140 TOTAL SWAP (KB): 0
TOTAL PSS: 92250 TOTAL RSS: 118064 TOTAL SWAP (KB): 0
TOTAL PSS: 92310 TOTAL RSS: 118124 TOTAL SWAP (KB): 0
TOTAL PSS: 92322 TOTAL RSS: 118136 TOTAL SWAP (KB): 0
我们需要的是PSS之后的第一个字段内容。
先过滤出PSS之后的内容存到textPSS中。
textPSS = line.split('TOTAL PSS:')[1]
好了 到这一步打印出textPSS看
79355 TOTAL RSS: 104520 TOTAL SWAP (KB): 0
79372 TOTAL RSS: 104520 TOTAL SWAP (KB): 0
86361 TOTAL RSS: 111872 TOTAL SWAP (KB): 0
91069 TOTAL RSS: 116888 TOTAL SWAP (KB): 0
360285 TOTAL RSS: 386116 TOTAL SWAP (KB): 0
351685 TOTAL RSS: 377516 TOTAL SWAP (KB): 0
348977 TOTAL RSS: 374808 TOTAL SWAP (KB): 0
359813 TOTAL RSS: 385644 TOTAL SWAP (KB): 0
89932 TOTAL RSS: 115696 TOTAL SWAP (KB): 0
92000 TOTAL RSS: 117764 TOTAL SWAP (KB): 0
91940 TOTAL RSS: 117704 TOTAL SWAP (KB): 0
92296 TOTAL RSS: 118060 TOTAL SWAP (KB): 0
92273 TOTAL RSS: 118080 TOTAL SWAP (KB): 0
92310 TOTAL RSS: 118124 TOTAL SWAP (KB): 0
92326 TOTAL RSS: 118140 TOTAL SWAP (KB): 0
92250 TOTAL RSS: 118064 TOTAL SWAP (KB): 0
92310 TOTAL RSS: 118124 TOTAL SWAP (KB): 0
92322 TOTAL RSS: 118136 TOTAL SWAP (KB): 0
再把空格给去掉,保证数字存储在数组的第一个字段先
textPSS = textPSS.strip() #去掉空格
打印出来的显示内容如下:
79355 TOTAL RSS: 104520 TOTAL SWAP (KB): 0
79372 TOTAL RSS: 104520 TOTAL SWAP (KB): 0
86361 TOTAL RSS: 111872 TOTAL SWAP (KB): 0
91069 TOTAL RSS: 116888 TOTAL SWAP (KB): 0
360285 TOTAL RSS: 386116 TOTAL SWAP (KB): 0
351685 TOTAL RSS: 377516 TOTAL SWAP (KB): 0
348977 TOTAL RSS: 374808 TOTAL SWAP (KB): 0
359813 TOTAL RSS: 385644 TOTAL SWAP (KB): 0
89932 TOTAL RSS: 115696 TOTAL SWAP (KB): 0
92000 TOTAL RSS: 117764 TOTAL SWAP (KB): 0
91940 TOTAL RSS: 117704 TOTAL SWAP (KB): 0
92296 TOTAL RSS: 118060 TOTAL SWAP (KB): 0
92273 TOTAL RSS: 118080 TOTAL SWAP (KB): 0
92310 TOTAL RSS: 118124 TOTAL SWAP (KB): 0
92326 TOTAL RSS: 118140 TOTAL SWAP (KB): 0
92250 TOTAL RSS: 118064 TOTAL SWAP (KB): 0
92310 TOTAL RSS: 118124 TOTAL SWAP (KB): 0
92322 TOTAL RSS: 118136 TOTAL SWAP (KB): 0
剩下把数字给过滤出来
textPSS = re.findall("\d+\.?\d*",textPSS) #过滤出对应的数字
打印出来的内容显示如下
['79355', '104520', '0']
['79372', '104520', '0']
['86361', '111872', '0']
['91069', '116888', '0']
['360285', '386116', '0']
['351685', '377516', '0']
['348977', '374808', '0']
['359813', '385644', '0']
['89932', '115696', '0']
['92000', '117764', '0']
['91940', '117704', '0']
['92296', '118060', '0']
['92273', '118080', '0']
['92310', '118124', '0']
['92326', '118140', '0']
['92250', '118064', '0']
['92310', '118124', '0']
['92322', '118136', '0']
我们只要第一段PSS的内容。后面的RSS和SWAP的内容都不需要。
由于dump下来的单位是kb,需要/1024转换成MB,加载到y_list中用作纵坐标。
y = round(int(textPSS[0])/1024, 2)
y_list.append(y)
横坐标就以行数为基准cnt 在循环开始前赋值为0,每一个读取行数增加1然后给到x_list中。
x = cnt + 1
x_list.append(x)
cnt = cnt+1
3 画图
横坐标和纵坐标都有了。接下来都正常画图即可。
全部的画图demo代码如下。
#画图函数
def plot(filename):
global a
cnt = 0
y_list = list()
x_list = list()
for line in fileinput.input(filename):
#print(cnt+1,line)
#print("测试次数",cnt)
textPSS = line.split('TOTAL PSS:')[1]
textPSS = textPSS.strip() #去掉空格
textPSS = re.findall("\d+\.?\d*",textPSS) #过滤出对应的数字
y = round(int(textPSS[0])/1024, 2)
y_list.append(y)
x = cnt + 1
x_list.append(x)
cnt = cnt+1
print("总共测试",cnt,"次")
y_max = y_list.index(max(y_list))
#a.testCase为对应的测试模块/ open/photo/switch
print(a.testCase,"最大PSS测试是第",y_max+1,"次,测试PSS为",max(y_list),"MB")
#画图
plt.figure()
plt.scatter(x_list, y_list, c='red', s=10, label='mb')
plt.xticks(range(x_list[0], x_list[cnt-1], int(cnt/4)))
plt.yticks(range(0, int(max(y_list)+100), int((max(y_list)+100)/5)))
peaks, _ = find_peaks(y_list)
plt.xlabel("time", fontdict={
'size': 16})
plt.ylabel("PSS", fontdict={
'size': 16})
plt.title(a.testCase, fontdict={
'size': 20})
plt.legend(loc='best')
plt.savefig(outJPG)
整体的呈现效果如下: