smart_monkey 0.1.2 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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>
|