python 实现app性能测试(cpu、内存占用情况)

一、获取app cpu占用情况

1、实现代码

import os,csv
import time
import numpy as np
from matplotlib import pyplot as plt
from check_package import check_package
import math

cpu_list=[]
time_list=[]
adress='app'
package_name,activity=check_package(adress)

# 写入表头
def write_head():
    headers = []
    headers.append('time')
    headers.append('init_cpu')
    with open('pack/files/cpuinfo.csv','w+',newline='') as f:
        writer = csv.DictWriter(f,fieldnames=headers)
        writer.writeheader()
# 控制获取cpu时间
def time_control():
    while True:
        end_time = time.time()
        # 通过开始时间和结束时间计算时间差判断是否在输入的时间内,超过输入时间则结束获取cpu值
        if (end_time-start_time)/60>=total_time:
            break
        # 检测一次某app的cpu占用情况
        adb = 'adb shell top -n 1 > pack/files/cpu_adb_info.csv'
        d = os.system(adb)
        get_cpu()

# 获取cpu
def get_cpu():
    with open('pack/files/cpu_adb_info.csv',encoding='utf-8',mode='r') as f:
        lines = f.readlines()
        for line in lines:
            # 适配低版本手机
            # 判断包名是否在行字符串中
            if package_name[0:15] in line and '%' in line:
                now = time.strftime('%H:%M:%S',time.localtime())
                time_list.append(now)
                cpu_1=line.split('%')[0]
                cpu_2=cpu_1.split(' ')
                cpu = cpu_2[len(cpu_2)-1]
                cpu_list.append(cpu)
                break
            # 适配高版本手机
            elif package_name[0:15] in line:
                now = time.strftime('%H:%M:%S',time.localtime())
                time_list.append(now)
                cpu_data = line.split(' ')
                cpu_data = list(filter(None,cpu_data))
                cpu = cpu_data[-4]
                cpu_list.append(cpu)
                break
            else:
                pass

# 将数据写入csv
def write_report():
    with open('pack/files/cpuinfo.csv','a+',newline='') as f:
        writer = csv.writer(f)
        for i in range(0,len(cpu_list)):
            writer.writerow([time_list[i],cpu_list[i]])
        print('数据插入成功')

# 绘制折线图
def mapping():
    hights = cpu_list
    # 将cpu值转换为浮点类型数据
    hights_float = list(map(float,hights))
    wights = time_list
    total=0
    for hight in hights_float:
        total+=hight
    ave = round(total/len(hights_float),2)
    # 计算cpu最高值和最低值
    sort_hights_float = sorted(hights_float)
    max_hight = round(sort_hights_float[0],2)
    min_hight = round(sort_hights_float[-1],2)
    print('最大值为:%.2f,最小值为%.2f,平均值为%.2f'%(max_hight,min_hight,ave))
    # 根据数据绘制图形
    # 创建自定义图像
    plt.figure(figsize=(11,4),dpi=600)
    # 生成网格,只展示y轴
    plt.grid(axis='y')
    # 绘制折线图
    plt.plot(wights,hights_float,'c-',linewidth=1,label=app_name)
    # 设置坐标轴范围
    plt.xlabel('time(H:Min:S)',fontsize=16)
    plt.ylabel('cpu_realtime(%)',fontsize=16)
    plt.title('{} cpu occupation'.format(app_name),fontsize=24)
    # 显示label
    plt.legend()
    # 横坐标显示间隔
    # 进行时间列表去重
    wights = list(set(wights))
    if len(wights)<=15:
        pass
    else:
        t = int(len(wights)/15)
        # 显示x轴的刻标,以时间间隔t展示
        plt.xticks(range(0,len(wights),t))
    # 旋转横坐标日期
    plt.gcf().autofmt_xdate()
    time_now = time.strftime('%H:%M:%S',time.localtime())
    save_path = 'pack/pictures/'+'{}_cpu_occupation_'.format(app_name)+ time_now
    plt.savefig(save_path)

if __name__=='__main__':
    total_time = math.ceil(float(input('请输入脚本执行时间(分钟):')))
    app_name = input('请输入app名称:')
    start_time = time.time()
    write_head()
    time_control()
    write_report()
    mapping()

二、cpu占用情况运行结果(曲线图)

 

 

 

 

二、获取app内存占用

1、实现代码

import os,csv
import time
import numpy as np
from matplotlib import pyplot as plt
from check_package import check_package
import math

mem_list=[]
time_list=[]
adress='app'
package_name,activity=check_package(adress)

# 写入表头
def write_head():
    headers = []
    headers.append('time')
    headers.append('init_mem')
    with open('pack/files/meminfo.csv','w+',newline='') as f:
        writer = csv.DictWriter(f,fieldnames=headers)
        writer.writeheader()

# 获取内存
def get_mem():
    with open('pack/files/mem_adb_info.csv',encoding='utf-8',mode='r') as f:
        lines = f.readlines()
        for line in lines:
            if 'TOTAL' in line and 'PSS' not in line:
                now = time.strftime('%H:%M:%S',time.localtime())
                time_list.append(now)
                mem_data = line.split(' ')
                # 过滤掉列表中的空字符串
                mem_data=list(filter(None,mem_data))
                mem = round(int(mem_data[1])/1024,2)
                mem_list.append(mem)
                

# 控制获取mem时间
def time_control():
    while True:
        end_time = time.time()
        # 通过开始时间和结束时间计算时间差判断是否在输入的时间内,超过输入时间则结束获取cpu值
        if (end_time-start_time)/60>=total_time:
            break
        # 检测一次某app的内存占用情况
        adb = 'adb shell dumpsys meminfo {} > pack/files/mem_adb_info.csv'.format(package_name)
        d = os.system(adb)
        get_mem()


# 将数据写入csv
def write_report():
    with open('pack/files/meminfo.csv','a+',newline='') as f:
        writer = csv.writer(f)
        for i in range(0,len(mem_list)):
            writer.writerow([time_list[i],mem_list[i]])
        print('数据插入成功')

# 绘制折线图
def mapping():
    hights = mem_list
    # 将mem值转换为浮点类型数据
    hights_float = list(map(float,hights))
    wights = time_list
    total=0
    for hight in hights_float:
        total+=hight
    ave = round(total/len(hights_float),2)
    # 计算mem最高值和最低值
    sort_hights_float = sorted(hights_float)
    max_hight = round(sort_hights_float[0],2)
    min_hight = round(sort_hights_float[-1],2)
    print('最大值为:%.2f,最小值为%.2f,平均值为%.2f'%(max_hight,min_hight,ave))
    # 根据数据绘制图形
    # 创建自定义图像
    plt.figure(figsize=(11,4),dpi=600)
    # 生成网格,只展示y轴
    plt.grid(axis='y')
    # 绘制折线图
    plt.plot(wights,hights_float,'c-',linewidth=1,label=app_name)
    # 设置坐标轴范围
    plt.xlabel('time(H:Min:S)',fontsize=16)
    plt.ylabel('mem_realtime(%)',fontsize=16)
    plt.title('{} mem occupation'.format(app_name),fontsize=24)
    # 显示label
    plt.legend()
    # 横坐标显示间隔
    # 进行时间列表去重
    wights = list(set(wights))
    if len(wights)<=15:
        pass
    else:
        t = int(len(wights)/15)
        # 显示x轴的刻标,以时间间隔t展示
        plt.xticks(range(0,len(wights),t))
    # 旋转横坐标日期
    plt.gcf().autofmt_xdate()
    time_now = time.strftime('%H:%M:%S',time.localtime())
    save_path = 'pack/pictures/'+'{}_mem_occupation_'.format(app_name)+ time_now
    plt.savefig(save_path)

if __name__=='__main__':
    total_time = math.ceil(float(input('请输入脚本执行时间(分钟):')))
    app_name = input('请输入app名称:')
    start_time = time.time()
    write_head()
    time_control()
    write_report()
    mapping()

2、内存占用运行结果(曲线图)

 

posted @ 2023-01-29 11:57  梅梅不想踩坑  阅读(1588)  评论(7编辑  收藏  举报