beaker 2.30.0 → 2.30.1
Sign up to get free protection for your applications and to get access to all the features.
- 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,410 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
require 'nokogiri'
|
3
|
-
require 'fileutils'
|
4
|
-
[ 'test_case', 'logger' ].each do |lib|
|
5
|
-
require "beaker/#{lib}"
|
6
|
-
end
|
7
|
-
|
8
|
-
module Beaker
|
9
|
-
module Runner
|
10
|
-
module Native
|
11
|
-
#A collection of {TestCase} objects are considered a {TestSuite}.
|
12
|
-
#Handles executing the set of {TestCase} instances and reporting results as post summary text and JUnit XML.
|
13
|
-
class TestSuite
|
14
|
-
|
15
|
-
#Holds the output of a test suite, formats in plain text or xml
|
16
|
-
class TestSuiteResult
|
17
|
-
attr_accessor :start_time, :stop_time, :total_tests
|
18
|
-
|
19
|
-
#Create a {TestSuiteResult} instance.
|
20
|
-
#@param [Hash{Symbol=>String}] options Options for this object
|
21
|
-
#@option options [Logger] :logger The Logger object to report information to
|
22
|
-
#@param [String] name The name of the {TestSuite} that the results are for
|
23
|
-
def initialize( options, name )
|
24
|
-
@options = options
|
25
|
-
@logger = options[:logger]
|
26
|
-
@name = name
|
27
|
-
@test_cases = []
|
28
|
-
#Set some defaults, just in case you attempt to print without including them
|
29
|
-
start_time = Time.at(0)
|
30
|
-
stop_time = Time.at(1)
|
31
|
-
end
|
32
|
-
|
33
|
-
#Add a {TestCase} to this {TestSuiteResult} instance, used in calculating {TestSuiteResult} data.
|
34
|
-
#@param [TestCase] test_case An individual, completed {TestCase} to be included in this set of {TestSuiteResult}.
|
35
|
-
def add_test_case( test_case )
|
36
|
-
@test_cases << test_case
|
37
|
-
end
|
38
|
-
|
39
|
-
#How many {TestCase} instances are in this {TestSuiteResult}
|
40
|
-
def test_count
|
41
|
-
@test_cases.length
|
42
|
-
end
|
43
|
-
|
44
|
-
#How many passed {TestCase} instances are in this {TestSuiteResult}
|
45
|
-
def passed_tests
|
46
|
-
@test_cases.select { |c| c.test_status == :pass }.length
|
47
|
-
end
|
48
|
-
|
49
|
-
#How many errored {TestCase} instances are in this {TestSuiteResult}
|
50
|
-
def errored_tests
|
51
|
-
@test_cases.select { |c| c.test_status == :error }.length
|
52
|
-
end
|
53
|
-
|
54
|
-
#How many failed {TestCase} instances are in this {TestSuiteResult}
|
55
|
-
def failed_tests
|
56
|
-
@test_cases.select { |c| c.test_status == :fail }.length
|
57
|
-
end
|
58
|
-
|
59
|
-
#How many skipped {TestCase} instances are in this {TestSuiteResult}
|
60
|
-
def skipped_tests
|
61
|
-
@test_cases.select { |c| c.test_status == :skip }.length
|
62
|
-
end
|
63
|
-
|
64
|
-
#How many pending {TestCase} instances are in this {TestSuiteResult}
|
65
|
-
def pending_tests
|
66
|
-
@test_cases.select {|c| c.test_status == :pending}.length
|
67
|
-
end
|
68
|
-
|
69
|
-
#How many {TestCase} instances failed in this {TestSuiteResult}
|
70
|
-
def sum_failed
|
71
|
-
failed_tests + errored_tests
|
72
|
-
end
|
73
|
-
|
74
|
-
#Did all the {TestCase} instances in this {TestSuiteResult} pass?
|
75
|
-
def success?
|
76
|
-
sum_failed == 0
|
77
|
-
end
|
78
|
-
|
79
|
-
#Did one or more {TestCase} instances in this {TestSuiteResult} fail?
|
80
|
-
def failed?
|
81
|
-
!success?
|
82
|
-
end
|
83
|
-
|
84
|
-
#The sum of all {TestCase} runtimes in this {TestSuiteResult}
|
85
|
-
def elapsed_time
|
86
|
-
@test_cases.inject(0.0) {|r, t| r + t.runtime.to_f }
|
87
|
-
end
|
88
|
-
|
89
|
-
#Plain text summay of test suite
|
90
|
-
#@param [Logger] summary_logger The logger we will print the summary to
|
91
|
-
def summarize(summary_logger)
|
92
|
-
|
93
|
-
summary_logger.notify <<-HEREDOC
|
94
|
-
Test Suite: #{@name} @ #{start_time}
|
95
|
-
|
96
|
-
- Host Configuration Summary -
|
97
|
-
HEREDOC
|
98
|
-
|
99
|
-
average_test_time = elapsed_time / test_count
|
100
|
-
|
101
|
-
summary_logger.notify %Q[
|
102
|
-
|
103
|
-
- Test Case Summary for suite '#{@name}' -
|
104
|
-
Total Suite Time: %.2f seconds
|
105
|
-
Average Test Time: %.2f seconds
|
106
|
-
Attempted: #{test_count}
|
107
|
-
Passed: #{passed_tests}
|
108
|
-
Failed: #{failed_tests}
|
109
|
-
Errored: #{errored_tests}
|
110
|
-
Skipped: #{skipped_tests}
|
111
|
-
Pending: #{pending_tests}
|
112
|
-
Total: #{@total_tests}
|
113
|
-
|
114
|
-
- Specific Test Case Status -
|
115
|
-
] % [elapsed_time, average_test_time]
|
116
|
-
|
117
|
-
grouped_summary = @test_cases.group_by{|test_case| test_case.test_status }
|
118
|
-
|
119
|
-
summary_logger.notify "Failed Tests Cases:"
|
120
|
-
(grouped_summary[:fail] || []).each do |test_case|
|
121
|
-
print_test_result(test_case)
|
122
|
-
end
|
123
|
-
|
124
|
-
summary_logger.notify "Errored Tests Cases:"
|
125
|
-
(grouped_summary[:error] || []).each do |test_case|
|
126
|
-
print_test_result(test_case)
|
127
|
-
end
|
128
|
-
|
129
|
-
summary_logger.notify "Skipped Tests Cases:"
|
130
|
-
(grouped_summary[:skip] || []).each do |test_case|
|
131
|
-
print_test_result(test_case)
|
132
|
-
end
|
133
|
-
|
134
|
-
summary_logger.notify "Pending Tests Cases:"
|
135
|
-
(grouped_summary[:pending] || []).each do |test_case|
|
136
|
-
print_test_result(test_case)
|
137
|
-
end
|
138
|
-
|
139
|
-
summary_logger.notify("\n\n")
|
140
|
-
end
|
141
|
-
|
142
|
-
#A convenience method for printing the results of a {TestCase}
|
143
|
-
#@param [TestCase] test_case The {TestCase} to examine and print results for
|
144
|
-
def print_test_result(test_case)
|
145
|
-
test_reported = if test_case.exception
|
146
|
-
"reported: #{test_case.exception.inspect}"
|
147
|
-
else
|
148
|
-
test_case.test_status
|
149
|
-
end
|
150
|
-
@logger.notify " Test Case #{test_case.path} #{test_reported}"
|
151
|
-
end
|
152
|
-
|
153
|
-
# Writes Junit XML of this {TestSuiteResult}
|
154
|
-
#
|
155
|
-
# @param [String] xml_file Path to the XML file (from Beaker's running directory)
|
156
|
-
# @param [String] file_to_link Path to the paired file that should be linked
|
157
|
-
# from this one (this is relative to the XML
|
158
|
-
# file itself, so it would just be the different
|
159
|
-
# file name if they're in the same directory)
|
160
|
-
# @param [Boolean] time_sort Whether the test results should be output in
|
161
|
-
# order of time spent in the test, or in the
|
162
|
-
# order of test execution (default)
|
163
|
-
#
|
164
|
-
# @return nil
|
165
|
-
# @api private
|
166
|
-
def write_junit_xml(xml_file, file_to_link = nil, time_sort = false)
|
167
|
-
stylesheet = File.join(@options[:project_root], @options[:xml_stylesheet])
|
168
|
-
|
169
|
-
begin
|
170
|
-
LoggerJunit.write_xml(xml_file, stylesheet) do |doc, suites|
|
171
|
-
|
172
|
-
meta_info = Nokogiri::XML::Node.new('meta_test_info', doc)
|
173
|
-
unless file_to_link.nil?
|
174
|
-
meta_info['page_active'] = time_sort ? 'performance' : 'execution'
|
175
|
-
meta_info['link_url'] = file_to_link
|
176
|
-
else
|
177
|
-
meta_info['page_active'] = 'no-links'
|
178
|
-
meta_info['link_url'] = ''
|
179
|
-
end
|
180
|
-
suites.add_child(meta_info)
|
181
|
-
|
182
|
-
suite = Nokogiri::XML::Node.new('testsuite', doc)
|
183
|
-
suite['name'] = @name
|
184
|
-
suite['tests'] = test_count
|
185
|
-
suite['errors'] = errored_tests
|
186
|
-
suite['failures'] = failed_tests
|
187
|
-
suite['skip'] = skipped_tests
|
188
|
-
suite['pending'] = pending_tests
|
189
|
-
suite['total'] = @total_tests
|
190
|
-
suite['time'] = "%f" % (stop_time - start_time)
|
191
|
-
properties = Nokogiri::XML::Node.new('properties', doc)
|
192
|
-
@options.each_pair do | name, value |
|
193
|
-
property = Nokogiri::XML::Node.new('property', doc)
|
194
|
-
property['name'] = name
|
195
|
-
property['value'] = value
|
196
|
-
properties.add_child(property)
|
197
|
-
end
|
198
|
-
suite.add_child(properties)
|
199
|
-
|
200
|
-
test_cases_to_report = @test_cases
|
201
|
-
test_cases_to_report = @test_cases.sort { |x,y| y.runtime <=> x.runtime } if time_sort
|
202
|
-
test_cases_to_report.each do |test|
|
203
|
-
item = Nokogiri::XML::Node.new('testcase', doc)
|
204
|
-
item['classname'] = File.dirname(test.path)
|
205
|
-
item['name'] = File.basename(test.path)
|
206
|
-
item['time'] = "%f" % test.runtime
|
207
|
-
|
208
|
-
# Did we fail? If so, report that.
|
209
|
-
# We need to remove the escape character from colorized text, the
|
210
|
-
# substitution of other entities is handled well by Rexml
|
211
|
-
if test.test_status == :fail || test.test_status == :error then
|
212
|
-
status = Nokogiri::XML::Node.new('failure', doc)
|
213
|
-
status['type'] = test.test_status.to_s
|
214
|
-
if test.exception then
|
215
|
-
status['message'] = test.exception.to_s.gsub(/\e/, '')
|
216
|
-
data = LoggerJunit.format_cdata(test.exception.backtrace.join('\n'))
|
217
|
-
status.add_child(status.document.create_cdata(data))
|
218
|
-
end
|
219
|
-
item.add_child(status)
|
220
|
-
end
|
221
|
-
|
222
|
-
if test.test_status == :skip
|
223
|
-
status = Nokogiri::XML::Node.new('skip', doc)
|
224
|
-
status['type'] = test.test_status.to_s
|
225
|
-
item.add_child(status)
|
226
|
-
end
|
227
|
-
|
228
|
-
if test.test_status == :pending
|
229
|
-
status = Nokogiri::XML::Node.new('pending', doc)
|
230
|
-
status['type'] = test.test_status.to_s
|
231
|
-
item.add_child(status)
|
232
|
-
end
|
233
|
-
|
234
|
-
if test.sublog then
|
235
|
-
stdout = Nokogiri::XML::Node.new('system-out', doc)
|
236
|
-
data = LoggerJunit.format_cdata(test.sublog)
|
237
|
-
stdout.add_child(stdout.document.create_cdata(data))
|
238
|
-
item.add_child(stdout)
|
239
|
-
end
|
240
|
-
|
241
|
-
if test.last_result and test.last_result.stderr and not test.last_result.stderr.empty? then
|
242
|
-
stderr = Nokogiri::XML::Node.new('system-err', doc)
|
243
|
-
data = LoggerJunit.format_cdata(test.last_result.stderr)
|
244
|
-
stderr.add_child(stderr.document.create_cdata(data))
|
245
|
-
item.add_child(stderr)
|
246
|
-
end
|
247
|
-
|
248
|
-
suite.add_child(item)
|
249
|
-
end
|
250
|
-
suites.add_child(suite)
|
251
|
-
end
|
252
|
-
rescue Exception => e
|
253
|
-
@logger.error "failure in XML output:\n#{e.to_s}\n" + e.backtrace.join("\n")
|
254
|
-
end
|
255
|
-
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
attr_reader :name, :options, :fail_mode
|
260
|
-
|
261
|
-
#Create {TestSuite} instance
|
262
|
-
#@param [String] name The name of the {TestSuite}
|
263
|
-
#@param [Array<Host>] hosts An Array of Hosts to act upon.
|
264
|
-
#@param [Hash{Symbol=>String}] options Options for this object
|
265
|
-
#@option options [Logger] :logger The Logger object to report information to
|
266
|
-
#@option options [String] :log_dir The directory where text run logs will be written
|
267
|
-
#@option options [String] :xml_dir The directory where JUnit XML file will be written
|
268
|
-
#@option options [String] :xml_file The name of the JUnit XML file to be written to
|
269
|
-
#@option options [String] :project_root The full path to the Beaker lib directory
|
270
|
-
#@option options [String] :xml_stylesheet The path to a stylesheet to be applied to the generated XML output
|
271
|
-
#@param [Symbol] fail_mode One of :slow, :fast
|
272
|
-
#@param [Time] timestamp Beaker execution start time
|
273
|
-
def initialize(name, hosts, options, timestamp, fail_mode=nil)
|
274
|
-
@logger = options[:logger]
|
275
|
-
@test_cases = []
|
276
|
-
@test_files = options[name]
|
277
|
-
@name = name.to_s.gsub(/\s+/, '-')
|
278
|
-
@hosts = hosts
|
279
|
-
@run = false
|
280
|
-
@options = options
|
281
|
-
@fail_mode = fail_mode || @options[:fail_mode] || :slow
|
282
|
-
@test_suite_results = TestSuiteResult.new(@options, name)
|
283
|
-
@timestamp = timestamp
|
284
|
-
|
285
|
-
report_and_raise(@logger, RuntimeError.new("#{@name}: no test files found..."), "TestSuite: initialize") if @test_files.empty?
|
286
|
-
|
287
|
-
rescue => e
|
288
|
-
report_and_raise(@logger, e, "TestSuite: initialize")
|
289
|
-
end
|
290
|
-
|
291
|
-
#Execute all the {TestCase} instances and then report the results as both plain text and xml. The text result
|
292
|
-
#is reported to a newly created run log.
|
293
|
-
#Execution is dependent upon the fail_mode. If mode is :fast then stop running any additional {TestCase} instances
|
294
|
-
#after first failure, if mode is :slow continue execution no matter what {TestCase} results are.
|
295
|
-
def run
|
296
|
-
@run = true
|
297
|
-
start_time = Time.now
|
298
|
-
|
299
|
-
#Create a run log for this TestSuite.
|
300
|
-
run_log = log_path("#{@name}-run.log", @options[:log_dated_dir])
|
301
|
-
@logger.add_destination(run_log)
|
302
|
-
|
303
|
-
# This is an awful hack to maintain backward compatibility until tests
|
304
|
-
# are ported to use logger. Still in use in PuppetDB tests
|
305
|
-
::Beaker.const_set(:Log, @logger) unless defined?( ::Beaker::Log )
|
306
|
-
|
307
|
-
@test_suite_results.start_time = start_time
|
308
|
-
@test_suite_results.total_tests = @test_files.length
|
309
|
-
|
310
|
-
@test_files.each do |test_file|
|
311
|
-
@logger.info "Begin #{test_file}"
|
312
|
-
start = Time.now
|
313
|
-
test_case = TestCase.new(@hosts, @logger, options, test_file).run_test
|
314
|
-
duration = Time.now - start
|
315
|
-
@test_suite_results.add_test_case(test_case)
|
316
|
-
@test_cases << test_case
|
317
|
-
|
318
|
-
state = test_case.test_status == :skip ? 'skipp' : test_case.test_status
|
319
|
-
msg = "#{test_file} #{state}ed in %.2f seconds" % duration.to_f
|
320
|
-
case test_case.test_status
|
321
|
-
when :pass
|
322
|
-
@logger.success msg
|
323
|
-
when :skip
|
324
|
-
@logger.warn msg
|
325
|
-
when :fail
|
326
|
-
@logger.error msg
|
327
|
-
break if @fail_mode.to_s !~ /slow/ #all failure modes except slow cause us to kick out early on failure
|
328
|
-
when :error
|
329
|
-
@logger.warn msg
|
330
|
-
break if @fail_mode.to_s !~ /slow/ #all failure modes except slow cause us to kick out early on failure
|
331
|
-
end
|
332
|
-
end
|
333
|
-
@test_suite_results.stop_time = Time.now
|
334
|
-
|
335
|
-
# REVISIT: This changes global state, breaking logging in any future runs
|
336
|
-
# of the suite – or, at least, making them highly confusing for anyone who
|
337
|
-
# has not studied the implementation in detail. --daniel 2011-03-14
|
338
|
-
@test_suite_results.summarize( Logger.new(log_path("#{name}-summary.txt", @options[:log_dated_dir]), STDOUT) )
|
339
|
-
|
340
|
-
junit_file_log = log_path(@options[:xml_file], @options[:xml_dated_dir])
|
341
|
-
if @options[:xml_time_enabled]
|
342
|
-
junit_file_time = log_path(@options[:xml_time], @options[:xml_dated_dir])
|
343
|
-
@test_suite_results.write_junit_xml( junit_file_log, @options[:xml_time] )
|
344
|
-
@test_suite_results.write_junit_xml( junit_file_time, @options[:xml_file], true )
|
345
|
-
else
|
346
|
-
@test_suite_results.write_junit_xml( junit_file_log )
|
347
|
-
end
|
348
|
-
#All done with this run, remove run log
|
349
|
-
@logger.remove_destination(run_log)
|
350
|
-
|
351
|
-
# Allow chaining operations...
|
352
|
-
return self
|
353
|
-
end
|
354
|
-
|
355
|
-
#Execute all the TestCases in this suite.
|
356
|
-
#This is a wrapper that catches any failures generated during TestSuite::run.
|
357
|
-
def run_and_raise_on_failure
|
358
|
-
begin
|
359
|
-
run
|
360
|
-
return self if @test_suite_results.success?
|
361
|
-
rescue => e
|
362
|
-
#failed during run
|
363
|
-
report_and_raise(@logger, e, "TestSuite :run_and_raise_on_failure")
|
364
|
-
else
|
365
|
-
#failed during test
|
366
|
-
report_and_raise(@logger, RuntimeError.new("Failed while running the #{name} suite"), "TestSuite: report_and_raise_on_failure")
|
367
|
-
end
|
368
|
-
end
|
369
|
-
|
370
|
-
# Gives a full file path for output to be written to, maintaining the latest symlink
|
371
|
-
# @param [String] name The file name that we want to write to.
|
372
|
-
# @param [String] log_dir The desired output directory.
|
373
|
-
# A symlink will be made from ./basedir/latest to that.
|
374
|
-
# @example
|
375
|
-
# log_path('output.txt', 'log/2014-06-02_16_31_22')
|
376
|
-
#
|
377
|
-
# This will create the structure:
|
378
|
-
#
|
379
|
-
# ./log/2014-06-02_16_31_22/output.txt
|
380
|
-
# ./log/latest -> 2014-06-02_16_31_22
|
381
|
-
#
|
382
|
-
# @example
|
383
|
-
# log_path('foo.log', 'log/man/date')
|
384
|
-
#
|
385
|
-
# This will create the structure:
|
386
|
-
#
|
387
|
-
# ./log/man/date/foo.log
|
388
|
-
# ./log/latest -> man/date
|
389
|
-
def log_path(name, log_dir)
|
390
|
-
FileUtils.mkdir_p(log_dir) unless File.directory?(log_dir)
|
391
|
-
|
392
|
-
base_dir = log_dir
|
393
|
-
link_dir = ''
|
394
|
-
while File.dirname(base_dir) != '.' do
|
395
|
-
link_dir = link_dir == '' ? File.basename(base_dir) : File.join(File.basename(base_dir), link_dir)
|
396
|
-
base_dir = File.dirname(base_dir)
|
397
|
-
end
|
398
|
-
|
399
|
-
latest = File.join(base_dir, "latest")
|
400
|
-
if !File.exist?(latest) or File.symlink?(latest) then
|
401
|
-
File.delete(latest) if File.exist?(latest) || File.symlink?(latest)
|
402
|
-
File.symlink(link_dir, latest)
|
403
|
-
end
|
404
|
-
|
405
|
-
File.join(log_dir, name)
|
406
|
-
end
|
407
|
-
end
|
408
|
-
end
|
409
|
-
end
|
410
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
# safely set values for ARGV in block, restoring original value on block leave
|
4
|
-
def with_ARGV(value, &block)
|
5
|
-
if defined? ARGV
|
6
|
-
defined_ARGV, old_ARGV = true, ARGV
|
7
|
-
Object.send(:remove_const, :ARGV)
|
8
|
-
else
|
9
|
-
defined_ARGV, old_ARGV = false, nil
|
10
|
-
end
|
11
|
-
|
12
|
-
Object.send(:const_set, :ARGV, value)
|
13
|
-
|
14
|
-
yield
|
15
|
-
ensure
|
16
|
-
Object.send(:remove_const, :ARGV)
|
17
|
-
Object.send(:const_set, :ARGV, old_ARGV) if defined_ARGV
|
18
|
-
end
|
19
|
-
|
20
|
-
describe "Beaker Options" do
|
21
|
-
let (:parser) { Beaker::Options::Parser.new }
|
22
|
-
|
23
|
-
it "defaults :runner to 'native'" do
|
24
|
-
with_ARGV([]) do
|
25
|
-
expect(parser.parse_args[:runner]).to be == "native"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
it "accepts :runner from command-line" do
|
30
|
-
with_ARGV(["--runner", "minitest"]) do
|
31
|
-
expect(parser.parse_args[:runner]).to be == "minitest"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,147 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Beaker
|
4
|
-
module Runner
|
5
|
-
module Native
|
6
|
-
describe TestCase do
|
7
|
-
let(:logger) { double('logger').as_null_object }
|
8
|
-
let(:path) { @path || '/tmp/nope' }
|
9
|
-
let(:testcase) { TestCase.new({}, logger, {}, path) }
|
10
|
-
|
11
|
-
context 'run_test' do
|
12
|
-
it 'defaults to test_status :pass on success' do
|
13
|
-
path = 'test.rb'
|
14
|
-
File.open(path, 'w') do |f|
|
15
|
-
f.write ""
|
16
|
-
end
|
17
|
-
@path = path
|
18
|
-
expect( testcase ).to_not receive( :log_and_fail_test )
|
19
|
-
testcase.run_test
|
20
|
-
status = testcase.instance_variable_get(:@test_status)
|
21
|
-
expect(status).to be === :pass
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'updates test_status to :skip on SkipTest' do
|
25
|
-
path = 'test.rb'
|
26
|
-
File.open(path, 'w') do |f|
|
27
|
-
f.write "raise SkipTest"
|
28
|
-
end
|
29
|
-
@path = path
|
30
|
-
expect( testcase ).to_not receive( :log_and_fail_test )
|
31
|
-
testcase.run_test
|
32
|
-
status = testcase.instance_variable_get(:@test_status)
|
33
|
-
expect(status).to be === :skip
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'updates test_status to :pending on PendingTest' do
|
37
|
-
path = 'test.rb'
|
38
|
-
File.open(path, 'w') do |f|
|
39
|
-
f.write "raise PendingTest"
|
40
|
-
end
|
41
|
-
@path = path
|
42
|
-
expect( testcase ).to_not receive( :log_and_fail_test )
|
43
|
-
testcase.run_test
|
44
|
-
status = testcase.instance_variable_get(:@test_status)
|
45
|
-
expect(status).to be === :pending
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'updates test_status to :fail on FailTest' do
|
49
|
-
path = 'test.rb'
|
50
|
-
File.open(path, 'w') do |f|
|
51
|
-
f.write "raise FailTest"
|
52
|
-
end
|
53
|
-
@path = path
|
54
|
-
expect( testcase ).to_not receive( :log_and_fail_test )
|
55
|
-
testcase.run_test
|
56
|
-
status = testcase.instance_variable_get(:@test_status)
|
57
|
-
expect(status).to be === :fail
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'correctly handles RuntimeError' do
|
61
|
-
path = 'test.rb'
|
62
|
-
File.open(path, 'w') do |f|
|
63
|
-
f.write "raise RuntimeError"
|
64
|
-
end
|
65
|
-
@path = path
|
66
|
-
expect( testcase ).to receive( :log_and_fail_test ).once.with(kind_of(RuntimeError))
|
67
|
-
testcase.run_test
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'correctly handles ScriptError' do
|
71
|
-
path = 'test.rb'
|
72
|
-
File.open(path, 'w') do |f|
|
73
|
-
f.write "raise ScriptError"
|
74
|
-
end
|
75
|
-
@path = path
|
76
|
-
expect( testcase ).to receive( :log_and_fail_test ).once.with(kind_of(ScriptError))
|
77
|
-
testcase.run_test
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'correctly handles Timeout::Error' do
|
81
|
-
path = 'test.rb'
|
82
|
-
File.open(path, 'w') do |f|
|
83
|
-
f.write "raise Timeout::Error"
|
84
|
-
end
|
85
|
-
@path = path
|
86
|
-
expect( testcase ).to receive( :log_and_fail_test ).once.with(kind_of(Timeout::Error))
|
87
|
-
testcase.run_test
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'correctly handles CommandFailure' do
|
91
|
-
path = 'test.rb'
|
92
|
-
File.open(path, 'w') do |f|
|
93
|
-
f.write "raise Host::CommandFailure"
|
94
|
-
end
|
95
|
-
@path = path
|
96
|
-
expect( testcase ).to receive( :log_and_fail_test ).once.with(kind_of(Host::CommandFailure))
|
97
|
-
testcase.run_test
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'records a test failure if an assertion fails in a teardown block' do
|
101
|
-
path = 'test.rb'
|
102
|
-
File.open(path, 'w') do |f|
|
103
|
-
f.write <<-EOF
|
104
|
-
teardown do
|
105
|
-
assert_equal(1, 2, 'Oh noes!')
|
106
|
-
end
|
107
|
-
EOF
|
108
|
-
end
|
109
|
-
@path = path
|
110
|
-
expect( testcase ).to receive( :log_and_fail_test ).once.with(kind_of(Minitest::Assertion))
|
111
|
-
testcase.run_test
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
context 'metadata' do
|
116
|
-
it 'sets the filename correctly from the path' do
|
117
|
-
answer = 'jacket'
|
118
|
-
path = "#{answer}.rb"
|
119
|
-
File.open(path, 'w') do |f|
|
120
|
-
f.write ""
|
121
|
-
end
|
122
|
-
@path = path
|
123
|
-
testcase.run_test
|
124
|
-
metadata = testcase.instance_variable_get(:@metadata)
|
125
|
-
expect(metadata[:case][:file_name]).to be === answer
|
126
|
-
end
|
127
|
-
|
128
|
-
it 'resets the step name' do
|
129
|
-
path = 'test.rb'
|
130
|
-
File.open(path, 'w') do |f|
|
131
|
-
f.write ""
|
132
|
-
end
|
133
|
-
@path = path
|
134
|
-
# we have to create a TestCase by hand, so that we can set old
|
135
|
-
tc = TestCase.new({}, logger, {}, path)
|
136
|
-
# metadata on it, so that we can test that it's being reset correctly
|
137
|
-
old_metadata = { :step => { :name => 'CharlieBrown' } }
|
138
|
-
tc.instance_variable_set(:@metadata, old_metadata)
|
139
|
-
tc.run_test
|
140
|
-
metadata = tc.instance_variable_get(:@metadata)
|
141
|
-
expect(metadata[:step][:name]).to be_nil
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|