12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
# File 'lib/covet/test_runners/minitest.rb', line 12
def self.hook_into_test_methods!
if @covet_hooked
warn "Warning - Covet.register_coverage_collection! called multiple times"
return
end
gem 'minitest'
require 'minitest'
::Minitest.after_run do
after_t = Time.now
diff_t = after_t - ::Minitest::Runnable.covet_start_time
time_taken = sprintf("%.2f", diff_t)
Covet.log_collection << ['stats', {
:time_taken => time_taken,
:files_filtered => CollectionFilter.files_filtered,
}]
if Covet::TestRunners::Minitest.create_collection_file_on_exit
Covet.log_collection.finish!
else
$stderr.puts "Covet: skipped writing to collection file"
end
end
::Minitest::Runnable.class_eval do
@@covet_run_num = 0
@@covet_skips = 0
@@covet_failures = 0
@@covet_start_time = nil
class << self
def covet_start_time
@@covet_start_time
end
alias :covet_old_run_one_method :run_one_method
def run_one_method(klass, method_name, reporter)
if @@covet_run_num == 0
@@covet_start_time = Time.now
base_coverage = CovetCoverage.peek_result
base_coverage = Covet.normalize_coverage_info(base_coverage)
if base_coverage.empty?
warn "Warning - covet is not properly set up, as it must be required " \
"before other libraries to work correctly.\nTry adding\n require 'covet'\n" \
"to the top of your test helper file."
end
Covet::BASE_COVERAGE.update base_coverage
Covet.log_collection << ['base', base_coverage, {
:version => Covet::VERSION,
:options => Covet.options,
:seed => Random::DEFAULT.seed,
}]
end
@@covet_run_num += 1
file = nil
begin
file = klass.instance_method(method_name).source_location[0]
rescue
warn "\nWarning - Skipping collecting test coverage for method #{klass}##{method_name}\n"
return
end
before = CovetCoverage.peek_result
before_t = Time.now
result = covet_old_run_one_method(klass, method_name, reporter)
after_t = Time.now
summary_reporter = result.first
skips = summary_reporter.results.select(&:skipped?).size
if @@covet_skips != skips
@@covet_skips = skips
@@covet_failures += 1
return result
end
failures = summary_reporter.results.select(&:failures).size
if @@covet_failures != failures
@@covet_failures = failures
return result
end
after = CovetCoverage.peek_result
before_orig = Covet.normalize_coverage_info(before)
if Covet::BASE_COVERAGE.any?
before = Covet.diff_coverages(Covet::BASE_COVERAGE, before_orig)
end
after_orig = Covet.normalize_coverage_info(after)
after = Covet.diff_coverages(before_orig, after_orig)
if @@covet_run_num > 1
if [:random_seeded, :ordered].include?(Covet.options[:test_order])
Covet::BASE_COVERAGE.update(after_orig)
end
end
if after == before
after = nil
end
Covet.log_collection << ["#{file}##{method_name}", after, {
:time => sprintf("%.2f", after_t - before_t),
}]
result
rescue Interrupt
Covet::TestRunners::Minitest.create_collection_file_on_exit = false
raise
end
end
end
@covet_hooked = true
end
|