Как убедиться, что каждый модульный тест Minitest проходит достаточно быстро? - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть большое количество модульных тестов (методов) Minitest, более 300. Все они занимают некоторое время, от нескольких миллисекунд до нескольких секунд. Некоторые из них время от времени вешают трубку. Я не могу понять, какой и когда.

Я хочу применить Timeout к каждому из них, чтобы удостовериться, что кто-нибудь потерпит неудачу, если это займет больше, скажем, 5 секунд. Это достижимо?

Например:

class FooTest < Minitest::Test
  def test_calculates_something
    # Something potentially too slow
  end
end

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете использовать загрузчик Minitest PLugin для загрузки плагина. Это, безусловно, самое чистое решение. Однако система плагинов не очень хорошо документирована.

К счастью, Адам Сандерсон написал статью о системе плагинов .

Лучшей новостью является то, что эта статья объясняет систему плагинов, написав пример плагина, который сообщает медленные тесты. Попробуйте minitest-snail , это, вероятно, почти то, что вы хотите.

С небольшими изменениями мы можем использовать Reporter, чтобы пометить тест как неудачный, если он слишком медленный, например, так (не проверено):

Файл minitest/snail_reporter.rb:

module Minitest
  class SnailReporter < Reporter
    attr_reader :max_duration

    def self.options
      @default_options ||= {
        :max_duration => 2
      }
    end

    def self.enable!(options = {})
      @enabled = true
      self.options.merge!(options)
    end

    def self.enabled?
      @enabled ||= false
    end

    def initialize(io = STDOUT, options = self.class.options)
      super
      @max_duration = options.fetch(:max_duration)
    end

    def record result
      @passed = result.time < max_duration
      slow_tests << result if !@passed
    end

    def passed?
      @passed
    end

    def report
      return if slow_tests.empty?

      slow_tests.sort_by!{|r| -r.time}

      io.puts
      io.puts "#{slow_tests.length} slow tests."
      slow_tests.each_with_index do |result, i|
        io.puts "%3d) %s: %.2f s" % [i+1, result.location, result.time]
      end
    end
  end
end

Файл minitest/snail_plugin.rb:

require_relative './snail_reporter'

module Minitest
  def self.plugin_snail_options(opts, options)
    opts.on "--max-duration TIME", "Report tests that take longer than TIME seconds." do |max_duration|
      SnailReporter.enable! :max_duration => max_duration.to_f
    end
  end

  def self.plugin_snail_init(options)
    if SnailReporter.enabled?
      io = options[:io]
      Minitest.reporter.reporters << SnailReporter.new(io)
    end
  end

end
...