Appium+python自動化(20) - Monkey(サル)ログ(超詳しく解説)

序章

   ログは非常に重要です。ログは、システムおよびソフトウェアの動作イベントを記録するために使用されます。記録ファイルまたはファイル コレクションは、イベント ログとメッセージ ログに分類できます。これは、履歴データの処理、問題追跡の診断、システムとソフトウェアのアクティビティの理解において重要な役割を果たします。ソフト システムの開発またはテストのプロセスで問題が発生した場合、私たちが最初に思いつくのはロギングです。彼女は、タゴールが言った「空には翼の痕跡が残っていませんが、私はすでに飛んでいます」とは異なり、少女モンキー、彼女は見せびらかし、見せびらかすのが大好きな人です。マップに従っている限り、問題を特定し、問題を分析して解決することができます。さて、楽しんでいきましょう、今日の話題に入りましょう。

1. Monkey ログ管理に注目する理由

  Monkey のログ管理は Monkey テストにおいて非常に重要な部分であり、ログ管理の分析を通じて、現在のテスト対象がテストプロセス中に異常であるかどうか、異常が発生する確率を取得することができ、同時に、開発と位置決めに役立つ、対応するエラー情報。問題を解決します。こうすることで、ちょっとした作業で終わるだけでなく、自分自身の向上にもつながります。

2.モンキーログ分析:

モンキーテスト中に問題が発生した場合、この時点で位置の問題を分析する必要があり、モンキーログを分析する必要があります

Monkey テストで異常が発生する理由: 
一般に、これは 2 つの理由によって引き起こされます。1 つはクラッシュ プログラムがクラッシュすることです。クラッシュの理由は次のとおりです: 
a) プログラム内に null ポインターがある 
b) CPU 
とメモリが不足しています

もう 1 つは、ANR プログラムが応答しないことです。ANR プログラムが応答しない理由は次のとおりです。 
a) スレッドのブロック 
b) 不十分な CPU 
c) 不十分なメモリ

理由を明らかにする:

1. モンキー テストが異常終了した場合は、logcat ログを開いてキーワード 'anrin' を検索してください。このキーワードが存在する場合、アプリに ANR 例外があることを意味します。/ にある Trace.txt ファイルを削除する必要があります。 data/anr ディレクトリ。 
2.trace.txt ファイルを削除した後、問題のあるプロセス番号に対応するログをソフトウェア エンジニアに送信し、場所を尋ねます。logcat ログにキーワード「anrin」が見つからない場合は、異常のあるプロセスの上位と下位のログを検索します。キーワード「nullpointer」を入力し、開発場所に送信します。 
3. ANR が表示されたら、エクスポートする必要があります。手順は次のとおりです。 
1. adb shell と入力します 
。 2. cd /data/anr/ と入力します。 
3. ls と入力します。


exit を終了した後、直接「4. adb pull /data/anr/traces.txt d:\trace.txt  in cmd」と入力
します。 5. anr 問題のプロセス番号を logcat にコピーし、trace.txt ファイル内で Ctrl+ キーを押します。プロセス番号を見つけて貼り付け、対応する問題を見つけます

2.1モンキー結果の分類

Monkey は次の順序でログ出力を実行します。

 以下は私が投稿した詳細なログ分析です: (ログと混同しないように、コメント記号を絵文字に置き換えています)

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性能测试

九、总结(尾部小惊喜)

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

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

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

 

おすすめ

転載: blog.csdn.net/NHB456789/article/details/131895073