51Testing软件测试论坛
标题:
性能测试工具 python+monkey+ 监控 crash,性能统计
[打印本页]
作者:
frances720
时间:
2017-9-13 16:33
标题:
性能测试工具 python+monkey+ 监控 crash,性能统计
monkey 压力测试android
python3
统计性能信息cpu,men,fps,battery,flow
支持wifi,gprs统计
统计crash信息
[color=rgb(0, 105, 214) !important]
查看源码
monkey.ini 配置文件
cmd=adb shell monkey -p com.jianshu.haruki --throttle 500 --ignore-timeouts --ignore-crashes --monitor-native-crashes -v -v -v 200 >package_name=com.jianshu.harukiactivity = com.baiji.jianshu.account.SplashScreenActivitynet = wifi
throttle 每次事件等待500毫秒
net 支持gprs和wifi
[color=rgb(0, 105, 214) !important]
[color=rgb(0, 105, 214) !important]
[color=rgb(0, 105, 214) !important]
代码分析
主要监控代码
def get_cpu(pkg_name):
cmd = "adb shell dumpsys cpuinfo | findstr " + pkg_name
print(cmd)
output = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()
for info in output:
if info.split()[1].decode().split("/")[1][:-1] == pkg_name: # 只有包名相等
# print("cpu=" + info.split()[2].decode())
cpu.append(float(info.split()[2].decode().split("%")[0]))
print("----cpu-----")
print(cpu)
return cpu
def get_men(pkg_name):
cmd = "adb shell dumpsys meminfo %s" % (pkg_name)
print(cmd)
men_s = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()
for info in men_s:
if len(info.split()) and info.split()[0].decode() == "TOTAL":
# print("men="+info.split()[1].decode())
men.append(int(info.split()[1].decode()))
print("----men----")
print(men)
return men
# 得到fps
'''
@author fenfenzhong
'''
def get_fps(pkg_name):
_adb = "adb shell dumpsys gfxinfo %s" % pkg_name
print(_adb)
results = os.popen(_adb).read().strip()
frames = [x for x in results.split('\n') if validator(x)]
frame_count = len(frames)
jank_count = 0
vsync_overtime = 0
render_time = 0
for frame in frames:
time_block = re.split(r'\s+', frame.strip())
if len(time_block) == 3:
try:
render_time = float(time_block[0]) + float(time_block[1]) + float(time_block[2])
except Exception as e:
render_time = 0
if render_time > 16.67:
jank_count += 1
if render_time % 16.67 == 0:
vsync_overtime += int(render_time / 16.67) - 1
else:
vsync_overtime += int(render_time / 16.67)
_fps = int(frame_count * 60 / (frame_count + vsync_overtime))
fps.append(_fps)
# return (frame_count, jank_count, fps)
print("-----fps------")
print(fps)
return fps
def get_battery():
_batter = subprocess.Popen("adb shell dumpsys battery", shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE).stdout.readlines()
for info in _batter:
if info.split()[0].decode() == "level:":
battery.append(int(info.split()[1].decode()))
print("-----battery------")
print(battery)
return int(info.split()[1].decode())
def get_pid(pkg_name):
pid = subprocess.Popen("adb shell ps | findstr " + pkg_name, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE).stdout.readlines()
for item in pid:
if item.split()[8].decode() == pkg_name:
return item.split()[1].decode()
def get_flow(pkg_name, type):
pid = get_pid(pkg_name)
if pid is not None:
_flow = subprocess.Popen("adb shell cat /proc/" + pid + "/net/dev", shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE).stdout.readlines()
for item in _flow:
if type == "wifi" and item.split()[0].decode() == "wlan0:": # wifi
# 0 上传流量,1 下载流量
flow[0].append(int(item.split()[1].decode()))
flow[1].append(int(item.split()[9].decode()))
print("------flow---------")
print(flow)
return flow
if type == "gprs" and item.split()[0].decode() == "rmnet0:": # gprs
print("--------------")
flow[0].append(int(item.split()[1].decode()))
flow[1].append(int(item.split()[9].decode()))
return flow
else:
flow[0].append(0)
flow[1].append(0)
return flow
代码入口:
if ba.attached_devices():
mc = BaseMonkeyConfig.monkeyConfig(PATH("monkey.ini"))
# 打开想要的activity
ba.open_app(mc["package_name"], mc["activity"])
temp = ""
# monkey开始测试
start_monkey(mc["cmd"], mc["log"])
time.sleep(1)
starttime = datetime.datetime.now()
while True:
with open(mc["monkey_log"], encoding='utf-8') as monkeylog:
BaseMonitor.get_cpu(mc["package_name"])
BaseMonitor.get_men(mc["package_name"])
BaseMonitor.get_fps(mc["package_name"])
BaseMonitor.get_battery()
BaseMonitor.get_flow(mc["package_name"], mc["net"])
time.sleep(1) # 每1秒采集检查一次
if monkeylog.read().count('Monkey finished') > 0:
endtime = datetime.datetime.now()
print("测试完成咯")
app = {"beforeBattery": BaseMonitor.get_battery(), "net": mc["net"], "monkey_log": mc["monkey_log"]}
report(app, str((endtime - starttime).seconds) + "秒")
bo.close()
复制代码
2.0 版本更新
优化了统计性能数据的代码
支持多设备
用了持久化记录信息,删除全局变量统计性能信息
作者:
Miss_love
时间:
2017-9-13 17:35
高大上
作者:
神仙也考试
时间:
2017-9-13 17:50
虽然看不懂,但觉得很腻害!
作者:
xiaoqiangzq
时间:
2017-9-14 10:05
不错不错,支持!
作者:
清晨一缕阳光
时间:
2017-9-14 11:03
厉害!
作者:
xuxd32
时间:
2017-11-5 13:47
玩 monkey的高手,人外有人呀
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2