benches 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +35 -18
- data/benches.gemspec +5 -2
- data/lib/benches/matchers/run.rb +37 -0
- data/lib/benches/matchers/run_in_less_than.rb +27 -0
- data/lib/benches/version.rb +1 -1
- data/lib/benches.rb +4 -3
- data/spec/matchers/run_spec.rb +13 -0
- metadata +51 -16
- data/bin/benchpress +0 -10
- data/lib/benches/dsl.rb +0 -9
- data/lib/benches/regimen.rb +0 -33
- data/lib/benches/routine.rb +0 -18
- data/spec/dsl_spec.rb +0 -5
- data/spec/routine_spec.rb +0 -63
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5283633dfb5c13e49a963c2ac09b027387441c9
|
4
|
+
data.tar.gz: b28b6003fd2a48648b364a9142e004f8a91404cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6643716c20ebb0178d298fe53fae8415f6fd68918fc139ead3342a23f8a72676bf70802197f8dcc030687629fe33bc1aa2742f4c4821dbab2c3c8405e5cbfb0
|
7
|
+
data.tar.gz: 021dfda72bcf425c84d68d0771e19afa58ef1eeab6af95083812c3b6b69a3b6ed0617765804d4165d9953a2d4fc32f5871a190983b6533b30ce52aea0c074556
|
data/README.md
CHANGED
@@ -1,35 +1,52 @@
|
|
1
1
|
# Benches
|
2
2
|
|
3
|
-
Benches defines a simple
|
3
|
+
Benches defines a simple rspec matcher that allows you to create benchmarking specs for your Ruby code.
|
4
4
|
|
5
|
-
##
|
5
|
+
## Usage
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
To include the matchers in your specs, set up your `spec_helper.rb` like so:
|
8
|
+
```ruby
|
9
|
+
require 'benches'
|
10
|
+
# other requirements
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.include Benches::Matchers
|
14
|
+
#other configuration code
|
15
|
+
end
|
16
|
+
```
|
17
|
+
|
18
|
+
The run_in_less_than matcher expects a block and checks if the block runs in less than a certain amount of time.
|
9
19
|
|
10
|
-
integer_regimen.rb
|
11
20
|
```ruby
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
21
|
+
describe Integer
|
22
|
+
describe 'to_s' do
|
23
|
+
it 'meets the performance metrics when running 1 time' do
|
24
|
+
expect{5.to_s}.to run_in_less_than(1.second)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
```
|
17
29
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
30
|
+
You can also specify that a block should run a certain number of times in less than a certain duration.
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
describe Integer do
|
34
|
+
describe 'to_s' do
|
35
|
+
it 'meets the performance metrics' do
|
36
|
+
expect{5.to_s}.to run(500).times_in_less_than(5.seconds)
|
37
|
+
end
|
38
|
+
end
|
22
39
|
end
|
23
40
|
```
|
24
41
|
|
25
|
-
|
26
|
-
be printed green, otherwise it will be printed red.
|
42
|
+
The duration specified should be an ActiveSupport::Duration object, like `5.seconds` or `1.hour`.
|
27
43
|
|
28
|
-
|
44
|
+
If the benchmark runs within the allotted time, the test will pass.
|
45
|
+
Otherwise it will fail.
|
29
46
|
|
30
47
|
## Testing
|
31
48
|
|
32
|
-
Simply run `rspec` to run the
|
49
|
+
Simply run `rspec` to run the sample spec.
|
33
50
|
|
34
51
|
## Credits
|
35
52
|
|
data/benches.gemspec
CHANGED
@@ -9,13 +9,16 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ["Evan Hemsley"]
|
10
10
|
s.email = ["evan.hemsley@gmail.com"]
|
11
11
|
s.homepage = 'http://github.com/ehemsley/benches'
|
12
|
-
s.summary = 'A simple
|
13
|
-
s.description = 'Benches defines a simple
|
12
|
+
s.summary = 'A simple rspec matcher for testing performance metrics'
|
13
|
+
s.description = 'Benches defines a simple rspec matcher that allows you to create benchmarking specs for your Ruby code.'
|
14
14
|
|
15
15
|
s.files = `git ls-files`.split("\n")
|
16
16
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
|
+
s.add_dependency 'rspec', '~> 2.14', '>= 2.14.1'
|
21
|
+
s.add_dependency 'activesupport', '~> 4.0', '>= 4.0.3'
|
22
|
+
|
20
23
|
s.license = 'MIT'
|
21
24
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Benches
|
2
|
+
module Matchers
|
3
|
+
|
4
|
+
RSpec::Matchers.define :run do |repetitions|
|
5
|
+
|
6
|
+
chain :time_in_less_than do |duration|
|
7
|
+
@duration = duration
|
8
|
+
end
|
9
|
+
|
10
|
+
chain :times_in_less_than do |duration|
|
11
|
+
@duration = duration
|
12
|
+
end
|
13
|
+
|
14
|
+
match do |actual|
|
15
|
+
Benchmark.measure do
|
16
|
+
repetitions.times do
|
17
|
+
actual.call
|
18
|
+
end
|
19
|
+
end.utime.seconds < @duration
|
20
|
+
end
|
21
|
+
|
22
|
+
failure_message_for_should do |actual|
|
23
|
+
"expected code to run in less than #{@duration.inspect}"
|
24
|
+
end
|
25
|
+
|
26
|
+
failure_message_for_should_not do |actual|
|
27
|
+
"expected code not to run in less than #{@duration.inspect} seconds"
|
28
|
+
end
|
29
|
+
|
30
|
+
description do
|
31
|
+
"run in less than #{@duration.inspect}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Benches
|
2
|
+
module Matchers
|
3
|
+
|
4
|
+
RSpec::Matchers.define :run_in_less_than do |duration|
|
5
|
+
|
6
|
+
match do |actual|
|
7
|
+
Benchmark.measure do
|
8
|
+
actual.call
|
9
|
+
end.utime.seconds < duration
|
10
|
+
end
|
11
|
+
|
12
|
+
failure_message_for_should do |actual|
|
13
|
+
"expected code to run in less than #{duration.inspect}"
|
14
|
+
end
|
15
|
+
|
16
|
+
failure_message_for_should_not do |actual|
|
17
|
+
"expected code not to run in less than #{duration.inspect} seconds"
|
18
|
+
end
|
19
|
+
|
20
|
+
description do
|
21
|
+
"run in less than #{duration.inspect}"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
data/lib/benches/version.rb
CHANGED
data/lib/benches.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Integer do
|
4
|
+
describe 'to_s' do
|
5
|
+
it 'meets the performance metrics when running 1 time' do
|
6
|
+
expect{5.to_s}.to run_in_less_than(1.second)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'meets the performance metrics when running 500 times' do
|
10
|
+
expect{5.to_s}.to run(500).times_in_less_than(5.seconds)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
metadata
CHANGED
@@ -1,21 +1,60 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: benches
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Hemsley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
11
|
+
date: 2014-03-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.14'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.14.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.14'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.14.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: activesupport
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '4.0'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 4.0.3
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '4.0'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 4.0.3
|
53
|
+
description: Benches defines a simple rspec matcher that allows you to create benchmarking
|
54
|
+
specs for your Ruby code.
|
15
55
|
email:
|
16
56
|
- evan.hemsley@gmail.com
|
17
|
-
executables:
|
18
|
-
- benchpress
|
57
|
+
executables: []
|
19
58
|
extensions: []
|
20
59
|
extra_rdoc_files: []
|
21
60
|
files:
|
@@ -23,15 +62,12 @@ files:
|
|
23
62
|
- Gemfile.lock
|
24
63
|
- README.md
|
25
64
|
- benches.gemspec
|
26
|
-
- bin/benchpress
|
27
65
|
- lib/benches.rb
|
28
|
-
- lib/benches/
|
29
|
-
- lib/benches/
|
30
|
-
- lib/benches/routine.rb
|
66
|
+
- lib/benches/matchers/run.rb
|
67
|
+
- lib/benches/matchers/run_in_less_than.rb
|
31
68
|
- lib/benches/version.rb
|
32
69
|
- license.md
|
33
|
-
- spec/
|
34
|
-
- spec/routine_spec.rb
|
70
|
+
- spec/matchers/run_spec.rb
|
35
71
|
- spec/spec_helper.rb
|
36
72
|
homepage: http://github.com/ehemsley/benches
|
37
73
|
licenses:
|
@@ -56,8 +92,7 @@ rubyforge_project:
|
|
56
92
|
rubygems_version: 2.2.2
|
57
93
|
signing_key:
|
58
94
|
specification_version: 4
|
59
|
-
summary: A simple
|
95
|
+
summary: A simple rspec matcher for testing performance metrics
|
60
96
|
test_files:
|
61
|
-
- spec/
|
62
|
-
- spec/routine_spec.rb
|
97
|
+
- spec/matchers/run_spec.rb
|
63
98
|
- spec/spec_helper.rb
|
data/bin/benchpress
DELETED
data/lib/benches/dsl.rb
DELETED
data/lib/benches/regimen.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'colorize'
|
2
|
-
|
3
|
-
module Benches
|
4
|
-
class Regimen
|
5
|
-
def initialize(subject)
|
6
|
-
@subject = subject
|
7
|
-
@inputs = []
|
8
|
-
end
|
9
|
-
|
10
|
-
def add_input(input, args)
|
11
|
-
@inputs << [input, args]
|
12
|
-
end
|
13
|
-
|
14
|
-
def call
|
15
|
-
puts @subject.to_s.blue
|
16
|
-
@inputs.each do |input|
|
17
|
-
input_string = input.first
|
18
|
-
args = input.last
|
19
|
-
routine(@subject, input_string, args) ? puts(" #{input_string}".green) : puts(" #{input_string}".red)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def routine(instance, input, args)
|
26
|
-
params = input.split(" ")
|
27
|
-
|
28
|
-
result = Benches::Routine.new(instance, params[3], params[0].to_i, *args).call
|
29
|
-
result.utime < params[7].to_f
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
data/lib/benches/routine.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
module Benches
|
2
|
-
class Routine
|
3
|
-
def initialize(instance, method, repetitions, *args)
|
4
|
-
@instance = instance
|
5
|
-
@method = method
|
6
|
-
@repetitions = repetitions
|
7
|
-
@args = args
|
8
|
-
end
|
9
|
-
|
10
|
-
def call
|
11
|
-
Benchmark.measure do
|
12
|
-
@repetitions.times do
|
13
|
-
@instance.send(@method, *@args)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
data/spec/dsl_spec.rb
DELETED
data/spec/routine_spec.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Benches::Routine do
|
4
|
-
describe 'initialize' do
|
5
|
-
context 'no method arguments' do
|
6
|
-
let(:bench) { Benches::Routine.new("test_string", 'split', 50000) }
|
7
|
-
|
8
|
-
it 'assigns instance correctly' do
|
9
|
-
expect(bench.instance_variable_get('@instance')).to eql 'test_string'
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'assigns method correctly' do
|
13
|
-
expect(bench.instance_variable_get('@method')).to eql 'split'
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'assigns repetitions correctly' do
|
17
|
-
expect(bench.instance_variable_get('@repetitions')).to eql 50000
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'sets args to empty array' do
|
21
|
-
expect(bench.instance_variable_get('@args')).to eql []
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'method has arguments' do
|
26
|
-
let(:bench) { Benches::Routine.new("test_string", 'insert', 50000, 1, 'a') }
|
27
|
-
|
28
|
-
it 'assigns instance correctly' do
|
29
|
-
expect(bench.instance_variable_get('@instance')).to eql 'test_string'
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'assigns method correctly' do
|
33
|
-
expect(bench.instance_variable_get('@method')).to eql 'insert'
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'assigns repetitions correctly' do
|
37
|
-
expect(bench.instance_variable_get('@repetitions')).to eql 50000
|
38
|
-
end
|
39
|
-
|
40
|
-
it' assigns args correctly' do
|
41
|
-
expect(bench.instance_variable_get('@args')).to eql [1, 'a']
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe 'call' do
|
47
|
-
context 'no method arguments' do
|
48
|
-
let(:bench) { Benches::Routine.new("test_string", 'split', 20) }
|
49
|
-
|
50
|
-
it 'performs benchmark' do
|
51
|
-
expect(bench.call).to be_a Benchmark::Tms
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
context 'method has arguments' do
|
56
|
-
let(:bench) { Benches::Routine.new("test_string", 'insert', 20, 1, 'a') }
|
57
|
-
|
58
|
-
it 'performs benchmark' do
|
59
|
-
expect(bench.call).to be_a Benchmark::Tms
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|