smart_monkey 0.1.2 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +25 -21
- data/VERSION +1 -1
- data/bin/smart_monkey +3 -3
- data/lib/smart_monkey/monkey_runner.rb +47 -20
- data/lib/smart_monkey/templates/index.html.erb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 654c78960662ad050551e259c70eb156943f1a5b
|
4
|
+
data.tar.gz: e9d4cd8bf1d0352594231fd885cb869877ad534d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1cf9150d136402f4381625ad51370f46dc0b8d958b5a2f9bfbf025f370e22805a9a53eb0a7de9d61b3490470e30e6df01a6be37870ac2f52d087e014a7e6362
|
7
|
+
data.tar.gz: 566dc5f0252c36409c7dbcc88278f59b3501e74232c75daafae59e6d571902303309ffcd75a28ed9c53519971f75afd8a9ab959ccbc44478ea9e398d71680152
|
data/README.md
CHANGED
@@ -1,18 +1,15 @@
|
|
1
1
|
# CrashMonkey4IOS
|
2
2
|
iOS Monkey Test Tool.
|
3
3
|
|
4
|
-
|
5
|
-
1.
|
6
|
-
2.
|
7
|
-
3.
|
8
|
-
4.
|
9
|
-
5.
|
10
|
-
6.
|
11
|
-
7.
|
12
|
-
8.
|
13
|
-
9. 修改**UIAutoMonkey.js**中截图策略,为每个Event Action进行截图
|
14
|
-
10. 修改**CrashMonkey**中测试报告显示截图策略,增加至最近的50张
|
15
|
-
11. 解决大家一直所诟病的iOS App执行Monkey测试过程当中跳出程序后,导致脚本block,App无法自动返回的问题,解决方案:利用一个线程去监听instruments执行过程当中的日志,每隔20s进行前后比对,如果日志没有更新则说明App hanged,利用**idevicedebug**恢复App至前台。
|
4
|
+
###简要说明:
|
5
|
+
1. 支持**真机测试、模拟器测试**
|
6
|
+
2. 支持收集**系统日志(Systemlog)**、**崩溃日志(Crashlog)**、***instrument行为日志***
|
7
|
+
3. 支持测试报告截图,绘制行为轨迹
|
8
|
+
4. 支持测试设备信息收集
|
9
|
+
5. 使用最新版的[UIAutoMonkey][uiatmonkey],加入`UI Holes`与`Application Not Repsonding ("ANR")`的处理,添加[custom.js][custom]作为入口脚本.
|
10
|
+
6. 加入[tuneup][tp]依赖
|
11
|
+
7. 修改**UIAutoMonkey.js**中截图策略,为每个Event Action进行截图
|
12
|
+
8. 支持测试执行过程中App进入后台,自动恢复(测试不会block)
|
16
13
|
[lidvc]:https://github.com/libimobiledevice/libimobiledevice
|
17
14
|
[dc]:https://github.com/rpetrich/deviceconsole
|
18
15
|
[uiatmonkey]: https://github.com/jonathanpenn/ui-auto-monkey/blob/master/UIAutoMonkey.js
|
@@ -20,24 +17,32 @@ iOS Monkey Test Tool.
|
|
20
17
|
[tp]:https://github.com/vigossjjj/CrashMonkey4IOS/tree/master/lib/ui-auto-monkey/tuneup
|
21
18
|
[troubleshooting]:https://github.com/vigossjjj/CrashMonkey4IOS/tree/master/Troubleshooting.md
|
22
19
|
|
23
|
-
|
20
|
+
###环境及依赖安装:
|
21
|
+
###### 系统要求
|
24
22
|
1. 安装Ruby运行环境,建议不要使用OS X自带版本,可自行使用RVM安装最新版的Ruby。建议使用淘宝镜像安装,速度比较快,`$ sed -i -e 's/ftp\.ruby-lang\.org\/pub\/ruby/ruby\.taobao\.org\/mirrors\/ruby/g' ~/.rvm/config/db`
|
25
23
|
2. 确保gem可用,也建议使用淘宝镜像 `gem sources --remove https://rubygems.org/;gem sources -a http://ruby.taobao.org/;gem sources -l`
|
26
24
|
3. 安装**Homebrew** `ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
|
25
|
+
4. 建议Xcode 6.x +
|
26
|
+
|
27
|
+
###### 依赖安装
|
28
|
+
1. `brew install -HEAD ideviceinstaller`
|
29
|
+
2. `brew install libimobiledevice`
|
30
|
+
3. `brew install imagemagick`
|
31
|
+
4. `gem install smart_monkey`
|
27
32
|
|
28
33
|
###使用说明:
|
29
|
-
1.
|
30
|
-
2.
|
31
|
-
3. 执行命令`/CrashMonkey4IOS/bin/smart_monkey -a ${App_BunnelID} -w ${iPhone_UDID} -n 1`
|
34
|
+
1. 执行前需要先配置[custom.js][custom]相关参数
|
35
|
+
2. 执行命令`smart_monkey -a ${App_BunnelID} -w ${iPhone_UDID}`
|
32
36
|
|
33
37
|
###参数说明:
|
34
38
|
```
|
39
|
+
$ smart_monkey -h
|
35
40
|
Usage: smart_monkey [options]
|
36
|
-
-a app_name
|
41
|
+
-a app_name Bundle ID of the desired target on device(Required)
|
37
42
|
-w device Target Device UDID(Required)
|
38
43
|
-n run_count How many times monkeys run(default: 1)
|
39
44
|
-d result_dir Where to output result(default: ./smart_monkey_result)
|
40
|
-
-t time_limit_sec Time limit of running
|
45
|
+
-t time_limit_sec Time limit of running
|
41
46
|
-s dsym_file Use .dSYM file to symbolicating crash logs
|
42
47
|
-c custom_path Configuration custom.js Path
|
43
48
|
-e extend_javascript_path Extend Uiautomation Javascript for such Login scripts
|
@@ -50,12 +55,11 @@ Usage: smart_monkey [options]
|
|
50
55
|
--list-app Show List of Installed Apps in iPhone/iPhone Simulator
|
51
56
|
--list-devices Show List of Devices
|
52
57
|
--reset-iPhone-Simulator Reset iPhone Simulator
|
53
|
-
--version print
|
58
|
+
--version print smart monkey version
|
54
59
|
```
|
55
60
|
|
56
61
|
###TODO List:
|
57
|
-
|
58
|
-
2. 修改配置脚本及文档。
|
62
|
+
2. 配置文件参数优化
|
59
63
|
|
60
64
|
###Troubleshooting:
|
61
65
|
安装和执行测试遇到的问题解决方案请参看:[Troubleshooting.md][troubleshooting]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2
|
data/bin/smart_monkey
CHANGED
@@ -11,11 +11,11 @@ require 'smart_monkey'
|
|
11
11
|
|
12
12
|
opts = {}
|
13
13
|
ARGV.options do |o|
|
14
|
-
o.on('-a app_name', '
|
14
|
+
o.on('-a app_name', 'Bundle ID of the desired target on device(Required)') {|b| opts[:app_path] = b}
|
15
15
|
o.on('-w device', 'Target Device UDID(Required)') {|b| opts[:device] = b}
|
16
16
|
o.on('-n run_count', 'How many times monkeys run(default: 1)') {|b| opts[:run_count] = b.to_i}
|
17
17
|
o.on('-d result_dir', 'Where to output result(default: ./smart_monkey_result)') {|b| opts[:result_base_dir] = File.expand_path(b)}
|
18
|
-
o.on('-t time_limit_sec', 'Time limit of running
|
18
|
+
o.on('-t time_limit_sec', 'Time limit of running') {|b| opts[:time_limit_sec] = b.to_i}
|
19
19
|
o.on('-s dsym_file', 'Use .dSYM file to symbolicating crash logs') {|b| opts[:dsym_file_path] = File.expand_path(b)}
|
20
20
|
o.on('-c custom_path', 'Configuration custom.js Path') {|b| opts[:custom_path] = File.expand_path(b)}
|
21
21
|
o.on('-e extend_javascript_path', 'Extend Uiautomation Javascript for such Login scripts') {|b| opts[:extend_javascript_path] = File.expand_path(b)}
|
@@ -26,7 +26,7 @@ ARGV.options do |o|
|
|
26
26
|
o.on('--list-app', 'Show List of Installed Apps in iPhone/iPhone Simulator') {|_| opts[:list_app] = true}
|
27
27
|
o.on('--list-devices', 'Show List of Devices') {|_| opts[:list_devices] = true}
|
28
28
|
o.on('--reset-iPhone-Simulator', 'Reset iPhone Simulator'){|_| opts[:reset_iphone_simulator] = true}
|
29
|
-
o.on('--version', 'print
|
29
|
+
o.on('--version', 'print smart monkey version'){|_| opts[:version] = true}
|
30
30
|
o.parse!
|
31
31
|
end
|
32
32
|
|
@@ -17,11 +17,6 @@ module UIAutoMonkey
|
|
17
17
|
|
18
18
|
def run(opts)
|
19
19
|
@options = opts
|
20
|
-
res_dir = @options[:result_base_dir] || RESULT_BASE_PATH
|
21
|
-
|
22
|
-
puts "INSTRUMENTS_TRACE_PATH : #{INSTRUMENTS_TRACE_PATH}"
|
23
|
-
puts "RESULT_BASE_PATH : #{res_dir}"
|
24
|
-
|
25
20
|
if @options[:show_config]
|
26
21
|
show_config
|
27
22
|
return true
|
@@ -35,6 +30,11 @@ module UIAutoMonkey
|
|
35
30
|
reset_iphone_simulator
|
36
31
|
return true
|
37
32
|
end
|
33
|
+
|
34
|
+
res_dir = @options[:result_base_dir] || RESULT_BASE_PATH
|
35
|
+
puts "INSTRUMENTS_TRACE_PATH : #{INSTRUMENTS_TRACE_PATH}"
|
36
|
+
puts "RESULT_BASE_PATH : #{res_dir}"
|
37
|
+
|
38
38
|
###########
|
39
39
|
log @options.inspect
|
40
40
|
FileUtils.remove_dir(result_base_dir, true)
|
@@ -76,7 +76,7 @@ module UIAutoMonkey
|
|
76
76
|
def run_a_case
|
77
77
|
log "=================================== Start Test (#{@times+1}/#{total_test_count}) ======================================="
|
78
78
|
FileUtils.makedirs(crash_save_dir(@times+1)) unless File.exists?(crash_save_dir(@times+1))
|
79
|
-
|
79
|
+
pull_crash_files(@times+1)
|
80
80
|
cr_list = crash_report_list(@times+1)
|
81
81
|
start_time = Time.now
|
82
82
|
watch_syslog do
|
@@ -91,7 +91,7 @@ module UIAutoMonkey
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
|
94
|
+
pull_crash_files(@times+1)
|
95
95
|
new_cr_list = crash_report_list(@times+1)
|
96
96
|
# increase crash report?
|
97
97
|
diff_cr_list = new_cr_list - cr_list
|
@@ -212,6 +212,19 @@ module UIAutoMonkey
|
|
212
212
|
`"instruments" -s devices`.strip.split(/\n/).drop(2)
|
213
213
|
end
|
214
214
|
|
215
|
+
def instruments_deviceinfo(device)
|
216
|
+
`"instruments" -s devices | grep #{device}`.strip
|
217
|
+
end
|
218
|
+
|
219
|
+
def is_simulator
|
220
|
+
deviceinfo = instruments_deviceinfo(device)
|
221
|
+
if deviceinfo.include? "Simulator"
|
222
|
+
true
|
223
|
+
else
|
224
|
+
false
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
215
228
|
def product_type(device)
|
216
229
|
product_hash={
|
217
230
|
"iPhone7,2"=>"iPhone 6",
|
@@ -229,16 +242,25 @@ module UIAutoMonkey
|
|
229
242
|
"iPhone1,2"=>"iPhone 3G",
|
230
243
|
"iPhone1,1"=>"iPhone",
|
231
244
|
}
|
232
|
-
|
233
|
-
|
245
|
+
|
246
|
+
if is_simulator
|
247
|
+
instruments_deviceinfo(device).split("[")[0]
|
248
|
+
else
|
249
|
+
type = `ideviceinfo -u #{device} -k ProductType`.strip
|
250
|
+
product_hash[type]
|
251
|
+
end
|
234
252
|
end
|
235
253
|
|
236
254
|
def product_version(device)
|
237
|
-
|
255
|
+
if !is_simulator
|
256
|
+
`ideviceinfo -u #{device} -k ProductVersion`.strip
|
257
|
+
end
|
238
258
|
end
|
239
259
|
|
240
260
|
def device_name(device)
|
241
|
-
|
261
|
+
if !is_simulator
|
262
|
+
`ideviceinfo -u #{device} -k DeviceName`.strip
|
263
|
+
end
|
242
264
|
end
|
243
265
|
|
244
266
|
def compress_image(path)
|
@@ -345,12 +367,16 @@ module UIAutoMonkey
|
|
345
367
|
"#{result_base_dir}/result_#{sprintf('%03d', times)}"
|
346
368
|
end
|
347
369
|
|
348
|
-
def
|
370
|
+
def sim_crash_report_dir
|
349
371
|
"#{ENV['HOME']}/Library/Logs/DiagnosticReports"
|
350
372
|
end
|
351
373
|
|
352
|
-
def
|
353
|
-
|
374
|
+
def pull_crash_files(times)
|
375
|
+
if !is_simulator
|
376
|
+
`idevicecrashreport -u #{device} -e -k #{crash_save_dir(times)}`
|
377
|
+
else
|
378
|
+
`cp #{sim_crash_report_dir}/* #{crash_save_dir(times)}`
|
379
|
+
end
|
354
380
|
end
|
355
381
|
|
356
382
|
def crash_report_list(times)
|
@@ -363,12 +389,14 @@ module UIAutoMonkey
|
|
363
389
|
`rm -rf #{traces}`
|
364
390
|
end
|
365
391
|
|
366
|
-
def grep_syslog
|
367
|
-
'tail -n 0 -f /var/log/system.log'
|
368
|
-
end
|
369
|
-
|
370
392
|
def grep_ios_syslog
|
371
|
-
|
393
|
+
if is_simulator
|
394
|
+
puts "Attempting iOS Simulator system log capture via tail system.log."
|
395
|
+
"tail -n 0 -f ~/Library/Logs/CoreSimulator/#{device}*/system.log"
|
396
|
+
else
|
397
|
+
puts "Attempting iOS device system log capture via deviceconsole."
|
398
|
+
"#{deviceconsole_original_path} -u #{device}"
|
399
|
+
end
|
372
400
|
end
|
373
401
|
|
374
402
|
def console_log_path
|
@@ -460,7 +488,6 @@ module UIAutoMonkey
|
|
460
488
|
|
461
489
|
def watch_syslog
|
462
490
|
STDOUT.sync = true
|
463
|
-
puts "Attempting iOS device system log capture via deviceconsole."
|
464
491
|
stdin, stdout, stderr = Open3.popen3(grep_ios_syslog)
|
465
492
|
log_filename = "#{result_base_dir}/console.txt"
|
466
493
|
thread = Thread.new do
|
@@ -12,7 +12,7 @@
|
|
12
12
|
<h1>Summary</h1>
|
13
13
|
<div>
|
14
14
|
<ul>
|
15
|
-
<li>Hardware: <%= ProductType
|
15
|
+
<li>Hardware: <%= ProductType %> <%= ProductVersion %> <%= UniqueDeviceID %></li>
|
16
16
|
<li>Application: <%= Application %> </li>
|
17
17
|
<li>Span: <%= start_time %> ~ <%= end_time %></li>
|
18
18
|
<li>Results: <%= test_count %> Test, <%= ok_count %> Ok, <%= cr_count %> Crash, <%= nr_count %> No Run</li>
|