actir 1.2.1 → 1.2.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/lib/actir/parallel_tests/cli.rb +2 -2
- data/lib/actir/parallel_tests/report/html_formatter.rb +1 -1
- data/lib/actir/parallel_tests/test/rerunner.rb +64 -46
- data/lib/actir/parallel_tests/test/result.rb +67 -11
- data/lib/actir/script/cookies_baidu.rb +1 -1
- data/lib/actir/version.rb +1 -1
- data/lib/actir/webdriver/browser.rb +18 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 111066ba4bcff7cf8ef706a6e62cd33a1c42583d
|
4
|
+
data.tar.gz: 2995ee75054abb76fe64a8a61dd48ffb551675dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b1ce4c3f177719da45f3617c6c8fe8793ccac438f4b3c780c3e92a011897a4cd32a2f150eca3b25dae1352a15e3f31fa394c25109048c5fba45c56cbe4cabfe
|
7
|
+
data.tar.gz: c71e3d4df39cb5b28867ef4b84951dcbe3cf69be431660a83bbe0daca32a13ca4d89bfc6ca8500adaeef502210570d0e351be4bbec3659ea06ff1ed41093b73b
|
@@ -284,11 +284,11 @@ module Actir
|
|
284
284
|
runs = (0...num_processes).to_a
|
285
285
|
results = if options[:non_parallel]
|
286
286
|
runs.map do |i|
|
287
|
-
|
287
|
+
@runner.execute_command(command, i, num_processes, options)
|
288
288
|
end
|
289
289
|
else
|
290
290
|
execute_in_parallel(runs, num_processes, options) do |i|
|
291
|
-
|
291
|
+
@runner.execute_command(command, i, num_processes, options)
|
292
292
|
end
|
293
293
|
end.flatten
|
294
294
|
|
@@ -34,7 +34,7 @@ module Actir
|
|
34
34
|
|
35
35
|
def print_testcase_failed(testcase_name, backtrace, failure_number)
|
36
36
|
@file.puts " <dd class=\"testcase failed\">"
|
37
|
-
@file.puts " <span class=\"failed_spec_name\">[
|
37
|
+
@file.puts " <span class=\"failed_spec_name\">[Testcase]: #{h(testcase_name)}</span>"
|
38
38
|
@file.puts " <div id=\"testtab_#{failure_number}\" style=\"float:right\"><a class=\"expand\" href=\"#\" onClick=\"Effect('failure_#{failure_number}',this.parentNode.id);\" >+</a> </div>"
|
39
39
|
@file.puts " <div class=\"failure\" id=\"failure_#{failure_number}\" style=\"display:none;\">"
|
40
40
|
@file.puts " <div class=\"backtrace\"><pre>#{h(backtrace)}</pre></div>"
|
@@ -27,25 +27,26 @@ module Actir
|
|
27
27
|
# @return [String] 执行结果字符串
|
28
28
|
#
|
29
29
|
def re_run_tests(test_result, process_number, num_processes, options, address, times)
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
30
|
+
@result = load_result
|
31
|
+
#根据重跑次数重新执行失败用例
|
32
|
+
result = re_run(test_result, process_number, num_processes, options, address, times)
|
33
|
+
#从老的执行结果输出中提取出相关数据
|
34
|
+
old_result = summarize_results(find_results(test_result[:stdout]))
|
35
|
+
#puts "old_result : " + old_result
|
36
|
+
#从新的执行结果中提取出数据,并算出总数
|
37
|
+
#因为若有多个失败用例就有多个执行结果
|
38
|
+
new_result = summarize_results(find_results(result[:stdout]))
|
39
|
+
#puts "new_result : " + new_result
|
40
|
+
#刷新最终的执行结果
|
41
|
+
if old_result == nil || old_result == ""
|
42
|
+
puts "[Debug] test_result : "
|
43
|
+
puts test_result
|
44
|
+
end
|
45
|
+
if new_result == nil || new_result == ""
|
46
|
+
puts "[Debug] result : "
|
47
|
+
puts result
|
48
|
+
end
|
49
|
+
combine_tests_results(old_result, new_result)
|
49
50
|
end
|
50
51
|
|
51
52
|
private
|
@@ -56,7 +57,10 @@ module Actir
|
|
56
57
|
#先获取失败用例信息
|
57
58
|
tests = capture_failures_tests(test_result)
|
58
59
|
cmd = ""
|
59
|
-
tests.each do |
|
60
|
+
tests.each do |unique_testname|
|
61
|
+
# 从combine的测试用例名称中获取测试文件名称和测试用例名称
|
62
|
+
testfile = @result.get_testfile_from_unique(unique_testname)
|
63
|
+
testcase = @result.get_testcase_from_unique(unique_testname)
|
60
64
|
#输出一些打印信息
|
61
65
|
puts "[ Re_Run ] - [ #{testfile} -n #{testcase} ] - Left #{times-1} times - in Process[#{process_number}]"
|
62
66
|
cmd += "#{executable} #{testfile} #{address} -n #{testcase};"
|
@@ -77,35 +81,42 @@ module Actir
|
|
77
81
|
end
|
78
82
|
|
79
83
|
#从result中获取执行结果用于生成测试报告
|
80
|
-
|
84
|
+
@result.get_testsuite_detail(result, :rerunner)
|
81
85
|
|
82
86
|
return result
|
83
87
|
end
|
84
88
|
|
85
89
|
#从输出内容中获取失败用例文件名以及用例名称
|
86
90
|
def capture_failures_tests(test_result)
|
87
|
-
|
88
|
-
failure_tests_hash =
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
end
|
108
|
-
|
91
|
+
failure_tests = []
|
92
|
+
failure_tests_hash = @result.get_testfailed_info(test_result)
|
93
|
+
# 过滤报错信息,只需要用例名称和文件名称
|
94
|
+
failure_tests_hash.each do |testcase, failure_info|
|
95
|
+
failure_tests << testcase
|
96
|
+
end
|
97
|
+
failure_tests
|
98
|
+
# result_array = test_result[:stdout].split("\n")
|
99
|
+
# failure_tests_hash = {}
|
100
|
+
# testcase = ""
|
101
|
+
# testfile = ""
|
102
|
+
# result_array.each do |result|
|
103
|
+
# #取出执行失败的用例文件名称和用例名称
|
104
|
+
# if (result =~ failure_tests_name_reg) || (result =~ error_tests_name_reg)
|
105
|
+
# #范例:"testhehe(TestHehe)"
|
106
|
+
# testcase = $1
|
107
|
+
# end
|
108
|
+
# if result =~ failure_tests_file_reg
|
109
|
+
# #范例:"testcode/test_tt/test_hehe.rb:8:in `xxxx'"
|
110
|
+
# testfile = $1
|
111
|
+
# end
|
112
|
+
# #至于为什么采用testcase => testfile的形式是因为…文件名会重复
|
113
|
+
# if testcase != "" && testfile != ""
|
114
|
+
# failure_tests_hash[testcase] = testfile
|
115
|
+
# testcase = ""
|
116
|
+
# testfile = ""
|
117
|
+
# end
|
118
|
+
# end
|
119
|
+
# failure_tests_hash
|
109
120
|
end
|
110
121
|
|
111
122
|
#组合出最新的执行结果
|
@@ -130,17 +141,17 @@ module Actir
|
|
130
141
|
|
131
142
|
#判断是否有用例失败
|
132
143
|
def any_test_failed?(result)
|
133
|
-
|
144
|
+
@result.any_test_failed?(result)
|
134
145
|
end
|
135
146
|
|
136
147
|
#获取错误用例名的正则
|
137
148
|
def error_tests_name_reg
|
138
|
-
|
149
|
+
@result.error_tests_name_reg
|
139
150
|
end
|
140
151
|
|
141
152
|
#获取失败用例名的正则
|
142
153
|
def failure_tests_name_reg
|
143
|
-
|
154
|
+
@result.failure_tests_name_reg
|
144
155
|
end
|
145
156
|
|
146
157
|
#获取失败用例文件名的正则
|
@@ -154,6 +165,13 @@ module Actir
|
|
154
165
|
/((\d+)\sfailure.*,\s(\d+)\serror)/
|
155
166
|
end
|
156
167
|
|
168
|
+
# 加载result类
|
169
|
+
def load_result
|
170
|
+
require "actir/parallel_tests/test/result"
|
171
|
+
klass_name = "Actir::ParallelTests::Test::Result"
|
172
|
+
klass_name.split('::').inject(Object) { |x, y| x.const_get(y) }
|
173
|
+
end
|
174
|
+
|
157
175
|
end
|
158
176
|
|
159
177
|
end
|
@@ -15,10 +15,9 @@ module Actir
|
|
15
15
|
if mode == :runner
|
16
16
|
get_run_test_info(test_result)
|
17
17
|
end
|
18
|
-
|
19
18
|
#如果有用例失败,则记录详细信息,否则不需要
|
20
19
|
if any_test_failed?(test_result)
|
21
|
-
failure_detail_hash =
|
20
|
+
failure_detail_hash = get_testfailed_info(test_result)
|
22
21
|
$testsuites.each do |testsuite|
|
23
22
|
testcases = testsuite[:testcases]
|
24
23
|
testcases.each do |testcase|
|
@@ -44,21 +43,25 @@ module Actir
|
|
44
43
|
|
45
44
|
def get_run_test_info(test_result)
|
46
45
|
output = test_result[:stdout]
|
47
|
-
output.scan(/^(\[suite start\])([^\.]*)(\[suite end\])$/).each do |suite|
|
48
|
-
|
46
|
+
# output.scan(/^(\[suite start\])([^\.]*)(\[suite end\])$/).each do |suite|
|
47
|
+
output.scan(file_suite_case_reg).each do |suite|
|
48
|
+
filename = suite[0]
|
49
|
+
testsuite = suite[1].scan(/^(suitname:\s*)([\d\w]*)/)[0][1]
|
50
|
+
testsuite_name = get_unique_testname(filename, testsuite)
|
49
51
|
cases = suite[1].scan(/^(testcase:\s*)([\d\w]*)/).inject([]) do |cases,testcase|
|
50
|
-
|
52
|
+
testcase_name = get_unique_testname(filename, testcase[1])
|
53
|
+
cases << {:testcase_name => testcase_name, :success => true, :detail => nil}
|
51
54
|
end
|
52
55
|
# 如果testsuites中已存在此用例的信息,说明这个用例执行了rerun,就不再次添加了
|
53
56
|
is_case_exist = $testsuites.inject(false) do |is_case_exist, testsuite|
|
54
|
-
if testsuite.has_value?(
|
57
|
+
if testsuite.has_value?(testsuite_name)
|
55
58
|
is_case_exist = true
|
56
59
|
break
|
57
60
|
end
|
58
61
|
is_case_exist
|
59
62
|
end
|
60
63
|
if(is_case_exist == false)
|
61
|
-
testsuite = {:testsuite_name =>
|
64
|
+
testsuite = {:testsuite_name => testsuite_name, :testcases =>cases}
|
62
65
|
$testsuites << testsuite
|
63
66
|
end
|
64
67
|
end
|
@@ -69,11 +72,13 @@ module Actir
|
|
69
72
|
#
|
70
73
|
# 将测试套和测试用例的详细信息写入全局变量$testsuites中
|
71
74
|
#
|
72
|
-
def
|
75
|
+
def get_testfailed_info(test_result)
|
73
76
|
result_array = test_result[:stdout].split("\n")
|
74
77
|
failure_detail_hash = {}
|
78
|
+
testfile = ""
|
75
79
|
testcase = ""
|
76
80
|
detail = ""
|
81
|
+
testcase_name = ""
|
77
82
|
record_detail_switch = 0
|
78
83
|
|
79
84
|
result_array.each do |result|
|
@@ -81,25 +86,41 @@ module Actir
|
|
81
86
|
#遇到错误信息,开启记录错误信息开关
|
82
87
|
record_detail_switch = 1 if result =~failure_or_error_switch_on
|
83
88
|
|
89
|
+
# 记录报错信息
|
84
90
|
if record_detail_switch == 1
|
85
91
|
detail += result + "\n"
|
86
92
|
end
|
87
93
|
|
94
|
+
# 记录报错用例名称
|
88
95
|
if (result =~ failure_tests_name_reg) || (result =~ error_tests_name_reg)
|
89
96
|
testcase = $1
|
90
97
|
end
|
91
98
|
|
92
|
-
|
93
|
-
|
99
|
+
# 记录报错用例文件名称
|
100
|
+
if result =~ failure_tests_file_reg
|
101
|
+
#范例:"testcode/test_tt/test_hehe.rb:8:in `xxxx'"
|
102
|
+
testfile = $1
|
103
|
+
end
|
104
|
+
|
105
|
+
# 合并用例名称和文件名称
|
106
|
+
testcase_name = get_unique_testname(testfile, testcase)
|
107
|
+
|
108
|
+
if testcase_name != "" && detail != "" && record_detail_switch == 0
|
109
|
+
failure_detail_hash[testcase_name] = detail
|
94
110
|
testcase = ""
|
111
|
+
testfile = ""
|
95
112
|
detail = ""
|
113
|
+
testcase_name = ""
|
96
114
|
end
|
97
115
|
end
|
98
116
|
|
99
117
|
failure_detail_hash
|
100
118
|
end
|
101
119
|
|
102
|
-
|
120
|
+
# 从执行结果中获取文件/测试套/测试用例的名称
|
121
|
+
def file_suite_case_reg
|
122
|
+
/^Loaded\ssuite\s(.*)\nStarted\n\[suite start\]([^\.]*)\[suite end\]$/
|
123
|
+
end
|
103
124
|
|
104
125
|
#判断是否有用例失败
|
105
126
|
def any_test_failed?(result)
|
@@ -116,22 +137,57 @@ module Actir
|
|
116
137
|
/^Failure:\s(test.+)\(.+\)/
|
117
138
|
end
|
118
139
|
|
140
|
+
# 获取失败用例文件名的正则
|
141
|
+
def failure_tests_file_reg
|
142
|
+
/(.+\/test.+rb):\d+:in\s`.+'/
|
143
|
+
end
|
144
|
+
|
145
|
+
# 测试套信息开头正则
|
119
146
|
def test_info_swtich_on
|
120
147
|
/^\[suite start\]/
|
121
148
|
end
|
122
149
|
|
150
|
+
# 测试套信息截止正则
|
123
151
|
def test_info_swtich_off
|
124
152
|
/^\[suite end\]/
|
125
153
|
end
|
126
154
|
|
155
|
+
# 测试用例执行报错信息开头正则
|
127
156
|
def failure_or_error_switch_on
|
128
157
|
/^Failure:|^Error:/
|
129
158
|
end
|
130
159
|
|
160
|
+
# 测试用例执行报错信息截止正则
|
131
161
|
def failure_or_error_switch_off
|
132
162
|
/^===============================================================================$/
|
133
163
|
end
|
134
164
|
|
165
|
+
# 因为测试用例名称/测试套名称有可能重复,所以采用 测试文件名称:测试用例名称 的方式作为测试用例名称的唯一标识
|
166
|
+
# 也可用于测试套名称组合
|
167
|
+
def get_unique_testname(testfile, test)
|
168
|
+
if (test != "" || test != nil) && (testfile != "" || testfile != nil)
|
169
|
+
# 判断测试文件名称是否包含.rb后缀,如果没有则加上
|
170
|
+
unless testfile =~ /.*\.rb$/
|
171
|
+
testfile += ".rb"
|
172
|
+
end
|
173
|
+
return testfile + ":" + test
|
174
|
+
else
|
175
|
+
return ""
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def get_testfile_from_unique(unique_testname)
|
180
|
+
testfile_name = ""
|
181
|
+
unique_testname =~ /(.*)\:(.*)/
|
182
|
+
testfile_name = $1
|
183
|
+
end
|
184
|
+
|
185
|
+
def get_testcase_from_unique(unique_testname)
|
186
|
+
p unique_testname
|
187
|
+
testcase_name = ""
|
188
|
+
unique_testname =~ /(.*)\:(.*)/
|
189
|
+
testcase_name = $2
|
190
|
+
end
|
135
191
|
|
136
192
|
end
|
137
193
|
|
@@ -83,7 +83,7 @@ module Actir
|
|
83
83
|
address = Actir::Remote.get_remote_address(1)
|
84
84
|
end
|
85
85
|
end
|
86
|
-
@browser = Browser.new(:www, :url => address[0], :mode => $mode, :browser => :chrome)
|
86
|
+
@browser = Browser.new(:www, :url => address[0], :mode => $mode, :browser => :chrome, :window_size => nil)
|
87
87
|
@browser.goto "baifubao.com"
|
88
88
|
@browser
|
89
89
|
end
|
data/lib/actir/version.rb
CHANGED
@@ -34,6 +34,7 @@ class Browser
|
|
34
34
|
@browser_type = args[:browser]
|
35
35
|
@agent = args[:agent]
|
36
36
|
@env = args[:mode]
|
37
|
+
@window_size = args[:window_size]
|
37
38
|
if @env == :remote
|
38
39
|
@url = if args[:url]
|
39
40
|
"http://#{args[:url]}/wd/hub"
|
@@ -79,13 +80,14 @@ class Browser
|
|
79
80
|
|
80
81
|
# 初始化入参
|
81
82
|
def init_args(args = {})
|
83
|
+
config_exist = File.exist?(config_file)
|
82
84
|
unless args.has_key?(:mode)
|
83
85
|
#若通过actir执行测试用例,则会配置ENV的模式
|
84
86
|
if ENV["mode"]
|
85
87
|
args[:mode] = ENV["mode"].to_sym
|
86
88
|
else
|
87
89
|
#若ENV为空,则读取配置文件,判断有无配置文件
|
88
|
-
if
|
90
|
+
if config_exist
|
89
91
|
env = $config["config"]["test_mode"]["env"]
|
90
92
|
args[:mode] = (env == nil) ? :local : env
|
91
93
|
else
|
@@ -94,13 +96,25 @@ class Browser
|
|
94
96
|
end
|
95
97
|
end
|
96
98
|
unless args.has_key?(:browser)
|
97
|
-
if
|
99
|
+
if config_exist
|
98
100
|
browser_type = $config["config"]["test_mode"]["browser"]
|
99
101
|
args[:browser] = (browser_type == nil) ? :chrome : browser_type
|
100
102
|
else
|
101
103
|
args[:browser] = :chrome
|
102
104
|
end
|
103
105
|
end
|
106
|
+
unless args.has_key?(:window_size)
|
107
|
+
if config_exist
|
108
|
+
window_size = $config["config"]["window_size"]
|
109
|
+
if window_size != nil
|
110
|
+
width = window_size["width"]
|
111
|
+
height = window_size["height"]
|
112
|
+
end
|
113
|
+
args[:window_size] = (width == nil || height == nil) ? nil : window_size
|
114
|
+
else
|
115
|
+
args[:window_size] = nil
|
116
|
+
end
|
117
|
+
end
|
104
118
|
args[:agent] = :iphone unless args.has_key?(:agent)
|
105
119
|
args[:url] = $address unless args.has_key?(:url)
|
106
120
|
args
|
@@ -128,6 +142,8 @@ class Browser
|
|
128
142
|
browser.window.resize_to(PHANTOMJS_SIZE["width"], PHANTOMJS_SIZE["height"])
|
129
143
|
elsif @env == :remote
|
130
144
|
browser.window.resize_to(REMOTE_SIZE["width"], REMOTE_SIZE["height"])
|
145
|
+
elsif @window_size != nil
|
146
|
+
browser.window.resize_to(@window_size["width"], @window_size["height"])
|
131
147
|
end
|
132
148
|
browser
|
133
149
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: actir
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hub
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-unit
|