top_tests 0.0.3 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2ee9095ac592d144455ac280f91819b3fa0886148f41af4f5c02b4e031ab6256
4
+ data.tar.gz: 9e3f02ba897f988c2f7868010368a4deb697ba2a2a218e077815174be4d727f4
5
+ SHA512:
6
+ metadata.gz: 44724156a8d2fdc6a6991121f07d3a93b2f3146e56ea35af9773e28105a7f3fb891f2baf9393a7329359f36e896a5d42c882f930ce7c9a3430195186a086f204
7
+ data.tar.gz: f6a5daaeff5d68d0b35f469ce89381d454e47b87044b5478a9b228c15208d8e86c928429499253098188157a933c6639428c3c41afec4b75f298e1521ecb9434
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source "http://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in top_tests.gemspec
4
4
  gemspec
5
+
6
+ gem 'minitest', '>= 5.10.2'
@@ -1,14 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- top_tests (0.0.1)
4
+ top_tests (0.0.6)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
8
8
  specs:
9
+ minitest (5.10.2)
9
10
 
10
11
  PLATFORMS
11
12
  ruby
12
13
 
13
14
  DEPENDENCIES
15
+ minitest (>= 5.10.2)
14
16
  top_tests!
17
+
18
+ BUNDLED WITH
19
+ 1.13.6
@@ -2,11 +2,33 @@
2
2
  Top tests displays your 10 slowest tests after execution. The goal is to help you
3
3
  keeping your tests fast.
4
4
 
5
- == How to setup top tests?
6
- First of all top tests works only with ActiveSupport::TestCase. Then require top
7
- tests and just include into your test class:
5
+ Moreover top tests can break your build if any test is taking longer than a specified duration.
8
6
 
9
- class ActiveSupport::TestCase
10
- include TopTests
7
+ == How to use it?
8
+ Add to your Gemfile.
9
+
10
+ group :test do
11
+ gem 'top_tests'
11
12
  end
12
13
 
14
+ Then run your test as usual and you will have a similar output:
15
+
16
+ Top 10 slowest tests:
17
+ 0.429 ApplicationControllerTest#test_notify_error
18
+ 0.322 HoneyBadgersControllerTest#test_show
19
+ 0.200 BearsControllerTest#test_destroy_collection
20
+ 0.134 SuricatsControllerTest#test_can_not_update
21
+ 0.124 SuricatsControllerTest#test_create
22
+ 0.105 SuricatsControllerTest#test_update
23
+ 0.096 HoneyBadgersControllerTest#test_create
24
+ 0.093 HoneyBadgersControllerTest#test_update
25
+ 0.091 SuricatsControllerTest#test_destroy
26
+ 0.090 HoneyBadgersControllerTest#test_show
27
+
28
+ Run your your with the option `--max-time=SECONDS` to break the tests that are slower than the specified time:
29
+
30
+ 3 tests are taking longer than 0.2 seconds:
31
+ 0.410 HoneyBadgerTest#test_fighting_a_cobra
32
+ 0.228 SuricatTest#test_caught_by_an_eagle
33
+ 0.203 HoneyBadgerTest#test_eating_larvae
34
+
@@ -0,0 +1,60 @@
1
+ module Minitest
2
+ def self.plugin_top_tests_init(options)
3
+ self.reporter << TopTestReporter.new(options)
4
+ end
5
+
6
+ def self.plugin_top_tests_options(opts, options)
7
+ opts.on "--max-time=ms", "Test fails if it exceeds specified time in seconds" do |max_time|
8
+ options[:max_time] = max_time.to_f
9
+ end
10
+ end
11
+
12
+ class TopTestReporter < AbstractReporter
13
+ attr_reader :results, :max_time
14
+
15
+ def initialize(options)
16
+ @results = []
17
+ @max_time = options[:max_time]
18
+ end
19
+
20
+ def record(result)
21
+ results << result
22
+ #result.refute(true, "Too long") if max_time && result.time > max_time
23
+ end
24
+
25
+ def passed?
26
+ slow_tests.empty?
27
+ end
28
+
29
+ def report
30
+ if slow_tests.empty?
31
+ puts "\nTop 10 slowest tests:\n#{format_tests(slowest_results[0,10])}"
32
+ else
33
+ print_slow_tests
34
+ end
35
+ end
36
+
37
+ def slowest_results
38
+ results.sort { |a, b| b.time <=> a.time }
39
+ end
40
+
41
+ def slow_tests
42
+ max_time ? results.find_all { |r| r.time > max_time } : []
43
+ end
44
+
45
+ def print_slow_tests
46
+ if !slow_tests.empty?
47
+ if slow_tests.size == 1
48
+ puts "\n1 test is taking longer than #{max_time} seconds:"
49
+ else
50
+ puts "\n3 tests are taking longer than #{max_time} seconds:"
51
+ end
52
+ puts format_tests(slow_tests)
53
+ end
54
+ end
55
+
56
+ def format_tests(tests)
57
+ tests.map { |t| " #{format("%7.3f", t.time)} #{t.klass}##{t.name}" }.join("\n")
58
+ end
59
+ end
60
+ end
@@ -7,23 +7,30 @@ module TopTests
7
7
  #####################
8
8
 
9
9
  def self.included(klass)
10
- klass.setup :start_timer
11
- klass.teardown :stop_timer
12
10
  klass.extend(ClassMethods)
13
- at_exit { at_exit { klass.at_exit_callback } }
11
+ if Minitest.respond_to?(:after_run)
12
+ Minitest.after_run { klass.after_all_tests }
13
+ else
14
+ MiniTest::Unit.after_tests { klass.after_all_tests } # Deprecated
15
+ end
14
16
  end
15
17
 
16
18
  ########################
17
19
  ### Instance methods ###
18
20
  ########################
19
21
 
20
- def start_timer
22
+ def before_setup
23
+ super
21
24
  @timer_started_at = Time.now
22
25
  end
23
26
 
24
- def stop_timer
25
- name = self.class.to_s + '#' + @__name__
26
- self.class.tests_durations << [name, Time.now - @timer_started_at]
27
+ def after_teardown
28
+ super
29
+ if @timer_started_at # Unset when a setup hook fails before top test.
30
+ # Instance variable @__name__ is used prior to minitest 5.
31
+ test_name = "#{self.class}##{@__name__ || name}"
32
+ self.class.tests_durations << [test_name, Time.now - @timer_started_at]
33
+ end
27
34
  end
28
35
 
29
36
  #####################
@@ -40,7 +47,7 @@ module TopTests
40
47
  end
41
48
 
42
49
  def max_duration
43
- @@max_duration
50
+ @@max_duration ||= nil
44
51
  end
45
52
 
46
53
  def top_tests
@@ -56,21 +63,25 @@ module TopTests
56
63
  end
57
64
 
58
65
  def print_top_tests
59
- puts "\nTop tests:"
66
+ puts "\nTop 10 slowest tests:"
60
67
  puts format_tests(top_tests.shift(10))
61
68
  puts
62
69
  end
63
70
 
64
71
  def check_tests_duration
65
72
  if !slow_tests.empty?
66
- puts "\nTEST?FAIL! #{slow_tests.count} test(s) are taking longer than #{max_duration} seconds:"
73
+ if slow_tests.size == 1
74
+ puts "\nTEST?FAIL! 1 test is taking longer than #{max_duration} seconds:"
75
+ else
76
+ puts "\nTEST?FAIL! #{slow_tests.count} tests are taking longer than #{max_duration} seconds:"
77
+ end
67
78
  puts format_tests(slow_tests)
68
79
  puts
69
80
  exit 1
70
81
  end
71
82
  end
72
83
 
73
- def at_exit_callback
84
+ def after_all_tests
74
85
  check_tests_duration
75
86
  print_top_tests
76
87
  end
@@ -1,8 +1,6 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  module TopTests
4
-
5
- VERSION = '0.0.3'.freeze
6
-
4
+ VERSION = '0.1.1'.freeze
7
5
  end
8
6
 
@@ -0,0 +1,10 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'minitest/autorun'
4
+ require 'top_tests'
5
+
6
+ class FailingTest < MiniTest::Unit::TestCase
7
+ def test_bad
8
+ assert(false)
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'minitest/autorun'
4
+ require 'top_tests'
5
+
6
+ class FastTest < MiniTest::Unit::TestCase
7
+ def test_good
8
+ sleep(0.499)
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'minitest/autorun'
4
+ require 'top_tests'
5
+
6
+ class SlowTest < MiniTest::Unit::TestCase
7
+ def test_good
8
+ sleep(0.5)
9
+ end
10
+
11
+ def test_bad
12
+ assert(true)
13
+ end
14
+ end
@@ -6,10 +6,10 @@ Gem::Specification.new do |s|
6
6
  s.name = 'top_tests'
7
7
  s.version = TopTests::VERSION.dup
8
8
  s.authors = ['Alexis Bernard']
9
- s.email = ['alexis@official.fm']
10
- s.homepage = 'https://github.com/officialfm/top_tests'
11
- s.summary = 'Top tests displays your 10 slowest tests after execution'
12
- s.description = 'Top tests displays your 10 slowest tests after execution'
9
+ s.email = ['alexis@bernard.io']
10
+ s.homepage = 'https://github.com/alexisbernard/top_tests'
11
+ s.summary = 'Top tests lists the 10 slowest tests after execution'
12
+ s.description = 'Top tests lists the 10 slowest tests after execution'
13
13
 
14
14
  s.files = `git ls-files`.split("\n")
15
15
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
metadata CHANGED
@@ -1,54 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: top_tests
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
5
- prerelease:
4
+ version: 0.1.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Alexis Bernard
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2011-12-12 00:00:00.000000000Z
11
+ date: 2020-06-09 00:00:00.000000000 Z
13
12
  dependencies: []
14
- description: Top tests displays your 10 slowest tests after execution
13
+ description: Top tests lists the 10 slowest tests after execution
15
14
  email:
16
- - alexis@official.fm
15
+ - alexis@bernard.io
17
16
  executables: []
18
17
  extensions: []
19
18
  extra_rdoc_files: []
20
19
  files:
21
- - .gitignore
20
+ - ".gitignore"
22
21
  - Gemfile
23
22
  - Gemfile.lock
24
23
  - LICENSE
25
24
  - README.rdoc
26
25
  - Rakefile
26
+ - lib/minitest/top_tests_plugin.rb
27
27
  - lib/top_tests.rb
28
28
  - lib/top_tests/version.rb
29
+ - test/failing_test.rb
30
+ - test/fast_test.rb
31
+ - test/slow_test.rb
29
32
  - top_tests.gemspec
30
- homepage: https://github.com/officialfm/top_tests
33
+ homepage: https://github.com/alexisbernard/top_tests
31
34
  licenses: []
35
+ metadata: {}
32
36
  post_install_message:
33
37
  rdoc_options: []
34
38
  require_paths:
35
39
  - lib
36
40
  required_ruby_version: !ruby/object:Gem::Requirement
37
- none: false
38
41
  requirements:
39
- - - ! '>='
42
+ - - ">="
40
43
  - !ruby/object:Gem::Version
41
44
  version: '0'
42
45
  required_rubygems_version: !ruby/object:Gem::Requirement
43
- none: false
44
46
  requirements:
45
- - - ! '>='
47
+ - - ">="
46
48
  - !ruby/object:Gem::Version
47
49
  version: '0'
48
50
  requirements: []
49
- rubyforge_project:
50
- rubygems_version: 1.8.10
51
+ rubygems_version: 3.0.3
51
52
  signing_key:
52
- specification_version: 3
53
- summary: Top tests displays your 10 slowest tests after execution
53
+ specification_version: 4
54
+ summary: Top tests lists the 10 slowest tests after execution
54
55
  test_files: []