beaker 2.30.0 → 2.30.1
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 +8 -8
- data/HISTORY.md +19 -2
- data/lib/beaker/cli.rb +1 -7
- data/lib/beaker/options/command_line_parser.rb +0 -6
- data/lib/beaker/options/presets.rb +0 -1
- data/lib/beaker/test_case.rb +176 -2
- data/lib/beaker/test_suite.rb +399 -9
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/test_suite_spec.rb +306 -9
- metadata +2 -8
- data/lib/beaker/runner/mini_test/test_suite.rb +0 -58
- data/lib/beaker/runner/native/test_case.rb +0 -193
- data/lib/beaker/runner/native/test_suite.rb +0 -410
- data/spec/beaker/options/beaker_options_spec.rb +0 -34
- data/spec/beaker/runner/native/test_case_spec.rb +0 -147
- data/spec/beaker/runner/native/test_suite_spec.rb +0 -303
@@ -1,303 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'fileutils'
|
3
|
-
|
4
|
-
module Beaker
|
5
|
-
module Runner
|
6
|
-
module Native
|
7
|
-
describe TestSuite do
|
8
|
-
context 'new' do
|
9
|
-
let(:test_dir) { 'tmp/tests' }
|
10
|
-
let(:options) { {'name' => create_files(@files)} }
|
11
|
-
let(:rb_test) { File.expand_path(test_dir + '/my_ruby_file.rb') }
|
12
|
-
let(:pl_test) { File.expand_path(test_dir + '/my_perl_file.pl') }
|
13
|
-
let(:sh_test) { File.expand_path(test_dir + '/my_shell_file.sh') }
|
14
|
-
|
15
|
-
it 'fails without test files' do
|
16
|
-
expect { Beaker::Runner::Native::TestSuite.new('name', 'hosts', Hash.new, Time.now, :stop_on_error) }.to raise_error
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'includes specific files as test file when explicitly passed' do
|
20
|
-
@files = [ rb_test ]
|
21
|
-
ts = Beaker::Runner::Native::TestSuite.new('name', 'hosts', options, Time.now, :stop_on_error)
|
22
|
-
|
23
|
-
tfs = ts.instance_variable_get(:@test_files)
|
24
|
-
expect(tfs).to include rb_test
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'defaults to :slow fail_mode if not provided through parameter or options' do
|
28
|
-
@files = [ rb_test ]
|
29
|
-
ts = Beaker::Runner::Native::TestSuite.new('name', 'hosts', options, Time.now)
|
30
|
-
tfm = ts.instance_variable_get(:@fail_mode)
|
31
|
-
expect(tfm).to be == :slow
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'uses provided parameter fail_mode' do
|
35
|
-
@files = [ rb_test ]
|
36
|
-
ts = Beaker::Runner::Native::TestSuite.new('name', 'hosts', options, Time.now, :fast)
|
37
|
-
tfm = ts.instance_variable_get(:@fail_mode)
|
38
|
-
expect(tfm).to be == :fast
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'uses options fail_mode if fail_mode parameter is not provided' do
|
42
|
-
@files = [ rb_test ]
|
43
|
-
options[:fail_mode] = :fast
|
44
|
-
ts = Beaker::Runner::Native::TestSuite.new('name', 'hosts', options, Time.now)
|
45
|
-
tfm = ts.instance_variable_get(:@fail_mode)
|
46
|
-
expect(tfm).to be == :fast
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
context 'run' do
|
51
|
-
let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(@files), :log_dated_dir => '.', :xml_dated_dir => '.'}) }
|
52
|
-
let(:broken_script) { "raise RuntimeError" }
|
53
|
-
let(:fail_script) { "raise Beaker::DSL::Outcomes::FailTest" }
|
54
|
-
let(:okay_script) { "true" }
|
55
|
-
let(:rb_test) { 'my_ruby_file.rb' }
|
56
|
-
let(:pl_test) { '/my_perl_file.pl' }
|
57
|
-
let(:sh_test) { '/my_shell_file.sh' }
|
58
|
-
let(:hosts) { make_hosts() }
|
59
|
-
|
60
|
-
it 'fails fast if fail_mode != :slow and runtime error is raised' do
|
61
|
-
allow( Logger ).to receive('new')
|
62
|
-
@files = [ rb_test, pl_test, sh_test]
|
63
|
-
File.open(rb_test, 'w') { |file| file.write(broken_script) }
|
64
|
-
File.open(pl_test, 'w') { |file| file.write(okay_script) }
|
65
|
-
File.open(sh_test, 'w') { |file| file.write(okay_script) }
|
66
|
-
|
67
|
-
ts = Beaker::Runner::Native::TestSuite.new( 'name', hosts, options, Time.now, :stop )
|
68
|
-
tsr = ts.instance_variable_get( :@test_suite_results )
|
69
|
-
allow( tsr ).to receive(:write_junit_xml).and_return( true )
|
70
|
-
allow( tsr ).to receive(:summarize).and_return( true )
|
71
|
-
|
72
|
-
ts.run
|
73
|
-
expect( tsr.errored_tests ).to be === 1
|
74
|
-
expect( tsr.failed_tests ).to be === 0
|
75
|
-
expect( tsr.test_count ).to be === 1
|
76
|
-
expect( tsr.passed_tests).to be === 0
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'fails fast if fail_mode != :slow and fail test is raised' do
|
80
|
-
allow( Logger ).to receive('new')
|
81
|
-
@files = [ rb_test, pl_test, sh_test]
|
82
|
-
File.open(rb_test, 'w') { |file| file.write(fail_script) }
|
83
|
-
File.open(pl_test, 'w') { |file| file.write(okay_script) }
|
84
|
-
File.open(sh_test, 'w') { |file| file.write(okay_script) }
|
85
|
-
|
86
|
-
ts = Beaker::Runner::Native::TestSuite.new( 'name', hosts, options, Time.now, :stop )
|
87
|
-
tsr = ts.instance_variable_get( :@test_suite_results )
|
88
|
-
allow( tsr ).to receive(:write_junit_xml).and_return( true )
|
89
|
-
allow( tsr ).to receive(:summarize).and_return( true )
|
90
|
-
|
91
|
-
ts.run
|
92
|
-
expect( tsr.errored_tests ).to be === 0
|
93
|
-
expect( tsr.failed_tests ).to be === 1
|
94
|
-
expect( tsr.test_count ).to be === 1
|
95
|
-
expect( tsr.passed_tests).to be === 0
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'fails slow if fail_mode = :slow, even if a test fails and there is a runtime error' do
|
99
|
-
allow( Logger ).to receive('new')
|
100
|
-
@files = [ rb_test, pl_test, sh_test]
|
101
|
-
File.open(rb_test, 'w') { |file| file.write(broken_script) }
|
102
|
-
File.open(pl_test, 'w') { |file| file.write(fail_script) }
|
103
|
-
File.open(sh_test, 'w') { |file| file.write(okay_script) }
|
104
|
-
|
105
|
-
ts = Beaker::Runner::Native::TestSuite.new( 'name', hosts, options, Time.now, :slow )
|
106
|
-
tsr = ts.instance_variable_get( :@test_suite_results )
|
107
|
-
allow( tsr ).to receive(:write_junit_xml).and_return( true )
|
108
|
-
allow( tsr ).to receive(:summarize).and_return( true )
|
109
|
-
|
110
|
-
ts.run
|
111
|
-
expect( tsr.errored_tests ).to be === 1
|
112
|
-
expect( tsr.failed_tests ).to be === 1
|
113
|
-
expect( tsr.test_count ).to be === 3
|
114
|
-
expect( tsr.passed_tests).to be === 1
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
describe TestSuite::TestSuiteResult do
|
119
|
-
let( :options ) { make_opts.merge({ :logger => double().as_null_object }) }
|
120
|
-
let( :hosts ) { make_hosts() }
|
121
|
-
let( :testcase1 ) { Beaker::Runner::Native::TestCase.new( hosts, options[:logger], options) }
|
122
|
-
let( :testcase2 ) { Beaker::Runner::Native::TestCase.new( hosts, options[:logger], options) }
|
123
|
-
let( :testcase3 ) { Beaker::Runner::Native::TestCase.new( hosts, options[:logger], options) }
|
124
|
-
let( :test_suite_result ) { TestSuite::TestSuiteResult.new( options, "my_suite") }
|
125
|
-
|
126
|
-
it 'supports adding test cases' do
|
127
|
-
expect( test_suite_result.test_count ).to be === 0
|
128
|
-
test_suite_result.add_test_case( testcase1 )
|
129
|
-
expect( test_suite_result.test_count ).to be === 1
|
130
|
-
end
|
131
|
-
|
132
|
-
it 'calculates passed tests' do
|
133
|
-
testcase1.instance_variable_set(:@test_status, :pass)
|
134
|
-
testcase2.instance_variable_set(:@test_status, :pass)
|
135
|
-
testcase3.instance_variable_set(:@test_status, :fail)
|
136
|
-
test_suite_result.add_test_case( testcase1 )
|
137
|
-
test_suite_result.add_test_case( testcase2 )
|
138
|
-
test_suite_result.add_test_case( testcase3 )
|
139
|
-
expect( test_suite_result.passed_tests ).to be == 2
|
140
|
-
end
|
141
|
-
|
142
|
-
it 'calculates failed tests' do
|
143
|
-
testcase1.instance_variable_set(:@test_status, :pass)
|
144
|
-
testcase2.instance_variable_set(:@test_status, :pass)
|
145
|
-
testcase3.instance_variable_set(:@test_status, :fail)
|
146
|
-
test_suite_result.add_test_case( testcase1 )
|
147
|
-
test_suite_result.add_test_case( testcase2 )
|
148
|
-
test_suite_result.add_test_case( testcase3 )
|
149
|
-
expect( test_suite_result.failed_tests ).to be == 1
|
150
|
-
end
|
151
|
-
|
152
|
-
it 'calculates errored tests' do
|
153
|
-
testcase1.instance_variable_set(:@test_status, :error)
|
154
|
-
testcase2.instance_variable_set(:@test_status, :pass)
|
155
|
-
testcase3.instance_variable_set(:@test_status, :fail)
|
156
|
-
test_suite_result.add_test_case( testcase1 )
|
157
|
-
test_suite_result.add_test_case( testcase2 )
|
158
|
-
test_suite_result.add_test_case( testcase3 )
|
159
|
-
expect( test_suite_result.errored_tests ).to be == 1
|
160
|
-
end
|
161
|
-
|
162
|
-
it 'calculates skipped tests' do
|
163
|
-
testcase1.instance_variable_set(:@test_status, :error)
|
164
|
-
testcase2.instance_variable_set(:@test_status, :skip)
|
165
|
-
testcase3.instance_variable_set(:@test_status, :fail)
|
166
|
-
test_suite_result.add_test_case( testcase1 )
|
167
|
-
test_suite_result.add_test_case( testcase2 )
|
168
|
-
test_suite_result.add_test_case( testcase3 )
|
169
|
-
expect( test_suite_result.skipped_tests ).to be == 1
|
170
|
-
end
|
171
|
-
|
172
|
-
it 'calculates pending tests' do
|
173
|
-
testcase1.instance_variable_set(:@test_status, :error)
|
174
|
-
testcase2.instance_variable_set(:@test_status, :pending)
|
175
|
-
testcase3.instance_variable_set(:@test_status, :fail)
|
176
|
-
test_suite_result.add_test_case( testcase1 )
|
177
|
-
test_suite_result.add_test_case( testcase2 )
|
178
|
-
test_suite_result.add_test_case( testcase3 )
|
179
|
-
expect( test_suite_result.pending_tests ).to be == 1
|
180
|
-
end
|
181
|
-
|
182
|
-
it 'calculates sum_failed as a sum of errored and failed TestCases' do
|
183
|
-
testcase1.instance_variable_set(:@test_status, :error)
|
184
|
-
testcase2.instance_variable_set(:@test_status, :pending)
|
185
|
-
testcase3.instance_variable_set(:@test_status, :fail)
|
186
|
-
test_suite_result.add_test_case( testcase1 )
|
187
|
-
test_suite_result.add_test_case( testcase2 )
|
188
|
-
test_suite_result.add_test_case( testcase3 )
|
189
|
-
expect( test_suite_result.sum_failed ).to be == 2
|
190
|
-
end
|
191
|
-
|
192
|
-
it 'reports success with no errors/failures' do
|
193
|
-
testcase1.instance_variable_set(:@test_status, :pass)
|
194
|
-
testcase2.instance_variable_set(:@test_status, :pending)
|
195
|
-
testcase3.instance_variable_set(:@test_status, :fail)
|
196
|
-
test_suite_result.add_test_case( testcase1 )
|
197
|
-
test_suite_result.add_test_case( testcase2 )
|
198
|
-
test_suite_result.add_test_case( testcase3 )
|
199
|
-
expect( test_suite_result.success? ).to be == false
|
200
|
-
end
|
201
|
-
|
202
|
-
it 'reports failed if any tests error/fail' do
|
203
|
-
testcase1.instance_variable_set(:@test_status, :pass)
|
204
|
-
testcase2.instance_variable_set(:@test_status, :pending)
|
205
|
-
testcase3.instance_variable_set(:@test_status, :fail)
|
206
|
-
test_suite_result.add_test_case( testcase1 )
|
207
|
-
test_suite_result.add_test_case( testcase2 )
|
208
|
-
test_suite_result.add_test_case( testcase3 )
|
209
|
-
expect( test_suite_result.failed? ).to be == true
|
210
|
-
end
|
211
|
-
|
212
|
-
it 'can calculate the sum of all TestCase runtimes' do
|
213
|
-
testcase1.instance_variable_set(:@runtime, 1)
|
214
|
-
testcase2.instance_variable_set(:@runtime, 10)
|
215
|
-
testcase3.instance_variable_set(:@runtime, 100)
|
216
|
-
test_suite_result.add_test_case( testcase1 )
|
217
|
-
test_suite_result.add_test_case( testcase2 )
|
218
|
-
test_suite_result.add_test_case( testcase3 )
|
219
|
-
expect( test_suite_result.elapsed_time ).to be == 111
|
220
|
-
end
|
221
|
-
|
222
|
-
describe '#write_junit_xml' do
|
223
|
-
let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(@files), :log_dated_dir => '.', :xml_dated_dir => '.'}) }
|
224
|
-
let(:rb_test) { 'my_ruby_file.rb' }
|
225
|
-
|
226
|
-
it 'doesn\'t re-order test cases themselves on time_sort' do
|
227
|
-
nokogiri_mock = Hash.new
|
228
|
-
allow( nokogiri_mock ).to receive( :add_child )
|
229
|
-
allow( Nokogiri::XML::Node ).to receive( :new ) { nokogiri_mock }
|
230
|
-
allow( LoggerJunit ).to receive( :write_xml ).and_yield( Object.new, nokogiri_mock )
|
231
|
-
|
232
|
-
@files = [ rb_test, rb_test, rb_test]
|
233
|
-
ts = Beaker::Runner::Native::TestSuite.new( 'name', hosts, options, Time.now, :fast )
|
234
|
-
tsr = ts.instance_variable_get( :@test_suite_results )
|
235
|
-
|
236
|
-
allow( tsr ).to receive( :start_time ).and_return(0)
|
237
|
-
allow( tsr ).to receive( :stop_time ).and_return(10)
|
238
|
-
expect( tsr.instance_variable_get( :@logger ) ).to receive( :error ).never
|
239
|
-
|
240
|
-
test_cases = []
|
241
|
-
3.times do
|
242
|
-
tc = Beaker::Runner::Native::TestCase.new( hosts, options[:logger], options, rb_test)
|
243
|
-
allow( tc ).to receive( :sublog ).and_return( false )
|
244
|
-
test_cases << tc
|
245
|
-
end
|
246
|
-
test_cases[0].instance_variable_set(:@runtime, 3)
|
247
|
-
test_cases[1].instance_variable_set(:@runtime, 301)
|
248
|
-
test_cases[2].instance_variable_set(:@runtime, 101)
|
249
|
-
test_cases.map { |tc| tsr.add_test_case( tc ) }
|
250
|
-
|
251
|
-
original_testcase_order = test_suite_result.instance_variable_get( :@test_cases ).dup
|
252
|
-
tsr.write_junit_xml( 'fakeFilePath07', 'fakeFileToLink09', true )
|
253
|
-
after_testcase_order = test_suite_result.instance_variable_get( :@test_cases ).dup
|
254
|
-
expect( after_testcase_order ).to be === original_testcase_order
|
255
|
-
end
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
describe '#log_path' do
|
260
|
-
let( :sh_test ) { '/my_shell_file.sh' }
|
261
|
-
let( :files ) { @files ? @files : [sh_test] }
|
262
|
-
let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(files) }) }
|
263
|
-
let( :hosts ) { make_hosts() }
|
264
|
-
let( :testsuite ) { Beaker::Runner::Native::TestSuite.new( 'name', hosts, options, Time.now, :stop ) }
|
265
|
-
|
266
|
-
it 'returns the simple joining of the log dir & file as required' do
|
267
|
-
expect(testsuite.log_path('foo.txt', 'man/date')).to be === 'man/date/foo.txt'
|
268
|
-
end
|
269
|
-
|
270
|
-
describe 'builds the base directory correctly' do
|
271
|
-
# the base directory is where the latest symlink itself should live
|
272
|
-
it 'in the usual case' do
|
273
|
-
expect( File.symlink?('man/latest') ).to be_falsy
|
274
|
-
testsuite.log_path('foo.txt', 'man/date')
|
275
|
-
expect( File.symlink?('man/latest') ).to be_truthy
|
276
|
-
end
|
277
|
-
|
278
|
-
it 'if given a nested directory' do
|
279
|
-
expect( File.symlink?('a/latest') ).to be_falsy
|
280
|
-
testsuite.log_path('foo.txt', 'a/b/c/d/e/f')
|
281
|
-
expect( File.symlink?('a/latest') ).to be_truthy
|
282
|
-
end
|
283
|
-
end
|
284
|
-
|
285
|
-
describe 'builds the symlink directory correctly' do
|
286
|
-
# the symlink directory is where the symlink points to
|
287
|
-
it 'in the usual case' do
|
288
|
-
expect( File.symlink?('d/latest') ).to be_falsy
|
289
|
-
testsuite.log_path('foo.txt', 'd/e')
|
290
|
-
expect( File.readlink('d/latest') ).to be === 'e'
|
291
|
-
end
|
292
|
-
|
293
|
-
it 'if given a nested directory' do
|
294
|
-
expect( File.symlink?('f/latest') ).to be_falsy
|
295
|
-
testsuite.log_path('foo.txt', 'f/g/h/i/j/k')
|
296
|
-
expect( File.readlink('f/latest') ).to be === 'g/h/i/j/k'
|
297
|
-
end
|
298
|
-
end
|
299
|
-
end
|
300
|
-
end
|
301
|
-
end
|
302
|
-
end
|
303
|
-
end
|