目录

1、手动统计方法

2、自动化统计方法

3、问题记录

我们知道可以通过Appium来控制iOS或者Android设备,进而做一些自动化测试的任务,那么如果我们想收集应用(APP)的基础性能数据呢?

1、手动统计方法

Andriod设备可以通过adb命令("adb shell top")来简单的手机,iOS设备可以xCode的instruments工具来统计,如下所示,事实上也适用于Mac设备。

2、自动化统计方法

使用传统的方式 Appium + xcode的Instruments命令会出现各种各样的问题,比如Appium异常退出、Instruments命令内存泄露、采集不到数据等等。所以推荐试用是顺序:2.1 > 2.2 > 2.3

2.1 阿里同学开源的taobao-iphone-device库

参考:https://github.com/alibaba/taobao-iphone-device

主要功能说明如下:

代码示例:ios_debug.py

import time
import tidevice
from tidevice._perf import DataType
from logzero import loggert = tidevice.Device()
# perf = tidevice.Performance(t, [DataType.CPU, DataType.MEMORY, DataType.NETWORK, DataType.FPS, DataType.PAGE,
#                             DataType.SCREENSHOT, DataType.GPU])
perf = tidevice.Performance(t, [DataType.CPU, DataType.MEMORY])result_cpu = []
result_memory = []def callback(_type: tidevice.DataType, value: dict):# logger.info("R: {}, {}".format(_type.value, value))# 转换为其他日期格式,如:"%Y-%m-%d %H:%M:%S"time_array = time.localtime(value["timestamp"]/1000)other_style_time = time.strftime("%Y-%m-%d %H:%M:%S", time_array)if _type.value == "memory":result_memory.append({"memory": value["value"], "timestamp": other_style_time})elif _type.value == "cpu":result_cpu.append({"cpu": value["value"], "timestamp": other_style_time})# com.xxx.xx替换为自己的应用
perf.start("com.xxx.xx", callback=callback)
time.sleep(10)logger.info("result_cpu: {}".format(result_cpu))
logger.info("result_memory: {}".format(result_memory))# 根据时间戳合并2个数组
x_values = {x['timestamp']: x['cpu'] for x in result_cpu}
res_list = [{**y, **{'cpu': x_values[y['timestamp']]}} for y in result_memory]logger.info("res_list: {}".format(res_list))perf.stop()

输出结果:

Stopped
[I 220320 22:29:05 ios_debug:31] result_cpu: [{'cpu': 3.585903582731264, 'timestamp': '2022-03-20 22:28:58'}, {'cpu': 0.6396585121383214, 'timestamp': '2022-03-20 22:28:59'}, {'cpu': 0.42271327814517523, 'timestamp': '2022-03-20 22:29:00'}, {'cpu': 1.8402275760576445, 'timestamp': '2022-03-20 22:29:01'}, {'cpu': 0.4501805132687883, 'timestamp': '2022-03-20 22:29:02'}, {'cpu': 0.6061838366665879, 'timestamp': '2022-03-20 22:29:03'}, {'cpu': 0.46928509407834135, 'timestamp': '2022-03-20 22:29:04'}]
[I 220320 22:29:05 ios_debug:32] result_memory: [{'memory': 148.19058227539062, 'timestamp': '2022-03-20 22:28:58'}, {'memory': 148.19058227539062, 'timestamp': '2022-03-20 22:28:59'}, {'memory': 148.19058227539062, 'timestamp': '2022-03-20 22:29:00'}, {'memory': 148.17495727539062, 'timestamp': '2022-03-20 22:29:01'}, {'memory': 148.17495727539062, 'timestamp': '2022-03-20 22:29:02'}, {'memory': 148.17495727539062, 'timestamp': '2022-03-20 22:29:03'}, {'memory': 148.17495727539062, 'timestamp': '2022-03-20 22:29:04'}]
[I 220320 22:29:05 ios_debug:38] res_list: [{'memory': 148.19058227539062, 'timestamp': '2022-03-20 22:28:58', 'cpu': 3.585903582731264}, {'memory': 148.19058227539062, 'timestamp': '2022-03-20 22:28:59', 'cpu': 0.6396585121383214}, {'memory': 148.19058227539062, 'timestamp': '2022-03-20 22:29:00', 'cpu': 0.42271327814517523}, {'memory': 148.17495727539062, 'timestamp': '2022-03-20 22:29:01', 'cpu': 1.8402275760576445}, {'memory': 148.17495727539062, 'timestamp': '2022-03-20 22:29:02', 'cpu': 0.4501805132687883}, {'memory': 148.17495727539062, 'timestamp': '2022-03-20 22:29:03', 'cpu': 0.6061838366665879}, {'memory': 148.17495727539062, 'timestamp': '2022-03-20 22:29:04', 'cpu': 0.46928509407834135}]Process finished with exit code 0

自动化测试:使用XCTest

请先确保手机上已经安装有WebDriverAgent应用,我使用的是Xcode编译WDA的方式在手机上安装:

可以使用tidevice applist命令查看手机已经安装的应用列表,示例如下,可以看到对应WDA的名字是:com.facebook.WebDriverAgentRunner.xctrunner

启动WDA命令:

tidevice xctest -B com.facebook.WebDriverAgentRunner.xctrunner

WDA正常启动的日志如下:

然后启动Appium,预期可以进行对应的自动化测试了,即不需要再使用xcode build的方式启动WDA了。

2.2 py-ios-device库

参考:(无需编译 WDA) 纯 Python 在 windows/mac 系统执行 iOS 自动化测试

功能说明:Win,Mac 跨平台方案,通过 Instruments 私有协议获取 iOS 相关性能指标数据。

中文文档:https://github.com/YueChen-C/py-ios-device/blob/main/README_CN.md

Demo:https://github.com/YueChen-C/py-ios-device/blob/main/test/test.py

2.3 原生的统计方法

那么这些统计方式怎么集成到我们的自动化工具中呢?

appium的官方给我们提供了对应封装,如:“Execute Mobile Command”方法,参考官网:Execute Mobile Command - Appium

我在使用的时候主要用的"mobile: startPerfRecord"和“mobile: stopPerfRecord” ,具体参数等使用参考官网:https://github.com/appium/appium-xcuitest-driver#platform-specific-extensions

代码片段如下,timeout字段单位为毫秒(ms),代表的是最大的采集时间,默认为5分钟,如果你想要采集的时间大于5min,需要更改下。pid不填的话代表采集的是所有的进程,为current时代表的是当前活跃的进程。

# profileName不填的话默认为: {"profileName": "Activity Monitor"}# 开启采集
driver.execute_script("mobile: startPerfRecord", {"profileName": "Activity Monitor","timeout": 600000, "pid": "current"})# 采集时间: 80s
time.sleep(80)# 结束采集, 并保存zip文件,如: trace.zip
b64_zip = str(driver.execute_script("mobile: stopPerfRecord"))
bytes_zip = base64.b64decode(b64_zip)trace_zip_filename = "trace.zip"
with open(trace_zip_filename, 'wb') as fz:fz.write(bytes_zip)

3、问题记录

1、在使用"mobile: startPerfRecord"和“mobile: stopPerfRecord统计资源的时候发现偶发失败,我的服务报错举例:

[E 220304 17:54:14 get_resource:410] get_hi_resource_data error, err: Message: An unknown server-side error occurred while processing the command. Original error: There is no .trace file found for performance profile 'Activity Monitor' and device db797ee3c5925cc5efc1c91c2c7237b104e26e54. Make sure the selected profile is supported on this device

Appium报错日志:[xctrace] Timed out waiting for device to boot: “R.S”的 iPhone (12.3.1)

[xctrace] Timed out waiting for device to boot: “Rong,Song”的 iPhone (12.3.1)
[Activit...@db797ee3]
[Activit...@db797ee3] Performance recording exited with error code 13, signal null

报错截图: 

解决办法:

(1)添加重试逻辑

唉,暂时想到的是只能重试,iOS结合Appium使用,速度慢和稳定性不好貌似很多人说过,谷歌查询关键词:“appium ios slow”结果如下:

(2)换根数据线直连或换个手机

比如:直接连接Mac和iOS,不要通过转接头什么。

2、Appium偶发退出,报错"Thread 0 Crashed:: CrBrowserMain  Dispatch queue: com.apple.main-thread"

Logical CPU:     0
Error Code:      0x00000006 (no mapping for user data write)
Trap Number:     14

网上查了半天,具体也不知道什么原因,于是准备加重试逻辑。

思路:使用命令行模式启动Appium,如果挂了后循环再启动。启动命令如下:

node /Applications/Appium.app/Contents/Resources/app/node_modules/appium/build/lib/main.js

效果如下:

循环启动的脚本如下,可以使用kill -9杀死appium进程的方法观察是否可以拉起,当然下面的方式比较粗暴,你也可以使用守护进程等方式。

python3 appium_server_run.py

import subprocess
import time
from logzero import loggerwhile True:logger.info("appium will start by node...")try:subprocess.run("node /Applications/Appium.app/Contents/Resources/app/node_modules/appium/build/lib/main.js", shell=True)except Exception as e:logger.error("appium is abnormal exit,will start agin in 5s later...")time.sleep(5)

3、Xcode WebDriverAgent Memory内存占用过高报错

2022.05.09:额,下面的这种方法好像没什么用,看看第4点吧

Thread 1: EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=1400 MB, unused=0x0)

Google搜索词:webDriverAgent Memory limit

结果参考:iOS WebDriverAgentRunner-Runner process growth high in memory usage and crashes during long test sessions (12+ hours) · Issue #15457 · appium/appium · GitHub

4、xcode启动的WebDriveAgentRunner随着Appium自动化的运行,内存不断的上升,如下截图所示

简而言之:就是尽量不要用driver.swipe()等操作,具体的可以看下面的描述。

Ps:经过测试发现是Appium自动化测试中的driver.swipe()操作引起的内存上升(当然可能只是其中一种情况),如果只是单纯的click()等操作内存基本在30M以内波动。

  • 有使用driver.swipe()时

  • 没有使用driver.swipe()时

在网上搜了下,也有类似的情况:https://github.com/appium/appium/issues/15457

只有先少用和尽量不要用driver.swipe()等操作了。

5.taobao-iphone-device库使用期间报错"UsbmuxReplyCode.ConnectionRefuse"

谷歌搜了下,作者回复了这个问题并修复了,Issunes地址:tidevice.exceptions.MuxReplyError: UsbmuxReplyCode.ConnectionRefused · Issue #148 · alibaba/taobao-iphone-device · GitHub

在0.6.11版本中修复了,升级下tidevice版本(我看了下我的版本是早期安装的0.6.8)

6、taobao-iphone-device库长时间运行测试获取内存数据报错[Errno 32] Broken pipe

谷歌搜了下,作者回复了这个问题并修复了,可能和第5点的问题一样,Issunes地址:长时间运行测试获取内存数据报错[Errno 32] Broken pipe · Issue #159 · alibaba/taobao-iphone-device · GitHub

Appium统计iOS或者Android应用的性能相关推荐

  1. HTML 5 会让iOS和Android开发者转行吗?

    我们第一次谈论 HTML5 要改变世界大概是因为乔布斯,他坚持在 iOS 上不兼容 Flash,在 Adobe 统治多媒体开发的那个年代,这需要付出极大的勇气.这么多年过去了,虽然所有人都在谈论 HT ...

  2. 对比Windows Phone与iOS、Android开发的不同[转]

    Windows Phone是微软公司在2010年发布的智能手机操作系统,目前最新版本是Windows Phone 8.0,在市面上能见到的是Windows Phone 7.5(Mango和Tango) ...

  3. iOS 使用Instruments优化内存性能

    iOS 使用Instruments优化内存性能 问题 项目中使用到图片合成视频,发现内存增长十分的迅速,导致一些因为内存引起的问题,本文使用这个案例,结合Instruments工具检测和分析问题,最终 ...

  4. Appium进行iOS自动化测试时遇到的问题及解决办法

    工作中在进行iOS Appium自动化测试的时候,遇到了环境配置.兼容使用问题,这里做个总结,以避免后续踩着这些坑. 问题1. 提示no module "appium" 解决:第1 ...

  5. ios编译与android编译区别是什么,为iOS和Android编译C ++代码(XCode)。 这是真的吗?...

    你绝对可以在iOS和Android上使用C ++. 我已经为两者编写了自己的游戏引擎. Xcode是iOS的常规IDE,本身支持"Objective-C ++"开发(编译器支持Ob ...

  6. 一套代码编译出ios和android,Hippy: Hippy 是一个新生的跨端开发框架,目标是使开发者可以只写一套代码就直接运行于三个平台(iOS、Android 和 Web)...

    Hippy 跨端开发框架 介绍 Hippy 是一个新生的跨端开发框架,目标是使开发者可以只写一套代码就直接运行于三个平台(iOS.Android 和 Web).Hippy 的设计是面向传统 Web 开 ...

  7. 国内用户ios android比例,国内iOS、Android系统的设备总量已达到了2亿

    首先,在2012年第三季度时,国内iOS.Android系统的设备总量已达到了2亿.在今年3月的时候,这一指标只有8700万,也就是说设备在半年内增长了125%.而在设备量大增的同时,用户也变得依赖移 ...

  8. ios刷android8.0,颤抖吧 iOS, Android 8.0正式发布!

    原标题:颤抖吧 iOS, Android 8.0正式发布! 如果现在选一个最好用的手机操作系统,多数人还是认为 iOS.不过最近几年,苹果和安卓的竞争越来越激烈,苹果的优势也越来越小.眼看 Andro ...

  9. iOS vs. Android,应用设计该如何对症下药?

    摘要:从iOS到Android,两大平台应用设计有何不同?又都存在什么样的问题?Android定制性太高,该如何进行UI设计?在CMDN CLUB第28期活动中,咕咚网高级产品经理王磊,从iOS.An ...

最新文章

  1. anaconda 设置python3为主_关于在Windows、Linux和Mac上安装设置Python的问题
  2. 代理加盟哪家小程序开发公司好
  3. 《软件工程》第01章在线测试
  4. Java基础学习网站收藏
  5. C51蜂鸣器和数码管动静态显示
  6. mysql列调换位置_mysql互换表中两列数据方法
  7. 论文阅读 - Beat Tracking by Dynamic Programming
  8. 系统图标及其注册表项
  9. 【Python】Python实战从入门到精通之三 -- 教你使用Python中条件语句
  10. 为2440搭建NFS开发环境【ZT】
  11. WIN7下VS2005 VS2008 SQLSERVER2005安装顺序
  12. 1026. 节点与其祖先之间的最大差值
  13. apicloud 请删除手机中的apploader后在尝试
  14. 管家婆 凭证查找 Date exceeds maximum of 19-12-31 报错管家婆 打开经营历程 Date exceeds maximum of 19-12-31 报错
  15. 聊聊六位半万用表电路(一)——保护
  16. 欠采样临界采样matlab,信号临界采样、过采样、欠采样实验报告
  17. oracle创建PDB数据库
  18. 微生物的质谱鉴定原理
  19. 如何在电脑上录制qq语音
  20. 关于黑马视频String 与int之间相互转化

热门文章

  1. 2.CreateWindowEx
  2. Autolayout布局相关和UIStackView
  3. 短视频脚本如何制作?节奏要会把握,视觉要有冲击
  4. 设计和QQ一样动态登录界面
  5. 从柯布-道格拉斯生产函数看云计算对传统软件工程的影响
  6. nmap+nagios
  7. nagios配置示例
  8. 高效的公式提取神器Mathpix snipping Tool+ Mathtype
  9. java关于hashmap编程题_在Java中,关于HashMap类的描述,以下说法错误的是( )。...
  10. 3-1存储系统-存储器概述主存储器