bucky-core 0.10.17 → 0.10.18

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 828c8502067f7be7e163f12084d0eac329201a51ce95eff6b72b4385fbd508c3
4
- data.tar.gz: e705af8f1174573260b267e5b9be4636562ca893a7c667007bed1fdca7b21cc3
3
+ metadata.gz: d50742f901d8276de5e234afde280ec7692be426842f815647b192f31f6b90ab
4
+ data.tar.gz: e833afdea6d437f15eddade5331ac729139414c202bb86ac39c8d9f7128f557a
5
5
  SHA512:
6
- metadata.gz: 1159630606ed77a9b95882e4ad7209c278b3845b7f7c1f130a4d7c078f78b3275bfd3801d1018ac4e85cda167b5914a3d5b975060de44669a35112074d7102d8
7
- data.tar.gz: 645d3ff4b6208182f0dbd466a3127c8914f56c7ba9b9be57bd94cd8d5c3487a660afac543fa8b36259fcc5d272e3a89816bb0bb103cdbd0aa2b208423b3a2411
6
+ metadata.gz: 4fb55a0a3306935a41ecfde2004b3de2c1c3d8aacfdf18a62187b75296ea536af7a7bc622a224aa3cd494ebf6a4f90476dd61b6dc0e1fc83ecaef142521c5b3a
7
+ data.tar.gz: 660d128ae6ab97185df4eee3478dfb76f683f1d7e0d6386d8853b42bb2d7b6bb096ba36440536414902b632215452e4688177f59e2650ce46a38b24c57eb5058
data/.circleci/config.yml CHANGED
@@ -27,7 +27,7 @@ jobs:
27
27
  command: docker load -q -i ~/caches/images.tar
28
28
  - run:
29
29
  name: docker up
30
- command: docker-compose -f docker-compose.system-test.yml up --no-build -d
30
+ command: docker-compose -f docker-compose.system-test.yml up -d
31
31
  - run:
32
32
  name: execute system testing
33
33
  command: 'circleci tests glob system_testing/testing_code/*.bats | xargs -n 1 -I {} docker exec bucky-core bats "/bucky-core/"{} | circleci tests split'
data/README.md CHANGED
@@ -98,6 +98,7 @@ ENV_FOO=foo bucky run -t e2e -d
98
98
  -r, --re_test_count RE_TEST_COUNT # How many round you run tests
99
99
  -l, --label LABEL_NAME
100
100
  -m, --link_check_max_times MAX_TIMES # Works only with which category is linkstatus
101
+ -o, --out JSON_OUTPUT_FILE_PATH # Output summary report by json
101
102
  ```
102
103
 
103
104
  ### Rerun test
@@ -212,6 +213,7 @@ test_category: linkstatus
212
213
  exclude_urls:
213
214
  - https://example.com/fuga/?hoge=1 # PERFECT MATCHING
214
215
  - https://example.com/fuga/* # PARTIAL MATCHING
216
+ - /https://example.com/.*\.html/ # REGULAR EXPRESSION MATCHING
215
217
  cases:
216
218
  - case_name: test_code_1 # Suite filename + number
217
219
  desc: status check for top page
data/exe/bucky CHANGED
@@ -89,7 +89,9 @@ end
89
89
  opts.on('-m', '--link_check_max_times') do |v|
90
90
  test_cond[:link_check_max_times] = v.to_i
91
91
  end
92
-
92
+ opts.on('-o', '--out JSON_OUTPUT_FILE_PATH') do |v|
93
+ test_cond[:out] = v
94
+ end
93
95
  lint_cond = {}
94
96
  opts.on('-C', '--category CATEGORY_NAME') do |v|
95
97
  lint_cond[:lint_category] = v
@@ -124,42 +126,34 @@ def bucky_home?
124
126
  File.exist?('.bucky_home')
125
127
  end
126
128
 
127
- current_dir = Dir.pwd
128
- gem_script_dir = __dir__
129
-
130
- if ARGV == RUN_COMMAND
131
- error_and_exit('Not bucky project dirctory here.') unless bucky_home?
132
-
133
- $bucky_home_dir = Dir.pwd
129
+ def setup_test_cond(test_cond)
134
130
  # Default conditions setting conditions setting
135
131
  test_cond[:test_category] ||= 'e2e'
136
132
  test_cond[:re_test_count] = test_cond[:re_test_count] ? test_cond[:re_test_count].to_i : 1
137
133
  test_cond[:link_check_max_times] ||= 3
134
+ test_cond[:out] ||= 'report.json'
138
135
  # Change to array e.g.--suite_id 1,2,3 -> :suite_id=>[1,2,3]
139
- test_cond.each { |k, v| test_cond[k] = v.split(',') if v.instance_of?(String) }
140
- require_relative '../lib/bucky/core/test_core/test_manager'
141
- Bucky::Core::TestCore::TestManager.new(test_cond).run
142
- Bucky::Core::TestCore::ExitHandler.instance.bucky_exit
136
+ %i[suite_name case label xlabel device].each do |k|
137
+ test_cond[k] = test_cond[k].split(',') unless test_cond[k].nil?
138
+ end
139
+ test_cond
140
+ end
143
141
 
144
- elsif ARGV == RERUN_COMMAND
142
+ current_dir = Dir.pwd
143
+ gem_script_dir = __dir__
144
+
145
+ if ARGV[0].end_with? 'run'
146
+ error_and_exit('Not bucky project dirctory here.') unless bucky_home?
145
147
  $bucky_home_dir = Dir.pwd
146
- # Default conditions setting conditions setting
147
- test_cond[:test_category] ||= 'e2e'
148
- test_cond[:link_check_max_times] ||= 3
149
- test_cond[:re_test_count] = test_cond[:re_test_count] ? test_cond[:re_test_count].to_i : 1
150
- # Change to array e.g.--suite_id 1,2,3 -> :suite_id=>[1,2,3]
151
- test_cond.each { |k, v| test_cond[k] = v.split(',') if v.instance_of?(String) }
152
148
  require_relative '../lib/bucky/core/test_core/test_manager'
153
- Bucky::Core::TestCore::TestManager.new(test_cond).rerun
149
+ Bucky::Core::TestCore::TestManager.new(setup_test_cond(test_cond)).send(ARGV[0])
154
150
  Bucky::Core::TestCore::ExitHandler.instance.bucky_exit
155
-
156
151
  elsif ARGV == LINT_COMMAND
157
152
  $bucky_home_dir = Dir.pwd
158
153
  # Default conditions setting
159
154
  lint_cond[:lint_category] ||= 'config'
160
155
  require_relative '../lib/bucky/tools/lint'
161
156
  Bucky::Tools::Lint.check(lint_cond[:lint_category])
162
-
163
157
  elsif ARGV[0..0] == NEW_COMMAND
164
158
  error_and_exit('No test app name.') if ARGV.length < 2
165
159
 
@@ -34,9 +34,8 @@ module Bucky
34
34
  testcodes = []
35
35
  service = (test_cond[:service] || ['*']).first
36
36
  device = (test_cond[:device] || ['*']).first
37
- category = (test_cond[:test_category] || ['*']).first
38
37
 
39
- Dir.glob("#{$bucky_home_dir}/services/#{service}/#{device}/scenarios/#{category}/*.yml").each do |testcode_file|
38
+ Dir.glob("#{$bucky_home_dir}/services/#{service}/#{device}/scenarios/#{test_cond[:test_category]}/*.yml").each do |testcode_file|
40
39
  testcodes << load_testcode_in_file(testcode_file, test_cond)
41
40
  end
42
41
  # Delete nil element
@@ -46,7 +46,7 @@ module Bucky
46
46
  end
47
47
 
48
48
  # Genrate test class by test suite and test case data
49
- def generate_test_class(data, link_status_url_log = {})
49
+ def generate_test_class(data: [], linkstatus_url_log: {}, w_pipe: {})
50
50
  test_cond = @test_cond
51
51
  # Common proccessing
52
52
  # e.g.) TestSampleAppPcE2e1, TestSampleAppPcHttpstatus1
@@ -63,6 +63,7 @@ module Bucky
63
63
  match_obj = /\Atest_(.+)\(.+::(Test.+)\)\z/.match(original_name)
64
64
  "#{match_obj[1]}(#{match_obj[2]})"
65
65
  end
66
+ define_method(:w_pipe, proc { w_pipe })
66
67
 
67
68
  # Class structure is different for each test category
68
69
  case data[:test_category]
@@ -74,8 +75,8 @@ module Bucky
74
75
  define_method(method_name) do
75
76
  puts "\n#{simple_test_class_name(name)}"
76
77
  t_case[:urls].each do |url|
77
- link_status_check_args = { url: url, device: data[:suite][:device], exclude_urls: data[:suite][:exclude_urls], link_check_max_times: test_cond[:link_check_max_times], url_log: link_status_url_log }
78
- link_status_check(link_status_check_args)
78
+ linkstatus_check_args = { url: url, device: data[:suite][:device], exclude_urls: data[:suite][:exclude_urls], link_check_max_times: test_cond[:link_check_max_times], url_log: linkstatus_url_log }
79
+ linkstatus_check(linkstatus_check_args)
79
80
  end
80
81
  end
81
82
  )
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'parallel'
3
+ require 'json'
4
4
  require_relative '../test_core/test_case_loader'
5
5
  require_relative '../../utils/config'
6
6
  require_relative './test_class_generator'
@@ -26,6 +26,8 @@ module Bucky
26
26
  # If child process dead, available workers increase
27
27
  Signal.trap('CLD') { available_workers += 1 }
28
28
 
29
+ r_pipe, w_pipe = IO.pipe
30
+
29
31
  data_set.each do |data|
30
32
  # Wait until worker is available and handle exit code from previous process
31
33
  unless available_workers.positive?
@@ -34,28 +36,51 @@ module Bucky
34
36
  end
35
37
  # Workers decrease when start working
36
38
  available_workers -= 1
37
- fork { block.call(data) }
39
+ fork { block.call(data, w_pipe) }
38
40
  end
39
41
  # Handle all exit code in waitall
40
42
  Process.waitall.each do |child|
41
43
  Bucky::Core::TestCore::ExitHandler.instance.raise unless child[1].exitstatus.zero?
42
44
  end
45
+
46
+ w_pipe.close
47
+ results_set = collect_results_set(r_pipe)
48
+ r_pipe.close
49
+
50
+ results_set
43
51
  end
44
52
 
45
53
  def parallel_distribute_into_workers(data_set, max_processes, &block)
46
54
  # Group the data by remainder of index
47
55
  data_set_grouped = data_set.group_by.with_index { |_elem, index| index % max_processes }
56
+ r_pipe, w_pipe = IO.pipe
48
57
  # Use 'values' method to get only hash's key into an array
49
58
  data_set_grouped.values.each do |data_for_pre_worker|
50
59
  # Number of child process is equal to max_processes (or equal to data_set length when data_set length is less than max_processes)
51
60
  fork do
52
- data_for_pre_worker.each { |data| block.call(data) }
61
+ data_for_pre_worker.each { |data| block.call(data, w_pipe) }
53
62
  end
54
63
  end
55
64
  # Handle all exit code in waitall
56
65
  Process.waitall.each do |child|
57
66
  Bucky::Core::TestCore::ExitHandler.instance.raise unless child[1].exitstatus.zero?
58
67
  end
68
+
69
+ w_pipe.close
70
+ results_set = collect_results_set(r_pipe)
71
+ r_pipe.close
72
+
73
+ results_set
74
+ end
75
+
76
+ def collect_results_set(r_pipe)
77
+ results_set = {}
78
+ r_pipe.each_line do |line|
79
+ r = JSON.parse(line)
80
+ results_set[r['test_class_name']] = r
81
+ end
82
+
83
+ results_set
59
84
  end
60
85
  end
61
86
 
@@ -69,6 +94,20 @@ module Bucky
69
94
  @tdo = Bucky::Core::Database::TestDataOperator.new
70
95
  @start_time = Time.now
71
96
  $job_id = @tdo.save_job_record_and_get_job_id(@start_time, @test_cond[:command_and_option])
97
+ @json_report = {
98
+ summary: {
99
+ cases_count: 0,
100
+ success_count: 0,
101
+ failure_count: 0,
102
+ job_id: $job_id,
103
+ test_category: test_cond[:test_category],
104
+ device: test_cond[:device],
105
+ labels: test_cond[:label],
106
+ exclude_labels: test_cond[:xlabel],
107
+ rerun_job_id: test_cond[:job],
108
+ round_count: 0
109
+ }
110
+ }
72
111
  end
73
112
 
74
113
  def run
@@ -102,25 +141,42 @@ module Bucky
102
141
  e2e_parallel_num = Bucky::Utils::Config.instance[:e2e_parallel_num]
103
142
  linkstatus_parallel_num = Bucky::Utils::Config.instance[:linkstatus_parallel_num]
104
143
  tcg = Bucky::Core::TestCore::TestClassGenerator.new(@test_cond)
105
- case @test_cond[:test_category][0]
106
- when 'e2e' then parallel_new_worker_each(test_suite_data, e2e_parallel_num) { |data| tcg.generate_test_class(data) }
144
+ case @test_cond[:test_category]
145
+ when 'e2e' then results_set = parallel_new_worker_each(test_suite_data, e2e_parallel_num) { |data, w_pipe| tcg.generate_test_class(data: data, w_pipe: w_pipe) }
107
146
  when 'linkstatus' then
108
- link_status_url_log = {}
109
- parallel_distribute_into_workers(test_suite_data, linkstatus_parallel_num) { |data| tcg.generate_test_class(data, link_status_url_log) }
147
+ linkstatus_url_log = {}
148
+ results_set = parallel_distribute_into_workers(test_suite_data, linkstatus_parallel_num) { |data, w_pipe| tcg.generate_test_class(data: data, linkstatus_url_log: linkstatus_url_log, w_pipe: w_pipe) }
110
149
  end
150
+
151
+ results_set
111
152
  end
112
153
 
113
154
  def execute_test
155
+ results_set = {}
114
156
  @re_test_count.times do |i|
115
157
  Bucky::Core::TestCore::ExitHandler.instance.reset
116
158
  $round = i + 1
159
+ @json_report[:summary][:round_count] = $round
117
160
  test_suite_data = load_test_suites
118
- do_test_suites(test_suite_data)
161
+ results_set = do_test_suites(test_suite_data)
119
162
  @test_cond[:re_test_cond] = @tdo.get_ng_test_cases_at_last_execution(
120
163
  is_error: 1, job_id: $job_id, round: $round
121
164
  )
122
165
  break if @test_cond[:re_test_cond].empty?
123
166
  end
167
+
168
+ return unless @test_cond[:out]
169
+
170
+ results_set.each do |_class_name, res|
171
+ @json_report[:summary][:cases_count] += res['cases_count']
172
+ @json_report[:summary][:success_count] += res['success_count']
173
+ @json_report[:summary][:failure_count] += res['failure_count']
174
+ end
175
+
176
+ File.open(@test_cond[:out], 'w') do |f|
177
+ f.puts(@json_report.to_json)
178
+ puts "\nSave report : #{@test_cond[:out]}\n"
179
+ end
124
180
  end
125
181
  end
126
182
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'test/unit'
4
+ require 'json'
4
5
  require_relative '../../core/test_core/test_result'
5
6
 
6
7
  module Bucky
@@ -25,6 +26,12 @@ module Bucky
25
26
  def run(result)
26
27
  super
27
28
  @@this_result.result = result unless $debug
29
+ w_pipe.puts({
30
+ test_class_name: self.class.name,
31
+ cases_count: result.run_count,
32
+ success_count: result.pass_count,
33
+ failure_count: result.run_count - result.pass_count
34
+ }.to_json)
28
35
  end
29
36
 
30
37
  def setup
@@ -62,7 +62,7 @@ module Bucky
62
62
  end
63
63
  end
64
64
 
65
- def link_status_check(args)
65
+ def linkstatus_check(args)
66
66
  url = args[:url]
67
67
  device = args[:device]
68
68
  exclude_urls = args[:exclude_urls]
data/lib/bucky/version.rb CHANGED
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Bucky
4
4
  module Version
5
- VERSION = '0.10.17'
5
+ VERSION = '0.10.18'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bucky-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.17
4
+ version: 0.10.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - NaotoKishino
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: exe
15
15
  cert_chain: []
16
- date: 2022-05-18 00:00:00.000000000 Z
16
+ date: 2022-05-23 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: awesome_print