Snake's Home

python尝试monkey收集crash

曾今花了点时间研究的 monkey 测试,感觉Monkey太不可控了,不停的点击,crash一个接着一个。看Log也看得眼花,好不容易找到一个FATAL ERROR, 开发却说没什么用。

Monkey 命令看似简单,就那么一行,可是参数组合起来,就强大了。

Monkey经常点了系统的控件。恒温告诉我有黑白名单。后面试用了一下,果然不会点到系统中去了。

可以直接用:

1
2
3
adb shell getprop "ro.product.model"
adb shell getprop "ro.build.version.releasel"
adb shell getprop "ro.product.brand"

来获
/system/build.prop 里面的信息。(何老师教的。)

翠花,上脚本:

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
#encoding:utf-8  
import os
import time
import re

packageName="com.XXX.app"
logdir=r"d:\jenkins"
remote_path=r"\\10.21.101.100\XXXX\build\android"

#os.popen('adb shell cat /system/build.prop >D:\jenkins\phone.text')
os.system('adb shell cat /system/build.prop >D:\jenkins\phone.text')

f = r"D:\jenkins\phone.text"


def getcmd(cmd):
f = open(cmd,"r")
lines = f.readlines()
for line in lines:

line=line.split('=')
if (line[0]=='ro.build.version.release'):
version = line[1]
if (line[0]=='ro.product.model'):
model = line[1]
if (line[0]=='ro.product.brand'):
brand = line[1]
return version,model,brand


version,model,brand=getcmd(f)

print version,model,brand
os.remove(f)

#print "使用Logcat清空Phone中log"
os.popen("adb logcat -c")

#print"暂停2秒..."
print "wait"
time.sleep(2)
#os.popen("adb shell monkey -p com.XXX.app -s 500 -v -v 1000")

#print"强制关闭准备测试的APP"
print "a"
#commd="adb shell am force-stop %s" %(packageName)
#os.popen(commd)
now1 = time.strftime('%m-%d-%H_%M_%S', time.localtime(time.time()))
#newfname="%sCircle-debug.apk"%(now1)
#newfpath="%s/%s"%(output_path,newfname)
#oldfpath="%s/%s"%(output_path,oldname)
#os.rename(oldfpath, newfpath)
#print"开始执行Monkey命令"

monkeylogname=logdir+"\\"+now1+"monkey.log"
print monkeylogname
cmd="adb shell monkey -p com.XXX.app -s 500 --ignore-timeouts --monitor-native-crashes -v -v 10000 >>%s" %(monkeylogname)
os.popen(cmd)

#print"手机截屏"

os.popen("adb shell screencap -p /sdcard/monkey_run.png")

#print"拷贝截屏图片至电脑"

cmd1="adb pull /sdcard/monkey_run.png %s" %(logdir)
os.popen(cmd1)

print "gai ming"
oldname=logdir+"\\"+r"monkey_run.png"
if (os.path.exists(oldname)):
print "file is exist"
else:
print "file isn't exist"
print oldname
newname=logdir+"\\"+now1+r"monkey.png"
print newname
os.rename(oldname, newname)

#print"使用Logcat导出日志"

logcatname=logdir+"\\"+now1+r"logcat.log"
cmd2="adb logcat -d >%s" %(logcatname)
os.popen(cmd2)

#print"导出traces文件"

tracesname=logdir+"\\"+now1+r"traces.log"
cmd3="adb shell cat /data/anr/traces.txt>%s" %(tracesname)
os.popen(cmd3)

######################
#获取error
######################

NullPointer="java.lang.NullPointerException"
IllegalState="java.lang.IllegalStateException"
IllegalArgument="java.lang.IllegalArgumentException"
ArrayIndexOutOfBounds="java.lang.ArrayIndexOutOfBoundsException"
RuntimeException="java.lang.RuntimeException"
SecurityException="java.lang.SecurityException"

def geterror():
f = open(logcatname,"r")
lines = f.readlines()
errfile="%s\error.log" %(remote_path)
fr = open(errfile,"a")
fr.write(now1)
fr.write("\n")
fr.write(version)
fr.write("\n")
fr.write(model)
fr.write("\n")
fr.write(brand)
fr.write("\n")

count=0
for line in lines:
if ( re.findall(NullPointer,line) or re.findall(IllegalState,line) or re.findall(IllegalArgument,line) or re.findall(ArrayIndexOutOfBounds,line) or re.findall(RuntimeException,line) or re.findall(SecurityException,line) ):
a=lines.index(line)
count +=1
for var in range(a,a+22):
print lines[var]
fr.write(lines[var])
fr.write("\n")
f.close()
fr.close()
return count


number=geterror()
print number

脚本是写出来了,也能发现一些有用的crash。
但是,开发不Fix。。。

要是哪天能做一个监控系统就好了。
结合线上线下,就不会有这么多Crash了。

本文发表在: testerhome