derailed_benchmarks 1.4.2 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,6 +3,19 @@
3
3
  require 'test_helper'
4
4
 
5
5
  class StatsFromDirTest < ActiveSupport::TestCase
6
+ test "empty files" do
7
+ Dir.mktmpdir do |dir|
8
+ dir = Pathname.new(dir)
9
+ branch_info = {}
10
+ branch_info["loser"] = { desc: "Old commit", time: Time.now, file: dir.join("loser"), name: "loser" }
11
+ branch_info["winner"] = { desc: "I am the new commit", time: Time.now + 1, file: dir.join("winner"), name: "winner" }
12
+ stats = DerailedBenchmarks::StatsFromDir.new(branch_info).call
13
+ io = StringIO.new
14
+ stats.call.banner(io: io) # Doesn't error
15
+ assert_equal "", io.read
16
+ end
17
+ end
18
+
6
19
  test "that it works" do
7
20
  dir = fixtures_dir("stats/significant")
8
21
  branch_info = {}
@@ -19,19 +32,57 @@ class StatsFromDirTest < ActiveSupport::TestCase
19
32
  assert_equal "loser", oldest.name
20
33
 
21
34
  assert_in_delta 0.26, stats.d_max, 0.01
22
- assert_in_delta 0.1730818382602285, stats.d_critical, 0.00001
35
+ assert_in_delta 0.2145966026289347, stats.d_critical, 0.00001
23
36
  assert_equal true, stats.significant?
24
37
 
25
- assert_equal "1.0062", stats.x_faster
26
- assert_equal "0.6131", stats.percent_faster
27
- end
38
+ format = DerailedBenchmarks::StatsFromDir::FORMAT
39
+ assert_equal "1.0062", format % stats.x_faster
40
+ assert_equal "0.6147", format % stats.percent_faster
28
41
 
29
- test "banner faster" do
42
+ assert_equal "11.3844", format % newest.median
43
+ end
44
+
45
+ test "histogram output" do
30
46
  dir = fixtures_dir("stats/significant")
31
47
  branch_info = {}
32
48
  branch_info["loser"] = { desc: "Old commit", time: Time.now, file: dir.join("loser.bench.txt"), name: "loser" }
33
49
  branch_info["winner"] = { desc: "I am the new commit", time: Time.now + 1, file: dir.join("winner.bench.txt"), name: "winner" }
34
50
  stats = DerailedBenchmarks::StatsFromDir.new(branch_info).call
51
+
52
+ io = StringIO.new
53
+ stats.call.banner(io)
54
+
55
+ assert_match(/11\.2 , 11\.28/, io.string)
56
+ assert_match(/11\.8 , 11\.88/, io.string)
57
+ end
58
+
59
+
60
+ test "alignment" do
61
+ dir = fixtures_dir("stats/significant")
62
+ branch_info = {}
63
+ branch_info["loser"] = { desc: "Old commit", time: Time.now, file: dir.join("loser.bench.txt"), name: "loser" }
64
+ branch_info["winner"] = { desc: "I am the new commit", time: Time.now + 1, file: dir.join("winner.bench.txt"), name: "winner" }
65
+ stats = DerailedBenchmarks::StatsFromDir.new(branch_info).call
66
+ def stats.percent_faster
67
+ -0.1
68
+ end
69
+
70
+ def stats.x_faster
71
+ 0.9922
72
+ end
73
+
74
+ assert_equal 1, stats.align.length
75
+ end
76
+
77
+ test "banner faster" do
78
+ dir = fixtures_dir("stats/significant")
79
+ Branch_info = {}
80
+
81
+ require 'ostruct'
82
+ commits = []
83
+ commits << OpenStruct.new({ desc: "Old commit", time: Time.now, file: dir.join("loser.bench.txt"), ref: "loser", short_sha: "aaaaa" })
84
+ commits << OpenStruct.new({ desc: "I am the new commit", time: Time.now + 1, file: dir.join("winner.bench.txt"), ref: "winner", short_sha: "bbbbb" })
85
+ stats = DerailedBenchmarks::StatsFromDir.new(commits).call
35
86
  newest = stats.newest
36
87
  oldest = stats.oldest
37
88
 
@@ -44,20 +95,20 @@ class StatsFromDirTest < ActiveSupport::TestCase
44
95
  "0.001"
45
96
  end
46
97
 
47
- def newest.average
98
+ def newest.median
48
99
  10.5
49
100
  end
50
101
 
51
- def oldest.average
102
+ def oldest.median
52
103
  11.0
53
104
  end
54
105
 
55
106
  expected = <<-EOM
56
- [winner] "I am the new commit" - (10.5 seconds)
57
- FASTER by:
107
+ [bbbbb] (10.5000 seconds) "I am the new commit" ref: "winner"
108
+ FASTER 🚀🚀🚀 by:
58
109
  1.0476x [older/newer]
59
110
  4.5455% [(older - newer) / older * 100]
60
- [loser] "Old commit" - (11.0 seconds)
111
+ [aaaaa] (11.0000 seconds) "Old commit" ref: "loser"
61
112
  EOM
62
113
 
63
114
  actual = StringIO.new
@@ -75,20 +126,20 @@ EOM
75
126
  newest = stats.newest
76
127
  oldest = stats.oldest
77
128
 
78
- def oldest.average
129
+ def oldest.median
79
130
  10.5
80
131
  end
81
132
 
82
- def newest.average
133
+ def newest.median
83
134
  11.0
84
135
  end
85
136
 
86
137
  expected = <<-EOM
87
- [loser] "I am the new commit" - (11.0 seconds)
88
- SLOWER by:
89
- 0.9545x [older/newer]
138
+ [loser] (11.0000 seconds) "I am the new commit" ref: "loser"
139
+ SLOWER 🐢🐢🐢 by:
140
+ 0.9545x [older/newer]
90
141
  -4.7619% [(older - newer) / older * 100]
91
- [winner] "Old commit" - (10.5 seconds)
142
+ [winner] (10.5000 seconds) "Old commit" ref: "winner"
92
143
  EOM
93
144
 
94
145
  actual = StringIO.new
@@ -1,4 +1,4 @@
1
1
  class ChildOne
2
- @retained = +""
2
+ @retained = String.new("")
3
3
  50_000.times.map { @retained << "A" }
4
4
  end
@@ -1,5 +1,5 @@
1
1
  class ChildTwo
2
- @retained = +""
2
+ @retained = String.new("")
3
3
  200_000.times.map { @retained << "A" }
4
4
  end
5
5
 
@@ -1,5 +1,5 @@
1
1
  class ParentOne
2
- @retained = +""
2
+ @retained = String.new("")
3
3
  1_000_000.times.map { @retained << "A" }
4
4
  end
5
5
  require File.expand_path('../child_one.rb', __FILE__)
@@ -13,27 +13,58 @@ class TasksTest < ActiveSupport::TestCase
13
13
  FileUtils.remove_entry_secure(rails_app_path('tmp'))
14
14
  end
15
15
 
16
+ def run!(cmd)
17
+ puts "Running: #{cmd}"
18
+ out = `#{cmd}`
19
+ raise "Could not run #{cmd}, output: #{out}" unless $?.success?
20
+ out
21
+ end
22
+
16
23
  def rake(cmd, options = {})
17
24
  assert_success = options.key?(:assert_success) ? options[:assert_success] : true
18
25
  env = options[:env] || {}
19
26
  env_string = env.map {|key, value| "#{key.shellescape}=#{value.to_s.shellescape}" }.join(" ")
20
27
  cmd = "env #{env_string} bundle exec rake -f perf.rake #{cmd} --trace"
21
28
  puts "Running: #{cmd}"
22
- result = `cd '#{rails_app_path}' && #{cmd}`
23
- if assert_success
24
- assert $?.success?, "Expected '#{cmd}' to return a success status.\nOutput: #{result}"
29
+ result = Bundler.with_original_env { `cd '#{rails_app_path}' && #{cmd} 2>&1` }
30
+ if assert_success && !$?.success?
31
+ puts result
32
+ raise "Expected '#{cmd}' to return a success status.\nOutput: #{result}"
25
33
  end
26
34
 
27
35
  result
28
36
  end
29
37
 
30
- test 'library_branches' do
38
+ test 'non-rails library with branch specified' do
39
+ skip unless ENV['USING_RAILS_WICKED_BRANCH']
40
+
41
+ gem_path = run!("bundle info wicked --path")
42
+ env = { "TEST_COUNT" => 10, "DERAILED_SCRIPT_COUNT" => 2, "DERAILED_PATH_TO_LIBRARY" => gem_path}
43
+ puts rake "perf:library", { env: env }
44
+ end
45
+
46
+ test 'rails perf:library from git' do
47
+ # BUNDLE_GEMFILE="$(pwd)/gemfiles/rails_git.gemfile" bundle exec m test/integration/tasks_test.rb:<linenumber>
48
+
31
49
  skip unless ENV['USING_RAILS_GIT']
32
50
 
33
- env = { "TEST_COUNT" => 10, "DERAILED_SCRIPT_COUNT" => 2, "SHAS_TO_TEST" => "3054e1d584e7eca110c69a1f8423f2e0866abbf9,80f989aecece1a2b1830e9c953e5887421b52d3c"}
51
+ env = { "TEST_COUNT" => 2, "DERAILED_SCRIPT_COUNT" => 2, "SHAS_TO_TEST" => "3054e1d584e7eca110c69a1f8423f2e0866abbf9,80f989aecece1a2b1830e9c953e5887421b52d3c"}
34
52
  puts rake "perf:library", { env: env }
35
53
  end
36
54
 
55
+ test "rails perf:library with bad script" do
56
+ # BUNDLE_GEMFILE="$(pwd)/gemfiles/rails_git.gemfile" bundle exec m test/integration/tasks_test.rb:<linenumber>
57
+
58
+ skip unless ENV['USING_RAILS_GIT']
59
+
60
+ error = assert_raises {
61
+ env = { "DERAILED_SCRIPT" => "nopenopenop", "TEST_COUNT" => 2, "DERAILED_SCRIPT_COUNT" => 2, "SHAS_TO_TEST" => "3054e1d584e7eca110c69a1f8423f2e0866abbf9,80f989aecece1a2b1830e9c953e5887421b52d3c"}
62
+ puts rake "perf:library", { env: env }
63
+ }
64
+
65
+ assert error.message =~ /nopenopenop:( command)? not found/, "Expected #{error.message} to include /nopenopenop: (command)? not found/ but it did not"
66
+ end
67
+
37
68
  test 'hitting authenticated devise apps' do
38
69
  env = { "PATH_TO_HIT" => "authenticated", "USE_AUTH" => "true", "TEST_COUNT" => "2" }
39
70
  result = rake 'perf:test', env: env
@@ -55,6 +86,13 @@ class TasksTest < ActiveSupport::TestCase
55
86
  rake "perf:test"
56
87
  end
57
88
 
89
+ test 'app' do
90
+ skip unless ENV['USING_RAILS_GIT']
91
+ run!("cd #{rails_app_path} && git init . && git add . && git commit -m first && git commit --allow-empty -m second")
92
+ env = { "TEST_COUNT" => 10, "DERAILED_SCRIPT_COUNT" => 2 }
93
+ puts rake "perf:app", { env: env }
94
+ end
95
+
58
96
  test 'TEST_COUNT' do
59
97
  result = rake "perf:test", env: { "TEST_COUNT" => 1 }
60
98
  assert_match "1 derailed requests", result
@@ -13,6 +13,8 @@ require 'devise'
13
13
 
14
14
  module Dummy
15
15
  class Application < Rails::Application
16
+ config.load_defaults Rails.version.to_f
17
+
16
18
  config.action_mailer.default_url_options = { host: 'localhost:3000' }
17
19
 
18
20
  # Settings in config/environments/* take precedence over those specified here.
@@ -63,3 +63,9 @@ end
63
63
  def rails_app_path(name = "")
64
64
  root_path("test/rails_app").join(name)
65
65
  end
66
+
67
+ def run!(cmd)
68
+ output = `#{cmd}`
69
+ raise "Cmd #{cmd} failed:\n#{output}" unless $?.success?
70
+ output
71
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: derailed_benchmarks
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Schneeman
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-11 00:00:00.000000000 Z
11
+ date: 2020-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: heapy
@@ -104,16 +104,22 @@ dependencies:
104
104
  name: thor
105
105
  requirement: !ruby/object:Gem::Requirement
106
106
  requirements:
107
- - - "~>"
107
+ - - ">="
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0.19'
110
+ - - "<"
111
+ - !ruby/object:Gem::Version
112
+ version: '2'
110
113
  type: :runtime
111
114
  prerelease: false
112
115
  version_requirements: !ruby/object:Gem::Requirement
113
116
  requirements:
114
- - - "~>"
117
+ - - ">="
115
118
  - !ruby/object:Gem::Version
116
119
  version: '0.19'
120
+ - - "<"
121
+ - !ruby/object:Gem::Version
122
+ version: '2'
117
123
  - !ruby/object:Gem::Dependency
118
124
  name: ruby-statistics
119
125
  requirement: !ruby/object:Gem::Requirement
@@ -128,6 +134,20 @@ dependencies:
128
134
  - - ">="
129
135
  - !ruby/object:Gem::Version
130
136
  version: '2.1'
137
+ - !ruby/object:Gem::Dependency
138
+ name: mini_histogram
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: 0.2.1
144
+ type: :runtime
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: 0.2.1
131
151
  - !ruby/object:Gem::Dependency
132
152
  name: capybara
133
153
  requirement: !ruby/object:Gem::Requirement
@@ -165,7 +185,7 @@ dependencies:
165
185
  version: '3'
166
186
  - - "<="
167
187
  - !ruby/object:Gem::Version
168
- version: '6'
188
+ version: '7'
169
189
  type: :development
170
190
  prerelease: false
171
191
  version_requirements: !ruby/object:Gem::Requirement
@@ -175,7 +195,7 @@ dependencies:
175
195
  version: '3'
176
196
  - - "<="
177
197
  - !ruby/object:Gem::Version
178
- version: '6'
198
+ version: '7'
179
199
  - !ruby/object:Gem::Dependency
180
200
  name: devise
181
201
  requirement: !ruby/object:Gem::Requirement
@@ -237,13 +257,18 @@ files:
237
257
  - lib/derailed_benchmarks/auth_helper.rb
238
258
  - lib/derailed_benchmarks/auth_helpers/devise.rb
239
259
  - lib/derailed_benchmarks/core_ext/kernel_require.rb
260
+ - lib/derailed_benchmarks/git/commit.rb
261
+ - lib/derailed_benchmarks/git/in_path.rb
262
+ - lib/derailed_benchmarks/git/switch_project.rb
263
+ - lib/derailed_benchmarks/git_switch_project.rb
240
264
  - lib/derailed_benchmarks/load_tasks.rb
241
265
  - lib/derailed_benchmarks/require_tree.rb
266
+ - lib/derailed_benchmarks/stats_for_file.rb
242
267
  - lib/derailed_benchmarks/stats_from_dir.rb
243
- - lib/derailed_benchmarks/stats_in_file.rb
244
268
  - lib/derailed_benchmarks/tasks.rb
245
269
  - lib/derailed_benchmarks/version.rb
246
270
  - test/derailed_benchmarks/core_ext/kernel_require_test.rb
271
+ - test/derailed_benchmarks/git_switch_project_test.rb
247
272
  - test/derailed_benchmarks/require_tree_test.rb
248
273
  - test/derailed_benchmarks/stats_from_dir_test.rb
249
274
  - test/derailed_test.rb
@@ -257,6 +282,7 @@ files:
257
282
  - test/fixtures/stats/significant/winner.bench.txt
258
283
  - test/integration/tasks_test.rb
259
284
  - test/rails_app/Rakefile
285
+ - test/rails_app/app/assets/config/manifest.js
260
286
  - test/rails_app/app/assets/javascripts/authenticated.js
261
287
  - test/rails_app/app/assets/stylesheets/authenticated.css
262
288
  - test/rails_app/app/controllers/application_controller.rb
@@ -307,7 +333,7 @@ homepage: https://github.com/schneems/derailed_benchmarks
307
333
  licenses:
308
334
  - MIT
309
335
  metadata: {}
310
- post_install_message:
336
+ post_install_message:
311
337
  rdoc_options: []
312
338
  require_paths:
313
339
  - lib
@@ -315,19 +341,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
315
341
  requirements:
316
342
  - - ">="
317
343
  - !ruby/object:Gem::Version
318
- version: 2.1.0
344
+ version: 2.2.0
319
345
  required_rubygems_version: !ruby/object:Gem::Requirement
320
346
  requirements:
321
347
  - - ">="
322
348
  - !ruby/object:Gem::Version
323
349
  version: '0'
324
350
  requirements: []
325
- rubygems_version: 3.0.3
326
- signing_key:
351
+ rubygems_version: 3.1.2
352
+ signing_key:
327
353
  specification_version: 4
328
354
  summary: Benchmarks designed to performance test your ENTIRE site
329
355
  test_files:
330
356
  - test/derailed_benchmarks/core_ext/kernel_require_test.rb
357
+ - test/derailed_benchmarks/git_switch_project_test.rb
331
358
  - test/derailed_benchmarks/require_tree_test.rb
332
359
  - test/derailed_benchmarks/stats_from_dir_test.rb
333
360
  - test/derailed_test.rb
@@ -341,6 +368,7 @@ test_files:
341
368
  - test/fixtures/stats/significant/winner.bench.txt
342
369
  - test/integration/tasks_test.rb
343
370
  - test/rails_app/Rakefile
371
+ - test/rails_app/app/assets/config/manifest.js
344
372
  - test/rails_app/app/assets/javascripts/authenticated.js
345
373
  - test/rails_app/app/assets/stylesheets/authenticated.css
346
374
  - test/rails_app/app/controllers/application_controller.rb