Appium+python自动化(二十)- Monkey(猴子)日志(超详解)

news2024/11/23 12:45:45

简介

   日志是非常重要的,用于记录系统、软件操作事件的记录文件或文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统、软件的活动等重要作用,在开发或者测试软系统过程中出现了问题,我们首先想到的就是她——logging。她可不像泰戈尔说的:“天空没有留下翅膀的痕迹,但我已经飞过”;Monkey这个小姑娘,她可是一个爱炫耀,爱显摆的人已经达到了人过留名、雁过留声的境界。只要我们按图索骥就一定可以定位到问题所在,然后分析问题,解决问题。好了逗大家一乐,下面开始进入今天的正题。

1.为什么要看Monkey日志管理

  Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题。这样你就不会只停留在一个点点点的点工上,对自己也是一个很好的提升。

2.Monkey Log分析:

当monkey测试时出现问题,此时我们需要分析定位问题,我们需要分析monkey日志

Monkey测试出现的异常的原因: 
一般是两种原因导致的,一个是crash 程序崩溃,导致crash原因如下 
a)、程序存在空指针 
b)、cpu不足 
c)、内存不足

另一种是ANR 程序无响应,导致anr无响应原因如下: 
a)、线程阻塞 
b)、cpu不足 
c)、内存不足

查找分析原因:

1. 当monkey测试出现异常终止,请打开logcat日志搜索关键字‘anrin’,如果存在该关键字,说明app出现了ANR异常,我们需要把/data/anr目录下的trace.txt文件取下来。 
2. 取下来trace.txt文件后,将出现问题的进程号对应的日志发给软件工程师定位,如果在logcat日志里没有搜索到’anrin’关键字,就搜索’nullpointer’异常关键字的上下日志,发给开发定位 
3. 当出现ANR后,需要导出,步骤如下: 
1. 输入adb shell 
2. 输入cd /data/anr/ 
3. 输入ls

退出exit后,直接在cmd下输入
4. adb pull /data/anr/traces.txt   d:\trace.txt 
5. 在logcat将出现anr问题的进程号复制,然后在trace.txt文件里按ctrl+F 查找,粘贴进程号,查找对应的问题

2.1Monkey结果分类

Monkey运行log输出,按下列顺序输出

 下面就是我贴出的详细LOG分析:(表情代替注释符号,以免跟日志搞混)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

☀ 伪随机种子数与事件总数

:Monkey: seed=1519697645236 count=10

☀ 允许测试包

:AllowPackage: 包名1

☀ Category包含的LAUNCHER

:IncludeCategory: android.intent.category.LAUNCHER

☀ Category包含的MONKEY

:IncludeCategory: android.intent.category.MONKEY

☀ 查询允许包的activity 结果列表

// Selecting main activities from category android.intent.category.LAUNCHER

☀ 这些都不是指定包的activity

//   - NOT USING main activity com.android.browser.BrowserActivity (from package com.android.browser) 

//   - NOT USING main activity com.android.calendar.homepage.AllInOneActivity (from package com.android.calendar)

//   - NOT USING main activity com.android.camera.Camera (from package com.android.camera)

.... ☀ 中间忽略,从这也可以看出你手机上都安装了哪些应用

☀ 这个就是我们指定的包的activity

// + Using main activity 包名1.ui.portal.WelcomeActivity (from package 包名1)

//   Selecting main activities from category android.intent.category.MONKEY

☀ 种子为1519697645236

// Seeded: 1519697645236

☀ 事件百分比

// Event percentages:

//   0: 15.0%

//   1: 10.0%

//   2: 2.0%

//   3: 15.0%

//   4: -0.0%

//   5: -0.0%

//   6: 25.0%

//   7: 15.0%

//   8: 2.0%

//   9: 2.0%

//   10: 1.0%

//   11: 13.0%

☀ 表示跳转到com.crazyhornets.MyHokageAndroidZSY包中的com.crazyhornets.MyHokage.MyHokageActivity里

☀ 查看log中第一个Switch,主要是查看 Monkey 执行的是那一个 Activity,譬如下面的 log 中,执行的是com.yulore.yellowpage/.activity.SplashActivity,

在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。

:Switch: 

#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity;end

☀ 允许此Intent跳转

// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily

// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily

☀ 以下就是事件间的延迟和发送的各种事件

☀ --pct-nav事件

☀ sleeping for 0 milliseconds这句 log 是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件。(这个事件是指从用户角度来说的一个事件,比如点击:实际包括手指按下与抬起两个动作,monkey日记将被记为2个事件)

Sleeping for 0 milliseconds   

:Sending Key (ACTION_DOWN): 82    // KEYCODE_MENU

:Sending Key (ACTION_UP): 82    // KEYCODE_MENU

Sleeping for 0 milliseconds

:Switch:

#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity;end

    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily

    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily

☀ --pct-touch事件

Sleeping for 0 milliseconds 

:Sending Touch (ACTION_DOWN): 0:(532.0,1392.0)

:Sending Touch (ACTION_UP): 0:(542.04724,1391.5958)

☀ --pct-motion事件

Sleeping for 0 milliseconds   

:Sending Touch (ACTION_DOWN): 0:(838.0,113.0)

:Sending Touch (ACTION_UP): 0:(852.82526,101.77225)

☀ --pct-trackball事件

Sleeping for 0 milliseconds    

:Sending Trackball (ACTION_MOVE): 0:(1.0,4.0)

:Sending Trackball (ACTION_MOVE): 0:(-5.0,-3.0)

☀ --pct-rotation屏幕旋转百分比 ####隐藏事件

: Sending rotation degree=0, persist=true

: Sending rotation degree=1, persist=false:

: Sending rotation degree=2, persist=true

: Sending rotation degree=3, persist=false

☀ 注入事件10

Events injected: 10

☀ 发送屏幕翻转 度=0,存留=假

:Sending rotation degree=0, persist=false

☀ 丢弃:键=0,指针=0,轨迹球=0,键盘轻弹=0,屏幕翻转=0

:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0

☀ 网络状态:占用时间=42ms(手机0ms,wifi0ms,未连接42ms)

## Network stats: elapsed time=42ms (0ms mobile, 0ms wifi, 42ms not connected)

☀ 如果 Monkey 测试顺利执行完成,在 log 的最后,会打印出当前执行事件的次数和所花费的时间Monkey finished代表执行完成。Monkey 执行完成的 log 具体如下:

Events injected: 100:Sending rotation degree=0, persist=false:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0## Network stats: elapsed time=2042ms (0ms mobile, 0ms wifi, 2042ms not connected)// Monkey finished

☀ Monkey 执行中断,在 log 的最后也能查看到当前大约已执行的次数

:Sending Trackball (ACTION_MOVE): 0:(-3.0,1.0):Sending Trackball (ACTION_MOVE): 0:(4.0,0.0)    //[calendar_time:2018-04-02 11:23:50.322  system_uptime:718998]    // Sending event #7500:Sending Trackball (ACTION_MOVE): 0:(3.0,-2.0)

☀ Monkey测试完成

// Monkey finished

☀ CRASH输出LOG:

// CRASH: cn.包名1 (pid 3165)

// Short Msg: java.lang.IllegalStateException

// Long Msg: java.lang.IllegalStateException: Fragment SingleChatFragment{366281} not attached to Activity

// Build Label: Xiaomi/sagit/sagit:7.1.1/NMF26X/V9.2.4.0.NCACNEK:user/release-keys

// Build Changelist: V9.2.4.0.NCACNEK

// Build Time: 1516183841000

// java.lang.IllegalStateException: Fragment SingleChatFragment{366281} not attached to Activity

//  at android.support.v4.app.Fragment.getResources(Fragment.java:646)

//  at cn.yaomaitong.app.ui.message.fragment.SingleChatFragment$13$1.run(SingleChatFragment.java:586)

//  at android.os.Handler.handleCallback(Handler.java:754)

//  at android.os.Handler.dispatchMessage(Handler.java:95)

//  at android.os.Looper.loop(Looper.java:163)

//  at android.app.ActivityThread.main(ActivityThread.java:6365)

//  at java.lang.reflect.Method.invoke(Native Method)

//  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)

//  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:791)

☀ ANR输出LOG

//NOT RESPONDING:com.android.quicksearchbox(pid 6333)

ANR in com.android.quicksearchbox(com.android.quicksearchbox/.SearchActivity)

CPU usage from 8381ms to 2276ms ago:

procrank: ->adb shell procrank

anr traces: ->保存于/data/anr/traces.txt

meminfo: ->adb shell dumpsys meminfo

Bugreport ->adb bugreport 可选通过 --bugreport 参数控制

3.快速从monkey.txt日志中定位问题

3.1测试结果初步判断

1.monkey执行时未加--ignore-crashes --ignore-crashes参数,就先浏览日志中Events injected: 值,查看当前已执行的次数,就知道有无bug

2.程序无响应的问题:在日志中搜索 “ANR”

3.崩溃问题:在日志中搜索 “Exception” ,在这里顺便提一下常见的Java异常:

 1 算术异常类:ArithmeticExecption
 2 空指针异常类:NullPointerException
 3 类型强制转换异常:ClassCastException
 4 数组负下标异常:NegativeArrayException
 5 数组下标越界异常:ArrayIndexOutOfBoundsException
 6 违背安全原则异常:SecturityException
 7 文件已结束异常:EOFException
 8 文件未找到异常:FileNotFoundException
 9 字符串转换为数字异常:NumberFormatException
10 操作数据库异常:SQLException
11 输入输出异常:IOException
12 违法访问错误:IllegalAccessError
13 内存不足错误:OutOfMemoryError
14 堆栈溢出错误:StackOverflowError 15.其他,请参考:https://www.cnblogs.com/cvst/p/5822373.html

3.2找出问题后的操作步骤:

1.找到是monkey里面的哪个地方出错

2.查看Monkey里面出错前的一些事件动作,并手动执行该动作

3.若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样。

4.日志导出

  细心地小伙伴可能通过前边的一系列操作和查找日志定位问题,发现docs命令窗口在查看和操作的时候特别地不方便,那么Monkey有没有像Tomcat等其他工具那样有log日志文件,很不幸告诉小伙伴们答案是:NO!,但是好消息是:我们可以将日志导出到文件中。然后将文件导出到手机或者是电脑上。

4.1导出方法

导出到手机:

1

2

3

4

5

6

7

8

9

C:\Users\Shuqing>adb shell

monkey -v 100 >/sdcard/monkeylog.log

注意:不能写成C:\Users\Shuqing>adb shell monkey -f /sdcard/kyb.txt -v 1 > /mnt/sdcard/monkey.log 否则会报错“系统找不到指定的路径”。

需要将手机连接PC,拷贝以上文件:我们需要对这3个文件进行分析整理,以便提交开发人员处理。

当然了除了这种方法也比较麻烦,你可以通过命令直接导出到PC电脑端

导出到电脑:

1

2

3

4

5

6

7

例如:保存到电脑上并命名为monkey.txt

>adb shell monkey [option] <count> >d:\monkey.txt

eg:

C:\Users\Shuqing>adb shell monkey -v -v 100 >d:\monkeylog.txt

以上的导出方法,导出日志后,标准流和错误流的日志混合在一起,给我们定位和分析问题又带来麻烦了,因此需要将其分开导出保存。

标准流和错误流分开保存:

1

2

3

4

5

标准流与错误流分开保存,代码如下:

Monkey [option] <count> 1>/sdcard/monkey.txt 2>/sdcard/error.txt

C:\Users\Shuqing>adb shell monkey -v 100 1>d:\monkey.log  2>d:\error.log

执行以上命令,Monkey的运行日志和异常日志将被分开保存。此时Monkey的运行日志将被保存在monkey.txt文件中,而异常日志将被保存在D盘下的error.txt中。

各个文件主要内容:

1

2

3

4

5

info.txt:主要记录了MONKEY测试时发送的各种事件,如触摸事件的位置等等。

error.txt:主要记录了MONKEY测试时产生的一些ANR、强制关闭等异常。

LOG文件:主要主要记录程序对MONKEY测试时的响应情况。

5.日志参数

1、-v 较少的日志信息 
2、-v -v 较为丰富的日志信息 
3、-v -v -v 最高级别的日志信息(推荐)

6.小结

初步分析方法:

(1)、找到是monkey里面的哪个地方出现错误

(2)、查看monkey里面出错前的一些事件动作,并手动执行该动作

(3)、若以上步骤还不能找到,可以使用之前执行monkey命令,再执行一遍,注意使用的seed值要一样

测试结果分析:

(1)、ANR问题(程序无响应):在日志中搜索“ANR"(application no response)

(2)、闪退问题:在日志中搜索"crash"

(3)、异常:搜索"exception"

(4)、强制退出:搜索"force closed"

       好了,今天关于日志就到这里了!


              【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通

二、接口自动化项目实战

三、Web自动化项目实战


四、App自动化项目实战

五、一线大厂简历


六、测试开发DevOps体系

七、常用自动化测试工具


八、JMeter性能测试

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macOS Monterey 12.6.8 (21G725) 正式版发布,ISO、IPSW、PKG 下载

macOS Monterey 12.6.8 (21G725) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持…

Google 登录支付,Firebase 相关设置

登录sdk: https://developers.google.com/identity/sign-in/android/start?hlzh-cn 支付sdk: https://developers.google.com/pay/api/android/overview?hlzh-cn Firebase sdk: https://firebase.google.com/docs/android/setup?hlzh-cn 登录设置&#xff1a; 创建凭据&…

U盘做PE系统盘

下载微PE工具箱 网址&#xff1a;https://www.wepe.com.cn/ 下载好后可以看到一个.exe文件 安装PE系统 先插入U盘到电脑&#xff0c;然后打开微PE工具箱&#xff0c;选择安装到U盘 等待制作成功 这时候U盘会被分成两个分区&#xff0c;EFI分区是PE微系统所在的分区&a…

蓝桥杯专题-真题版含答案-【最大公共子串】【阿姆斯特朗数】【出售金鱼】【亲密数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

Android开发核心技术还是Framework~

这几年&#xff0c;社会问题层出不穷&#xff0c;最头疼的就是民生就业问题&#xff0c;大厂裁员&#xff0c;小厂倒闭&#xff0c;每年大批量的应届毕业生也涌入就业市场。 近几日&#xff0c;统计局也发布了就业相关数据&#xff0c;全国失业青年达600多万&#xff0c;面对此…

Solr原理剖析

一、简介 Solr是一个高性能、基于Lucene的全文检索服务器。Solr对Lucene进行了扩展&#xff0c;提供了比Lucene更为丰富的查询语言&#xff0c;并实现了强大的全文检索功能、高亮显示、动态集群&#xff0c;具有高度的可扩展性。同时从Solr 4.0版本开始&#xff0c;支持SolrCl…

《Ansible自动化工具篇:ubuntu操作系统基于ansible工具一键远程离线部署之K8S1.24.12二进制版集群》

一、部署背景 由于业务系统的特殊性&#xff0c;我们需要针对不同的客户环境部署二进制版K8S集群&#xff0c;由于大都数用户都是专网环境&#xff0c;无法使用外网&#xff0c;为了更便捷&#xff0c;高效的部署&#xff0c;针对业务系统的特性&#xff0c;我这边编写了 基于a…

pytest 核心库 pluggy 详解

目录 前言&#xff1a; 代码案例 实例化: 添加到钩子定义中 (add_hookspecs): 注册插件 (register): 传递实现插件的实体类对象 运行插件 pm.hook.myhook(arg11, arg22):本质就是调用对象的call方法 前言&#xff1a; pytest 是一个广泛使用的自动化测试框架&#xff0c…

明星代言的益处:提升品牌价值与销售增长的有力策略

​在当今竞争激烈的商业世界中&#xff0c;企业为了脱颖而出&#xff0c;吸引更多目标消费者的关注&#xff0c;常常需要运用一系列巧妙的市场营销策略。而其中&#xff0c;明星代言无疑是一种备受瞩目的行之有效的手段。通过让明星成为产品或服务的代言人&#xff0c;企业能够…

freeBSD:(虚拟机和实体机)官网下载——安装

freebsdiso镜像获取 获取 FreeBSD | The FreeBSD Project 官网 根据你 计算机型号找对应的镜像&#xff0c;现在大部分都是amd64的 找寻你需要的镜像&#xff0c;我这里选择4g的镜像&#xff0c;点击即可下载 刻录u盘&#xff08;虚拟机用户可以跳过&#xff09; 这里我们使…

C# 存在重复元素

217 存在重复元素 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;true 示例 2&#xff1a; 输…

【100天精通python】Day14:python 标准模块,自定义模块

目录 1 python 模块 2 标准模块 2.1 常见的标准模块 2.2 标准模块的导入 3 自定义模块 3.1 创建模块 3.2 导入模块 3.2.1 使用import 语句导入模块 3.2.2 使用from... import 语句导入模块 3.2.3 导入模块的全部定义 3.2.4 导入两个包含同名函数的模块 模块与函数的…

【Docker】Docker持续集成与持续部署(四)

前言&#xff1a; Docker与持续集成/持续部署&#xff08;CI/CD&#xff09;的作用是通过容器化技术实现环境一致性、快速构建和隔离性&#xff0c;从而加快软件交付速度、提高部署效率&#xff0c;确保持续集成和持续部署的顺利实施。 持续集成&#xff08;Continuous Integra…

chrome解决http自动跳转https问题

1.地址栏输入&#xff1a; chrome://net-internals/#hsts 2.找到底部Delete domain security policies一栏&#xff0c;输入想处理的域名&#xff0c;点击delete。 3.再次访问http域名不再自动跳转https了。

1.项目需求-项目实现

1.项目需求-项目实现代码是依次迭代的 慢慢增加。 密码只能输入整数&#xff0c;密码一般用字符串&#xff0c;用户名和密码都用字符串实现 需要头文件 不识别内容 string需要头文件。c头文件里没有.h #include string 是c特有的类型。 总结&#xff1a;string 是c特有的类型…

【冷冻电镜】InSilicoTEM 使用手册

简介 InSilicoTEM是一个用来模拟生成冷冻电镜显微图像的软件&#xff0c;原论文是"Image formation modeling in cryo-electron microscopy"。 该软件基DIPImage和MATLAB开发。 &#xff08;注&#xff1a;在GitHub上的代码&#xff0c;只适用于DIPImage2.9以及更早…

C# 父类实现的 IEquatable<T> 接口,重写的相等性判断函数都能被子类继承

实验代码 Son s1 new(), s2 new();Console.WriteLine("_ s1 s2"); _ s1 s2; Console.WriteLine();Console.WriteLine("_ s1 ! s2;"); _ s1 ! s2; Console.WriteLine();Console.WriteLine("_ s1.Equals(s2);"); _ s1.Equals(s2); Cons…

华为数通HCIP-BGP基础

AS&#xff08;自治系统/路由域&#xff09; 定义&#xff1a;运行相同路由协议&#xff0c;具有相同管理规则的区域&#xff08;一般为一个企业网&#xff09;&#xff1b; 按照传递路由时是否携带掩码分类&#xff1a; 1、有类路由协议 路由传递时&#xff0c;无需携带掩…

linux下的tomcat

springboot项目端口是8080&#xff0c;部署到linux运行之后&#xff0c;为什么能检测到tomcat 手动安装tomcat&#xff0c;以下是在 Linux 系统上安装 Tomcat 的步骤&#xff1a; 下载 Tomcat 安装包。您可以从 Tomcat 官方网站&#xff08;https://tomcat.apache.org/ ↗&…

Bagging方法6大面试热点问题

Q1&#xff1a;为什么Bagging算法的效果比单个评估器更好&#xff1f; 该问题其实是在考察Bagging方法降低模型泛化误差的基本原理。 泛化误差是模型在未知数据集上的误差&#xff0c;更低的泛化误差是所有机器学习/深度学习建模的根本目标。在机器学习当中&#xff0c;泛化误差…