actir 1.4.2 → 1.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +69 -42
- data/lib/actir/config.rb +34 -5
- data/lib/actir/data.rb +14 -22
- data/lib/actir/parallel_tests/cli.rb +2 -2
- data/lib/actir/parallel_tests/parallel_tests.rb +4 -5
- data/lib/actir/parallel_tests/test/result.rb +30 -17
- data/lib/actir/parallel_tests/test/runner.rb +1 -0
- data/lib/actir/version.rb +1 -1
- data/lib/actir/webdriver/browser.rb +10 -10
- 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: 5fd03ea345d89f235da0da7018897b291bac51e4
|
4
|
+
data.tar.gz: 36008a746454c6ac769fa39686b8040133e8c913
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cafec979c937f0ae7ce4fe1e89bf507ae930935888745f18c1a6901cbe9ec24dc9451b75ee5284958600dc0901b2a4c0831edec0ccf044002fd69083bf2ff399
|
7
|
+
data.tar.gz: 9af0c87b695b771a93568e3368d23b802af1f71c681676287fddc2432d88f3b8eda500d9b690b3705194f260ec77df61e05f6a6fe13d675be080688047884d4e
|
data/README.md
CHANGED
@@ -2,49 +2,76 @@
|
|
2
2
|
|
3
3
|
Application Concurrence Test in Ruby.
|
4
4
|
|
5
|
-
##
|
5
|
+
## 安装
|
6
6
|
|
7
|
-
|
7
|
+
通过Rake本地安装gem包:
|
8
8
|
|
9
9
|
$ rake install
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
$ gem install actir
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
&emsp
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
&emsp
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
11
|
+
或者通过rubygems远程安装
|
12
|
+
|
13
|
+
$ sudo gem install actir
|
14
|
+
|
15
|
+
如果是Mac OS X 10.11版本以上的系统,要么关闭rootless机制,或者:
|
16
|
+
|
17
|
+
$ sudo gem install actir -n /usr/local/bin
|
18
|
+
|
19
|
+
|
20
|
+
## 使用须知
|
21
|
+
|
22
|
+
####测试工程结构
|
23
|
+
- **config**:配置文件
|
24
|
+
  |--- config.yaml:总体配置文件,test_mode相关的配置项必须要填
|
25
|
+
- **elements**:页面元素
|
26
|
+
  |--- components:公用页面元素方法, 包装成`Module`
|
27
|
+
  |--- pages:页面元素封装的方法,可以继承自`Actir::BasicPage`,已经封装了部分公用方法
|
28
|
+
  |--- items:根据业务抽象出的类
|
29
|
+
  |--- user:根据系统业务抽象出的角色及其Action
|
30
|
+
- **testcode**: 测试用例, 文件和用例方法都要以`test`开头, 执行之前需要初始化 Actir::Initializer.new(project_path),`project_path`为测试工程根目录
|
31
|
+
|
32
|
+
####浏览器对象
|
33
|
+
``` ruby
|
34
|
+
Browser.new(type, *args)
|
35
|
+
```
|
36
|
+
Browser重新封装了Watir以及Selenium的初始化浏览器的方法
|
37
|
+
- **type**:指定初始化浏览器的类型,可以指定www/wap两类
|
38
|
+
- ***args**:
|
39
|
+
- `:browser`:浏览器类型,可以支持 :chrome/:phantomjs/:firefox, 默认为chrome
|
40
|
+
- `:agent`:user agent类型,可以支持 :iphone/:andriod_phone, 默认为iphone
|
41
|
+
- `:mode`:启动模式,支持 :local/:remote, 默认为local
|
42
|
+
- `:url`: 配合mode为remote的模式,指定远程机器的url,需要 IP+端口号
|
43
|
+
|
44
|
+
####Initializer自动加载工程文件
|
45
|
+
``` ruby
|
46
|
+
Actir::Initializer.new(project_path)
|
47
|
+
```
|
48
|
+
- 自动require所有的elements内的文件并自动定义每个页面类对应的方法。如: 某页面类名为`LoginPage`,则会自动定义出`login_page`方法供`Browser`对象调用
|
49
|
+
- 可以直接调用Watir::Browser的所有方法
|
50
|
+
``` ruby
|
51
|
+
browser = Browser.new(:wap)
|
52
|
+
browser.login_page.login("xxx")
|
53
|
+
# 调用Watir::Browser对象的方法
|
54
|
+
browser.refresh
|
55
|
+
```
|
56
|
+
|
57
|
+
####执行测试用例
|
58
|
+
|
59
|
+
$ actir [switches] [--] [files & folders]
|
60
|
+
$ actir testcode/test_refund/test_full_refund.rb
|
61
|
+
$ actir testcode
|
62
|
+
|
63
|
+
指定执行某个用例文件中的某个方法:
|
64
|
+
|
65
|
+
$ actir testcode/test_pay/test_pay.rb -n test_ecard
|
66
|
+
|
67
|
+
指定用例失败重试次数:
|
68
|
+
|
69
|
+
$ actir testcode/test_pay/test_pay.rb -r 2
|
70
|
+
|
71
|
+
输出html格式的测试报告:
|
72
|
+
|
73
|
+
$ actir testcode/test_pay/test_pay.rb -r 2 --report
|
74
|
+
|
75
|
+
|
76
|
+
> 可使用`actir -h` 了解更多的运行参数
|
77
|
+
>
|
data/lib/actir/config.rb
CHANGED
@@ -59,11 +59,17 @@ module Actir
|
|
59
59
|
#先取出数组中的第一个元素当做配置文件名称,并从数组中移除此元素
|
60
60
|
file_name = key_array.shift
|
61
61
|
#再取出第二个元素,指定配置项,并移除
|
62
|
-
cfg_name = key_array.shift
|
62
|
+
# cfg_name = key_array.shift
|
63
63
|
hash = {}
|
64
64
|
#加载yaml配置文件,加锁
|
65
65
|
lock(file_name, config_path) do
|
66
|
-
hash = cfg_name ? load_file(file(file_name, config_path))[cfg_name] : load_file(file(file_name, config_path))
|
66
|
+
# hash = cfg_name ? load_file(file(file_name, config_path))[cfg_name] : load_file(file(file_name, config_path))
|
67
|
+
hash = load_file(file(file_name, config_path))
|
68
|
+
end
|
69
|
+
#判断是否存在 online 和 qatest 关键词,存在的话就读取当前env配置
|
70
|
+
if (hash.has_key?("online") || hash.has_key?("qatest"))
|
71
|
+
#在key_array头上加入env配置
|
72
|
+
key_array.unshift(determine_env)
|
67
73
|
end
|
68
74
|
#遍历key数组
|
69
75
|
until key_array.empty? do
|
@@ -78,9 +84,9 @@ module Actir
|
|
78
84
|
#
|
79
85
|
# 改文件加锁,解决多进程同时写文件的问题
|
80
86
|
#
|
81
|
-
# @example : set("config.test_mode.
|
87
|
+
# @example : set("config.test_mode.mode", ":remote")
|
82
88
|
#
|
83
|
-
# @param key : [String] 指定配置项的字符串,形如config.test_mode.
|
89
|
+
# @param key : [String] 指定配置项的字符串,形如config.test_mode.mode,以点衔接
|
84
90
|
#
|
85
91
|
# value : [String] 要修改的值的字符串
|
86
92
|
#
|
@@ -89,6 +95,19 @@ module Actir
|
|
89
95
|
key_array = key.split(".")
|
90
96
|
#先取出数组中的第一个元素当做配置文件名称,并从数组中移除此元素
|
91
97
|
file_name = key_array.shift
|
98
|
+
|
99
|
+
hash = {}
|
100
|
+
#加载yaml配置文件,加锁
|
101
|
+
lock(file_name, config_path) do
|
102
|
+
# hash = cfg_name ? load_file(file(file_name, config_path))[cfg_name] : load_file(file(file_name, config_path))
|
103
|
+
hash = load_file(file(file_name, config_path))
|
104
|
+
end
|
105
|
+
#判断是否存在 online 和 qatest 关键词,存在的话就读取当前env配置
|
106
|
+
if (hash.has_key?("online") || hash.has_key?("qatest"))
|
107
|
+
#在key_array头上加入env配置
|
108
|
+
key_array.unshift(determine_env)
|
109
|
+
end
|
110
|
+
|
92
111
|
cfg_str = key_array.shift
|
93
112
|
old_value = ""
|
94
113
|
lock(file_name, config_path) do
|
@@ -115,9 +134,10 @@ module Actir
|
|
115
134
|
end
|
116
135
|
config_file.close
|
117
136
|
end
|
118
|
-
puts "
|
137
|
+
puts "set [" + key + "]'s value form " + old_value + " into " + value
|
119
138
|
end
|
120
139
|
|
140
|
+
|
121
141
|
#
|
122
142
|
# 判断配置文件的上一次修改时间和当前时间是否一样
|
123
143
|
#
|
@@ -189,6 +209,15 @@ module Actir
|
|
189
209
|
true
|
190
210
|
end
|
191
211
|
|
212
|
+
# 判断执行环境,如果$env为nil则从环境变量里面读取
|
213
|
+
def determine_env
|
214
|
+
if $env
|
215
|
+
$env
|
216
|
+
else
|
217
|
+
ENV["env"]
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
192
221
|
end
|
193
222
|
end
|
194
223
|
end
|
data/lib/actir/data.rb
CHANGED
@@ -5,37 +5,29 @@ module Actir
|
|
5
5
|
class << self
|
6
6
|
|
7
7
|
def get(key)
|
8
|
-
#按照点分割字符串
|
9
|
-
key_array = key.split(".")
|
10
|
-
#先取出数组中的第一个元素当做配置文件名称,并从数组中移除此元素
|
11
|
-
file_name = key_array.shift
|
12
|
-
#再取出第二个元素,指定配置项,并移除
|
13
|
-
cfg_name = key_array.shift
|
14
|
-
hash = cfg_name ? load_file(file(file_name))[cfg_name] : load_file(file(file_name))
|
15
|
-
#遍历key数组
|
16
|
-
until key_array.empty? do
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
hash
|
8
|
+
# #按照点分割字符串
|
9
|
+
# key_array = key.split(".")
|
10
|
+
# #先取出数组中的第一个元素当做配置文件名称,并从数组中移除此元素
|
11
|
+
# file_name = key_array.shift
|
12
|
+
# #再取出第二个元素,指定配置项,并移除
|
13
|
+
# cfg_name = key_array.shift
|
14
|
+
# hash = cfg_name ? load_file(file(file_name))[cfg_name] : load_file(file(file_name))
|
15
|
+
# #遍历key数组
|
16
|
+
# until key_array.empty? do
|
17
|
+
# key = key_array.shift
|
18
|
+
# hash = hash[key]
|
19
|
+
# end
|
20
|
+
# hash
|
21
|
+
Actir::Config.get(key, data_dir)
|
21
22
|
end
|
22
23
|
|
23
24
|
private
|
24
25
|
|
25
|
-
def file(file_name)
|
26
|
-
File.expand_path(File.join(data_dir, "/#{file_name}.yaml"), __FILE__)
|
27
|
-
end
|
28
|
-
|
29
26
|
#默认配置文件夹路径
|
30
27
|
def data_dir
|
31
28
|
@data_dir ||= File.join($project_path, "data")
|
32
29
|
end
|
33
30
|
|
34
|
-
#读取yaml配置文件
|
35
|
-
def load_file(file)
|
36
|
-
YAML.load_file file
|
37
|
-
end
|
38
|
-
|
39
31
|
end
|
40
32
|
|
41
33
|
end
|
@@ -11,7 +11,7 @@ module Actir
|
|
11
11
|
$env = "online"
|
12
12
|
options = parse_options!(argv)
|
13
13
|
num_processes = Actir::ParallelTests.determine_number_of_processes(options[:count])
|
14
|
-
$mode = Actir::ParallelTests.
|
14
|
+
$mode = Actir::ParallelTests.determine_run_mode(options[:mode])
|
15
15
|
if options[:execute]
|
16
16
|
execute_shell_command_in_parallel(options[:execute], num_processes, options)
|
17
17
|
else
|
@@ -184,7 +184,7 @@ module Actir
|
|
184
184
|
# default - filesize
|
185
185
|
# TEXT
|
186
186
|
# ) { |type| options[:group_by] = type.to_sym }
|
187
|
-
opts.on("-e [online][qatest]", String, "set environment to run testcase, default: online") { |env| env = "online" if ((env != "qatest" && env != "online")||
|
187
|
+
opts.on("-e [online][qatest]", String, "set environment to run testcase, default: online") { |env| env = "online" if ((env != "qatest" && env != "online")||(env == nil)); $env = env}
|
188
188
|
opts.on("-r [TIMES]", "--rerun [TIMES]", Integer, "rerun times for failure&error testcase, default: 0") { |n| options[:rerun] = n }
|
189
189
|
opts.on("-u", "--update", "Update Baifubao's cookies") { options[:update] = true }
|
190
190
|
opts.on("--verbose", "Print more output") { options[:verbose] = true }
|
@@ -27,25 +27,24 @@ module Actir
|
|
27
27
|
[
|
28
28
|
times,
|
29
29
|
0
|
30
|
-
#Actir::Config.get("config.test_mode.re_run")
|
31
30
|
].detect{|c| not c.to_s.strip.empty? }.to_i
|
32
31
|
end
|
33
32
|
|
34
33
|
#判断用例执行的环境是local还是remote
|
35
|
-
def
|
34
|
+
def determine_run_mode(mode)
|
36
35
|
env_mode = :local
|
37
36
|
#判断是否存在config.yaml配置文件,如果不存在,则test_mode给默认值
|
38
37
|
if File.exist?(File.join($project_path, "config", "config.yaml"))
|
39
38
|
#刷新配置文件中的env配置项为remote模式,以防止本地调试代码改写上传后导致CI失败
|
40
39
|
if mode
|
41
|
-
unless mode == /#{Actir::Config.get("config.test_mode.
|
40
|
+
unless mode == /#{Actir::Config.get("config.test_mode.mode")}/
|
42
41
|
#同步修改配置文件,需要先将Symbol转换成String
|
43
42
|
mode_str = ":" + mode.to_s
|
44
|
-
Actir::Config.set("config.test_mode.
|
43
|
+
Actir::Config.set("config.test_mode.mode", mode_str)
|
45
44
|
end
|
46
45
|
env_mode = mode
|
47
46
|
else
|
48
|
-
env_mode = Actir::Config.get("config.test_mode.
|
47
|
+
env_mode = Actir::Config.get("config.test_mode.mode")
|
49
48
|
end
|
50
49
|
else
|
51
50
|
if mode
|
@@ -41,26 +41,39 @@ module Actir
|
|
41
41
|
|
42
42
|
def record_detail(test_result)
|
43
43
|
failure_detail_hash = get_testfailed_info(test_result)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
58
|
-
if fail_flag == 0
|
59
|
-
testcase[:success] = true
|
60
|
-
testcase[:detail] = nil
|
44
|
+
|
45
|
+
$testsuites.each do |testsuite|
|
46
|
+
testcases = testsuite[:testcases]
|
47
|
+
testcases.each do |testcase|
|
48
|
+
#标识用例是否执行失败
|
49
|
+
fail_flag = 0
|
50
|
+
failure_detail_hash.each do |testcase_failure, detail|
|
51
|
+
if testcase_failure == testcase[:testcase_name]
|
52
|
+
testcase[:success] = false
|
53
|
+
testcase[:detail] = detail
|
54
|
+
fail_flag = 1
|
55
|
+
#从hash表中移除
|
56
|
+
failure_detail_hash.delete(testcase_failure)
|
61
57
|
end
|
62
58
|
end
|
59
|
+
if fail_flag == 0
|
60
|
+
testcase[:success] = true
|
61
|
+
testcase[:detail] = nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
# 反向再检查一遍是否有$testsuites种未记录的失败用例
|
66
|
+
miss_failed_case = []
|
67
|
+
if failure_detail_hash.size > 0
|
68
|
+
failure_detail_hash.each do |testcase_failure, detail|
|
69
|
+
testcase = {:testcase_name => testcase_failure, :success => false, :detail => detail}
|
70
|
+
#从hash表中移除
|
71
|
+
failure_detail_hash.delete(testcase_failure)
|
72
|
+
miss_failed_case << testcase
|
63
73
|
end
|
74
|
+
testsuite = {:testsuite_name => "miss_failed_case", :testcases => miss_failed_case}
|
75
|
+
$testsuites << testsuite
|
76
|
+
end
|
64
77
|
end
|
65
78
|
|
66
79
|
def get_run_test_info(test_result)
|
@@ -83,6 +83,7 @@ module Actir
|
|
83
83
|
def execute_command(cmd, process_number, num_processes, options)
|
84
84
|
env = (options[:env] || {}).merge(
|
85
85
|
#"TEST_ENV_NUMBER" => test_env_number(process_number),
|
86
|
+
"env" => $env,
|
86
87
|
"TEST_ENV_NUMBER" => process_number,
|
87
88
|
"PARALLEL_TEST_GROUPS" => num_processes
|
88
89
|
)
|
data/lib/actir/version.rb
CHANGED
@@ -18,7 +18,7 @@ class Browser
|
|
18
18
|
# 初始化函数
|
19
19
|
#
|
20
20
|
# 可以配置测试的mode:
|
21
|
-
# 1.:
|
21
|
+
# 1.:mode
|
22
22
|
# :local 本地环境上测试
|
23
23
|
# :remote 远程测试环境上测试
|
24
24
|
# 2.:browser
|
@@ -27,20 +27,20 @@ class Browser
|
|
27
27
|
# 3.:agent wap页面的useragent类型
|
28
28
|
# :iphone
|
29
29
|
# :android_phone
|
30
|
-
# 4.:address 当
|
30
|
+
# 4.:address 当mode为:remote时,url指定远程执行脚本的地址
|
31
31
|
#
|
32
32
|
def initialize(type = :www, *args)
|
33
33
|
args = init_args(*args)
|
34
34
|
@browser_type = args[:browser]
|
35
35
|
@agent = args[:agent]
|
36
|
-
@
|
36
|
+
@mode = args[:mode]
|
37
37
|
@window_size = args[:window_size]
|
38
|
-
if @
|
38
|
+
if @mode == :remote
|
39
39
|
@url = if args[:url]
|
40
40
|
"http://#{args[:url]}/wd/hub"
|
41
41
|
else
|
42
42
|
#TO-DO ,远程模式没有传入IP,改成local模式
|
43
|
-
@
|
43
|
+
@mode = :local
|
44
44
|
puts "selenium-node's IPAddress is null. switch to local mode"
|
45
45
|
end
|
46
46
|
end
|
@@ -90,8 +90,8 @@ class Browser
|
|
90
90
|
else
|
91
91
|
#若ENV为空,则读取配置文件,判断有无配置文件
|
92
92
|
if config_exist
|
93
|
-
|
94
|
-
args[:mode] = (
|
93
|
+
mode = $config["config"]["test_mode"]["mode"]
|
94
|
+
args[:mode] = (mode == nil) ? :local : mode
|
95
95
|
else
|
96
96
|
args[:mode] = :local
|
97
97
|
end
|
@@ -127,7 +127,7 @@ class Browser
|
|
127
127
|
# 打开普通www浏览器
|
128
128
|
#
|
129
129
|
def browser_www
|
130
|
-
case @
|
130
|
+
case @mode
|
131
131
|
when :local
|
132
132
|
#本地chrome浏览器
|
133
133
|
browser = Watir::Browser.new @browser_type
|
@@ -142,7 +142,7 @@ class Browser
|
|
142
142
|
#重新设置窗口大小,不然phantomjs的ghost driver各种问题
|
143
143
|
if @browser_type == :phantomjs
|
144
144
|
browser.window.resize_to(PHANTOMJS_SIZE["width"], PHANTOMJS_SIZE["height"])
|
145
|
-
elsif @
|
145
|
+
elsif @mode == :remote
|
146
146
|
browser.window.resize_to(REMOTE_SIZE["width"], REMOTE_SIZE["height"])
|
147
147
|
elsif @window_size != nil
|
148
148
|
browser.window.resize_to(@window_size["width"], @window_size["height"])
|
@@ -160,7 +160,7 @@ class Browser
|
|
160
160
|
# TO-DO: remote模式的phantomjs
|
161
161
|
#
|
162
162
|
def browser_wap
|
163
|
-
case @
|
163
|
+
case @mode
|
164
164
|
when :local
|
165
165
|
driver = Actir::Webdriver.driver(:browser => @browser_type, :agent => @agent)
|
166
166
|
when :remote
|
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.4.
|
4
|
+
version: 1.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hub
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-unit
|