rspec-blame 0.1.2 → 0.2.0
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 +4 -4
- data/.rspec +4 -0
- data/Gemfile +1 -1
- data/README.md +102 -40
- data/lib/rspec/blame/configuration.rb +5 -0
- data/lib/rspec/blame.rb +95 -16
- data/rspec-blame.gemspec +2 -3
- data/spec/lib/rspec/blame/configuration_spec.rb +12 -0
- data/spec/lib/rspec/blame_spec.rb +138 -19
- data/spec/spec_helper.rb +6 -0
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b131572f2575e37af96e3ba1657f1cfbc78bc15
|
4
|
+
data.tar.gz: 2f16ccd3a4fc75fe14fe0ebff5e05d1b52dcfbf9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2dc22e8a4ef94d62291e9f4eb27359d1cdbdbe39ee6db6df78d7471aac1ccae15b83b52431c8b7f9ec7d5a14c086c6eb50ff76127ba477ed86c03bad4388ad6d
|
7
|
+
data.tar.gz: 7447dcebd308f8b797fcfb313f9dc7cbf1c0051db2c30486ebad56c15e5b1373992074be8a595433a607ab71fa14ac8c2d5ceacd6757336d5557d455a212d917
|
data/.rspec
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,66 +1,128 @@
|
|
1
1
|
# rspec-blame
|
2
2
|
|
3
|
-
rspec-blame provides a Blame RSpec
|
4
|
-
commit date for the slowest examples when profiling with RSpec in a **git** project.
|
3
|
+
rspec-blame provides a Blame RSpec formatter that outputs the author, commit hash, and
|
4
|
+
commit date for the slowest examples when profiling with RSpec in a **git** project. It
|
5
|
+
also allows a profile threshold to be set, only printing examples that exceed the threshold.
|
5
6
|
|
6
|
-
|
7
|
+
### Goals
|
7
8
|
|
8
|
-
|
9
|
+
In an application that has good test coverage and is managed by multiple people, tests are
|
10
|
+
constantly added and executed. Often, code that result in slow tests can make the development
|
11
|
+
process slow as well. To avoid this problem, this gem attempts to faciliate good practices
|
12
|
+
through accomplishing the following goals:
|
9
13
|
|
10
|
-
|
11
|
-
|
14
|
+
* Output the commit information of the slow tests, allowing the developer who last touched it
|
15
|
+
and who also has the most recent context to go back and optimize the code.
|
16
|
+
* Provide the ability to set a threshold of what are considered slow tests, reducing the noise
|
17
|
+
when profiling.
|
12
18
|
|
13
|
-
|
19
|
+
Happy testing!
|
14
20
|
|
15
|
-
|
21
|
+
### Example Output
|
16
22
|
|
17
|
-
|
23
|
+
```
|
24
|
+
................
|
25
|
+
|
26
|
+
Printing examples and example groups exceeding the profile threshold (0.000001 secs):
|
27
|
+
|
28
|
+
Slowest 10 examples finished in 0.0168 secs (77.0% of total time: 0.0219 secs).
|
29
|
+
Blame dump_profile_slowest_examples prints the number of examples to profile
|
30
|
+
0.0022 secs ./spec/lib/rspec/blame_spec.rb:28 Author: Braintree, Date: 2014-05-28, Hash: c8c20b05
|
31
|
+
Blame dump_profile_slowest_example_groups prints the average time taken for the slowest example groups
|
32
|
+
0.0021 secs ./spec/lib/rspec/blame_spec.rb:134 Author: dseeto, Date: 2014-07-25, Hash: 7612bbba
|
33
|
+
Blame dump_profile_slowest_examples does not print examples if execution time is under profile_threshold
|
34
|
+
0.0019 secs ./spec/lib/rspec/blame_spec.rb:80 Author: dseeto, Date: 2014-07-11, Hash: 8afdd0fc
|
35
|
+
Blame dump_profile_slowest_examples prints summary including author, commit, and date
|
36
|
+
0.0017 secs ./spec/lib/rspec/blame_spec.rb:73 Author: Braintree, Date: 2014-05-28, Hash: c8c20b05
|
37
|
+
Blame dump_profile_slowest_examples prints the example_group size if less than the number of examples to profile
|
38
|
+
0.0017 secs ./spec/lib/rspec/blame_spec.rb:35 Author: dseeto, Date: 2014-07-11, Hash: 8afdd0fc
|
39
|
+
Blame dump_profile_slowest_example_groups prints the name of the slowest example groups
|
40
|
+
0.0016 secs ./spec/lib/rspec/blame_spec.rb:141 Author: dseeto, Date: 2014-07-25, Hash: 7612bbba
|
41
|
+
Blame dump_profile_slowest_example_groups prints the path to test example group
|
42
|
+
0.0015 secs ./spec/lib/rspec/blame_spec.rb:149 Author: dseeto, Date: 2014-07-25, Hash: 7612bbba
|
43
|
+
Blame dump_profile_slowest_example_groups prints the number of example_groups to profile
|
44
|
+
0.0014 secs ./spec/lib/rspec/blame_spec.rb:119 Author: dseeto, Date: 2014-07-25, Hash: 7612bbba
|
45
|
+
Blame dump_profile_slowest_example_groups prints the number of example_groups if less than the number of examples to profile
|
46
|
+
0.0014 secs ./spec/lib/rspec/blame_spec.rb:126 Author: dseeto, Date: 2014-07-25, Hash: 7612bbba
|
47
|
+
Blame dump_profile_slowest_example_groups does not print examples if execution time is under profile_threshold
|
48
|
+
0.0014 secs ./spec/lib/rspec/blame_spec.rb:157 Author: dseeto, Date: 2014-07-25, Hash: 7612bbba
|
49
|
+
|
50
|
+
Slowest 2 example groups:
|
51
|
+
Blame
|
52
|
+
0.0016 secs avg ./spec/lib/rspec/blame_spec.rb Execution Time: 0.0217 secs, Examples: 14
|
53
|
+
RSpec::Core::Configuration
|
54
|
+
0.0001 secs avg ./spec/lib/rspec/blame/configuration_spec.rb Execution Time: 0.0002 secs, Examples: 2
|
55
|
+
|
56
|
+
Profiling finished in 0.0860 secs.
|
57
|
+
|
58
|
+
Finished in 0.02312 seconds
|
59
|
+
16 examples, 0 failures
|
60
|
+
```
|
18
61
|
|
19
|
-
|
20
|
-
require "rspec/blame"
|
21
|
-
require "rspec/core/rake_task"
|
62
|
+
### Usage
|
22
63
|
|
23
|
-
|
64
|
+
```
|
65
|
+
gem "rspec-blame"
|
24
66
|
```
|
25
67
|
|
26
|
-
|
68
|
+
After including the above line in your Gemfile and running `bundle install`, you may set a profile
|
69
|
+
threshold by adding the following to `spec/spec_herlper.rb`:
|
27
70
|
|
28
|
-
|
71
|
+
```
|
72
|
+
RSpec.configure do |config|
|
73
|
+
config.profile_threshold = 1
|
74
|
+
end
|
75
|
+
```
|
29
76
|
|
30
|
-
|
31
|
-
your spec_helper.rb:
|
77
|
+
and adding the following to your `.rspec` file:
|
32
78
|
|
33
|
-
```
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
79
|
+
```
|
80
|
+
--require "spec_helper"
|
81
|
+
```
|
82
|
+
|
83
|
+
There are several ways to use the formatter:
|
84
|
+
|
85
|
+
#### Command Line With Specific Spec Files
|
86
|
+
|
87
|
+
```
|
88
|
+
rspec -p -f Blame file_spec.rb
|
38
89
|
```
|
39
90
|
|
40
|
-
|
91
|
+
or
|
41
92
|
|
42
93
|
```
|
43
|
-
|
94
|
+
rspec --profile --format Blame file_spec.rb
|
95
|
+
```
|
96
|
+
|
97
|
+
#### Rake Task
|
98
|
+
|
99
|
+
```
|
100
|
+
require "rspec/core/rake_task"
|
101
|
+
|
102
|
+
RSpec::Core::RakeTask.new(:spec) { |t| t.rspec_opts = "-p -f Blame" }
|
103
|
+
```
|
104
|
+
|
105
|
+
#### Any Usage of RSpec
|
44
106
|
|
45
|
-
|
46
|
-
Blame dump_profile_slowest_examples prints the number of examples to profile
|
47
|
-
0.0016 secs ./spec/lib/rspec/blame_spec.rb:21 Author: dseeto (i0r2i2s5), Date: 2014-05-28
|
48
|
-
Blame dump_profile_slowest_examples prints summary including author, commit, and date
|
49
|
-
0.0012 secs ./spec/lib/rspec/blame_spec.rb:42 Author: dseeto (i0r2i2s5), Date: 2014-05-28
|
50
|
-
Blame dump_profile_slowest_examples prints the time taken for the slowest tests
|
51
|
-
0.0012 secs ./spec/lib/rspec/blame_spec.rb:25 Author: dseeto (i0r2i2s5), Date: 2014-05-28
|
52
|
-
Blame dump_profile_slowest_examples prints the path to test example
|
53
|
-
0.0012 secs ./spec/lib/rspec/blame_spec.rb:37 Author: dseeto (i0r2i2s5), Date: 2014-05-28
|
54
|
-
Blame dump_profile_slowest_examples prints the percentage taken from the total time
|
55
|
-
0.0011 secs ./spec/lib/rspec/blame_spec.rb:33 Author: dseeto (i0r2i2s5), Date: 2014-05-28
|
56
|
-
Blame dump_profile_slowest_examples prints the name of the examples
|
57
|
-
0.0011 secs ./spec/lib/rspec/blame_spec.rb:29 Author: dseeto (i0r2i2s5), Date: 2014-05-28
|
107
|
+
Add the following to your `.rspec` file:
|
58
108
|
|
59
|
-
|
60
|
-
|
109
|
+
```
|
110
|
+
--profile
|
111
|
+
--format Blame
|
112
|
+
```
|
113
|
+
|
114
|
+
#### With Spec Helper
|
115
|
+
Add `require "spec_helper"` to any spec files and add the following to
|
116
|
+
your spec_helper.rb:
|
117
|
+
|
118
|
+
```
|
119
|
+
Rspec.configure do |config|
|
120
|
+
config.profile_examples = true
|
121
|
+
config.formatter = Blame
|
122
|
+
end
|
61
123
|
```
|
62
124
|
|
63
|
-
|
125
|
+
### Author
|
64
126
|
|
65
127
|
[David Seeto](https://github.com/dseeto)
|
66
128
|
|
data/lib/rspec/blame.rb
CHANGED
@@ -1,36 +1,53 @@
|
|
1
1
|
require "rspec/core/formatters/progress_formatter"
|
2
|
+
require "rspec/blame/configuration"
|
2
3
|
|
3
4
|
# Formatter that ouputs git blame details for the slowest examples.
|
4
5
|
class Blame < RSpec::Core::Formatters::ProgressFormatter
|
6
|
+
# Prints out profile results and profile threshold if set in RSpec.configuration.
|
7
|
+
def dump_profile
|
8
|
+
start = Time.now
|
9
|
+
_print_profile_threshold unless _profile_threshold.nil?
|
10
|
+
dump_profile_slowest_examples
|
11
|
+
dump_profile_slowest_example_groups
|
12
|
+
output.puts "\nProfiling finished in #{_format_seconds(Time.now - start)} secs."
|
13
|
+
end
|
14
|
+
|
15
|
+
def _print_profile_threshold
|
16
|
+
output.puts "\nPrinting examples and example groups exceeding the profile threshold (#{_format_seconds(_profile_threshold)} secs):"
|
17
|
+
end
|
18
|
+
|
5
19
|
# Appends to ProgressFormatter's output by executing git blame in a subprocess and parsing its output.
|
6
20
|
def dump_profile_slowest_examples
|
7
|
-
|
21
|
+
slowest_examples = _slowest_examples(examples)
|
8
22
|
|
9
|
-
|
23
|
+
return output.puts color("\nAll examples are faster than #{_format_seconds(_profile_threshold)} secs.", :green) if _profile_threshold && slowest_examples.empty?
|
10
24
|
|
11
|
-
|
25
|
+
_print_example_summary(slowest_examples)
|
12
26
|
slowest_examples.each do |example|
|
13
|
-
|
27
|
+
_print_example_details(example)
|
14
28
|
end
|
15
29
|
end
|
16
30
|
|
17
|
-
def
|
18
|
-
|
31
|
+
def _slowest_examples(examples)
|
32
|
+
slowest_examples = examples.sort_by(&_example_run_time).reverse.first(_number_of_examples_to_profile)
|
33
|
+
_profile_threshold ? slowest_examples.select { |example| _example_run_time.call(example) > _profile_threshold } : slowest_examples
|
34
|
+
end
|
35
|
+
|
36
|
+
def _print_example_summary(slowest_examples)
|
37
|
+
slowest_tests_time = _total_time(slowest_examples)
|
38
|
+
total_time = _total_time(examples)
|
19
39
|
formatted_percentage = '%.1f' % (slowest_tests_time / total_time * 100)
|
20
40
|
|
21
|
-
|
22
|
-
|
41
|
+
number_of_test = "\nSlowest #{pluralize(slowest_examples.size, "example")} "
|
42
|
+
slowest_total_time = "finished in #{_format_seconds(slowest_tests_time)} secs "
|
43
|
+
percent_and_total = "(#{formatted_percentage}% of total time: #{_format_seconds(total_time)} secs).\n"
|
23
44
|
|
24
|
-
|
25
|
-
lambda { |example| example.execution_result[:run_time] }
|
45
|
+
output.puts number_of_test + slowest_total_time + percent_and_total
|
26
46
|
end
|
27
47
|
|
28
|
-
def
|
48
|
+
def _print_example_details(example)
|
29
49
|
output.puts " #{example.full_description}"
|
30
|
-
output.print "
|
31
|
-
color("#{format_seconds(_example_run_time.call(example), 4)} secs".rjust(15, ' '), :red),
|
32
|
-
color(example.location.ljust(80, ' '), :yellow)
|
33
|
-
]
|
50
|
+
output.print "#{color(" #{_format_seconds(_example_run_time.call(example))} secs".ljust(19, ' '), :red)}" + " #{color(example.location.ljust(79, ' '), :yellow)}"
|
34
51
|
|
35
52
|
file, line_number = example.location.split(":")
|
36
53
|
git_blame_output = %x(git blame -c --date=short -L #{line_number},#{line_number} #{file})
|
@@ -39,8 +56,70 @@ class Blame < RSpec::Core::Formatters::ProgressFormatter
|
|
39
56
|
if blame.nil?
|
40
57
|
output.puts
|
41
58
|
else
|
42
|
-
commit_details = "Author: #{blame[:author].strip}
|
59
|
+
commit_details = " Author: #{blame[:author].strip}, Date: #{blame[:date]}, Hash: #{blame[:commit]}"
|
43
60
|
output.puts(color(commit_details.ljust(60, ' '), :cyan))
|
44
61
|
end
|
45
62
|
end
|
63
|
+
|
64
|
+
def _total_time(examples)
|
65
|
+
examples.map(&_example_run_time).inject { |sum, time| sum + time }
|
66
|
+
end
|
67
|
+
|
68
|
+
# Prints example group profiling result.
|
69
|
+
def dump_profile_slowest_example_groups
|
70
|
+
slowest_example_groups = _slowest_example_groups(examples)
|
71
|
+
|
72
|
+
return output.puts color("\nAll example groups are faster than #{_format_seconds(_profile_threshold)} secs.", :green) if _profile_threshold && slowest_example_groups.empty?
|
73
|
+
|
74
|
+
_print_example_group_summary(slowest_example_groups)
|
75
|
+
slowest_example_groups.each do |location, details|
|
76
|
+
_print_example_group_details(location, details)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def _slowest_example_groups(examples)
|
81
|
+
slowest_example_groups = {}
|
82
|
+
examples.each do |example|
|
83
|
+
location = example.example_group.parent_groups.last.metadata[:example_group][:location]
|
84
|
+
slowest_example_groups[location] ||= Hash.new(0)
|
85
|
+
slowest_example_groups[location][:total_time] += example.execution_result[:run_time]
|
86
|
+
slowest_example_groups[location][:count] += 1
|
87
|
+
slowest_example_groups[location][:description] = example.example_group.top_level_description unless slowest_example_groups[location].has_key?(:description)
|
88
|
+
end
|
89
|
+
slowest_example_groups.each { |location, details| details[:average] = details[:total_time].to_f / details[:count] }
|
90
|
+
|
91
|
+
sorted_example_groups = slowest_example_groups.sort_by { |location, details| details[:average] }.reverse.first(_number_of_examples_to_profile)
|
92
|
+
|
93
|
+
_profile_threshold ? sorted_example_groups.select { |location, details| details[:average] > _profile_threshold } : sorted_example_groups
|
94
|
+
end
|
95
|
+
|
96
|
+
def _print_example_group_summary(slowest_example_groups)
|
97
|
+
output.puts "\nSlowest #{pluralize(slowest_example_groups.size, "example group")}:"
|
98
|
+
end
|
99
|
+
|
100
|
+
def _print_example_group_details(location, details)
|
101
|
+
output.puts " #{details[:description]}"
|
102
|
+
|
103
|
+
average = color("#{_format_seconds(details[:average])} secs avg".ljust(15, " "), :red)
|
104
|
+
total = "#{_format_seconds(details[:total_time])} secs"
|
105
|
+
count = "#{details[:count]}"
|
106
|
+
calc = color(" Execution Time: #{total}, Examples: #{count}".ljust(60, " "), :cyan)
|
107
|
+
output.puts " #{average}" + " #{color(location.split(":")[0].ljust(79, ' '), :yellow)}" + calc
|
108
|
+
end
|
109
|
+
|
110
|
+
def _example_run_time
|
111
|
+
lambda { |example| example.execution_result[:run_time] }
|
112
|
+
end
|
113
|
+
|
114
|
+
def _number_of_examples_to_profile
|
115
|
+
RSpec.configuration.profile_examples
|
116
|
+
end
|
117
|
+
|
118
|
+
def _profile_threshold
|
119
|
+
RSpec.configuration.profile_threshold
|
120
|
+
end
|
121
|
+
|
122
|
+
def _format_seconds(float)
|
123
|
+
formatted = "%.#{float >= 1 ? 2 : 4}f" % float
|
124
|
+
end
|
46
125
|
end
|
data/rspec-blame.gemspec
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "rspec-blame"
|
3
|
-
s.version = "0.
|
4
|
-
s.date = "2014-05-23"
|
3
|
+
s.version = "0.2.0"
|
5
4
|
s.license = "MIT"
|
6
5
|
|
7
6
|
s.authors = ["David Seeto"]
|
@@ -9,7 +8,7 @@ Gem::Specification.new do |s|
|
|
9
8
|
s.homepage = "https://github.com/dseeto/rspec-blame"
|
10
9
|
|
11
10
|
s.summary = "Git blame when profiling your slowest RSpec examples."
|
12
|
-
s.description = %q{rspec-blame provides a Blame formatter that outputs git blame details for the slowest examples when profiling with RSpec.}
|
11
|
+
s.description = %q{rspec-blame provides a Blame formatter that outputs git blame details for the slowest examples above a profile threshold when profiling with RSpec.}
|
13
12
|
s.files = `git ls-files`.split("\n")
|
14
13
|
|
15
14
|
s.add_runtime_dependency "rspec-core", ["~> 2.14"]
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe RSpec::Core::Configuration do
|
4
|
+
it "adds profile_threshold as a customer setting" do
|
5
|
+
RSpec.configuration.respond_to?(:profile_threshold).should == true
|
6
|
+
end
|
7
|
+
|
8
|
+
it "sets the profile_threshold customer setting" do
|
9
|
+
RSpec.configuration.profile_threshold = 3
|
10
|
+
RSpec.configuration.profile_threshold.should == 3
|
11
|
+
end
|
12
|
+
end
|
@@ -1,46 +1,165 @@
|
|
1
1
|
require "spec_helper"
|
2
|
-
require "rspec"
|
3
|
-
require "rspec/blame"
|
4
2
|
|
5
3
|
describe Blame do
|
6
|
-
let(:output) { StringIO.new }
|
7
|
-
|
8
4
|
describe "dump_profile_slowest_examples" do
|
9
|
-
before
|
10
|
-
|
11
|
-
group = RSpec::Core::ExampleGroup.describe("group") { example("example") { sleep 0.001 } }
|
12
|
-
group.examples.each { |example| example.execution_result[:run_time] = 0.42 }
|
5
|
+
before(:each) {
|
6
|
+
@output = StringIO.new
|
13
7
|
|
14
|
-
|
15
|
-
|
16
|
-
|
8
|
+
@group = RSpec::Core::ExampleGroup.describe("group")
|
9
|
+
@fast_example = RSpec::Core::Example.new(@group, "fast example", @group.metadata).tap do |example|
|
10
|
+
example.execution_result[:run_time] = 0.1
|
11
|
+
end
|
12
|
+
@slower_example = RSpec::Core::Example.new(@group, "slower example", @group.metadata).tap do |example|
|
13
|
+
example.execution_result[:run_time] = 1
|
14
|
+
end
|
15
|
+
@slow_example = RSpec::Core::Example.new(@group, "slow example", @group.metadata).tap do |example|
|
16
|
+
example.execution_result[:run_time] = 10
|
17
|
+
end
|
18
|
+
@group.examples << @fast_example << @slower_example << @slow_example
|
17
19
|
|
18
|
-
formatter.
|
19
|
-
|
20
|
+
@formatter = Blame.new(@output).tap do |f|
|
21
|
+
f.stubs(:examples).returns(@group.examples)
|
22
|
+
f.stubs(:`).returns("i0r2i2s5 ( dseeto 2014-05-23 10)")
|
23
|
+
|
24
|
+
RSpec.configuration.profile_threshold = nil
|
25
|
+
end
|
26
|
+
}
|
20
27
|
|
21
28
|
it "prints the number of examples to profile" do
|
22
|
-
|
29
|
+
RSpec.configuration.stubs(:profile_examples).returns(2)
|
30
|
+
@formatter.dump_profile_slowest_examples
|
31
|
+
|
32
|
+
expect(@output.string).to include("Slowest 2 examples")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "prints the example_group size if less than the number of examples to profile" do
|
36
|
+
RSpec.configuration.stubs(:profile_examples).returns(10)
|
37
|
+
@formatter.dump_profile_slowest_examples
|
38
|
+
|
39
|
+
expected_output = "Slowest #{@group.examples.size} examples"
|
40
|
+
expect(@output.string).to include(expected_output)
|
23
41
|
end
|
24
42
|
|
25
43
|
it "prints the time taken for the slowest tests" do
|
26
|
-
|
44
|
+
RSpec.configuration.stubs(:profile_examples).returns(1)
|
45
|
+
@formatter.dump_profile_slowest_examples
|
46
|
+
|
47
|
+
expect(@output.string).to include("finished in #{@slow_example.execution_result[:run_time]}")
|
27
48
|
end
|
28
49
|
|
29
50
|
it "prints the name of the examples" do
|
30
|
-
|
51
|
+
RSpec.configuration.stubs(:profile_examples).returns(2)
|
52
|
+
@formatter.dump_profile_slowest_examples
|
53
|
+
|
54
|
+
expect(@output.string).to include("group #{@slow_example.description}")
|
55
|
+
expect(@output.string).to include("group #{@slower_example.description}")
|
31
56
|
end
|
32
57
|
|
33
58
|
it "prints the percentage taken from the total time" do
|
34
|
-
|
59
|
+
RSpec.configuration.stubs(:profile_examples).returns(3)
|
60
|
+
@formatter.dump_profile_slowest_examples
|
61
|
+
|
62
|
+
expect(@output.string).to include("100.0% of total time")
|
35
63
|
end
|
36
64
|
|
37
65
|
it "prints the path to test example" do
|
66
|
+
RSpec.configuration.stubs(:profile_examples).returns(1)
|
67
|
+
@formatter.dump_profile_slowest_examples
|
68
|
+
|
38
69
|
filename = __FILE__.split(File::SEPARATOR).last
|
39
|
-
expect(output.string).to
|
70
|
+
expect(@output.string).to include("#{filename}\:15")
|
40
71
|
end
|
41
72
|
|
42
73
|
it "prints summary including author, commit, and date" do
|
43
|
-
|
74
|
+
RSpec.configuration.stubs(:profile_examples).returns(1)
|
75
|
+
@formatter.dump_profile_slowest_examples
|
76
|
+
|
77
|
+
expect(@output.string).to match(/Author: .*, Date: .*, Hash:/)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "does not print examples if execution time is under profile_threshold" do
|
81
|
+
RSpec.configuration.stubs(:profile_examples).returns(10)
|
82
|
+
RSpec.configuration.profile_threshold = 5.00
|
83
|
+
@formatter.dump_profile_slowest_examples
|
84
|
+
|
85
|
+
expect(@output.string).to include("Slowest 1 example finished in #{@slow_example.execution_result[:run_time]}")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "dump_profile_slowest_example_groups" do
|
90
|
+
before(:each) {
|
91
|
+
@output = StringIO.new
|
92
|
+
|
93
|
+
@fast_group = RSpec::Core::ExampleGroup.describe("fast group")
|
94
|
+
@fast_example = RSpec::Core::Example.new(@fast_group, "fast example", @fast_group.metadata).tap do |example|
|
95
|
+
example.execution_result[:run_time] = 0.1
|
96
|
+
end
|
97
|
+
@fast_group.examples << @fast_example
|
98
|
+
|
99
|
+
@slower_group = RSpec::Core::ExampleGroup.describe("slower group")
|
100
|
+
@slower_example = RSpec::Core::Example.new(@slower_group, "slower example", @slower_group.metadata).tap do |example|
|
101
|
+
example.execution_result[:run_time] = 1
|
102
|
+
end
|
103
|
+
@slower_group.examples << @slower_example
|
104
|
+
|
105
|
+
@slow_group = RSpec::Core::ExampleGroup.describe("slow group")
|
106
|
+
@slow_example = RSpec::Core::Example.new(@slow_group, "slow example", @slow_group.metadata).tap do |example|
|
107
|
+
example.execution_result[:run_time] = 10
|
108
|
+
end
|
109
|
+
@slow_group.examples << @slow_example
|
110
|
+
|
111
|
+
@formatter = Blame.new(@output).tap do |f|
|
112
|
+
f.stubs(:examples).returns(@slow_group.examples.zip(@slower_group.examples, @fast_group.examples).flatten)
|
113
|
+
f.stubs(:`).returns("i0r2i2s5 ( dseeto 2014-05-23 10)")
|
114
|
+
|
115
|
+
RSpec.configuration.profile_threshold = nil
|
116
|
+
end
|
117
|
+
}
|
118
|
+
|
119
|
+
it "prints the number of example_groups to profile" do
|
120
|
+
RSpec.configuration.stubs(:profile_examples).returns(2)
|
121
|
+
@formatter.dump_profile_slowest_example_groups
|
122
|
+
|
123
|
+
expect(@output.string).to include("Slowest 2 example groups")
|
124
|
+
end
|
125
|
+
|
126
|
+
it "prints the number of example_groups if less than the number of examples to profile" do
|
127
|
+
RSpec.configuration.stubs(:profile_examples).returns(10)
|
128
|
+
@formatter.dump_profile_slowest_example_groups
|
129
|
+
|
130
|
+
expected_output = "Slowest #{@formatter.examples.size} example groups"
|
131
|
+
expect(@output.string).to include(expected_output)
|
132
|
+
end
|
133
|
+
|
134
|
+
it "prints the average time taken for the slowest example groups" do
|
135
|
+
RSpec.configuration.stubs(:profile_examples).returns(1)
|
136
|
+
@formatter.dump_profile_slowest_example_groups
|
137
|
+
|
138
|
+
expect(@output.string).to include("10.00 secs avg")
|
139
|
+
end
|
140
|
+
|
141
|
+
it "prints the name of the slowest example groups" do
|
142
|
+
RSpec.configuration.stubs(:profile_examples).returns(2)
|
143
|
+
@formatter.dump_profile_slowest_example_groups
|
144
|
+
|
145
|
+
expect(@output.string).to include("#{@slow_group.description}")
|
146
|
+
expect(@output.string).to include("#{@slower_group.description}")
|
147
|
+
end
|
148
|
+
|
149
|
+
it "prints the path to test example group" do
|
150
|
+
RSpec.configuration.stubs(:profile_examples).returns(1)
|
151
|
+
@formatter.dump_profile_slowest_example_groups
|
152
|
+
|
153
|
+
filename = __FILE__.split(File::SEPARATOR).last
|
154
|
+
expect(@output.string).to include("#{filename}")
|
155
|
+
end
|
156
|
+
|
157
|
+
it "does not print examples if execution time is under profile_threshold" do
|
158
|
+
RSpec.configuration.stubs(:profile_examples).returns(10)
|
159
|
+
RSpec.configuration.profile_threshold = 15.00
|
160
|
+
@formatter.dump_profile_slowest_example_groups
|
161
|
+
|
162
|
+
expect(@output.string).to include ("All example groups are faster than #{@formatter._format_seconds(RSpec.configuration.profile_threshold)} secs.")
|
44
163
|
end
|
45
164
|
end
|
46
165
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-blame
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Seeto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec-core
|
@@ -67,18 +67,21 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
description: rspec-blame provides a Blame formatter that outputs git blame details
|
70
|
-
for the slowest examples when profiling with RSpec.
|
70
|
+
for the slowest examples above a profile threshold when profiling with RSpec.
|
71
71
|
email: seeto.david@gmail.com
|
72
72
|
executables: []
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
76
|
- .gitignore
|
77
|
+
- .rspec
|
77
78
|
- Gemfile
|
78
79
|
- README.md
|
79
80
|
- Rakefile
|
80
81
|
- lib/rspec/blame.rb
|
82
|
+
- lib/rspec/blame/configuration.rb
|
81
83
|
- rspec-blame.gemspec
|
84
|
+
- spec/lib/rspec/blame/configuration_spec.rb
|
82
85
|
- spec/lib/rspec/blame_spec.rb
|
83
86
|
- spec/spec_helper.rb
|
84
87
|
homepage: https://github.com/dseeto/rspec-blame
|
@@ -101,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
104
|
version: '0'
|
102
105
|
requirements: []
|
103
106
|
rubyforge_project:
|
104
|
-
rubygems_version: 2.
|
107
|
+
rubygems_version: 2.0.14
|
105
108
|
signing_key:
|
106
109
|
specification_version: 4
|
107
110
|
summary: Git blame when profiling your slowest RSpec examples.
|