性能测试工具 python+monkey+ 监控 crash—性能统计

发表于:2017-10-25 14:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:程序员    来源:51Testing软件测试网采编

  ●ython3
  ●统计性能信息cpu,men,fps,battery,flow
  ●支持wifi,gprs统计
  ●统计crash信息
  查看源码
  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.haruki
  activity = com.baiji.jianshu.account.SplashScreenActivity
  net = wifi 
  ●throttle 每次事件等待500毫秒
  ●net 支持gprs和wifi
  代码分析
  主要监控代码
  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()
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号