Рубиновое покрытие кода без всех требований и определений методов? - PullRequest
0 голосов
/ 12 сентября 2018

При использовании очень простой simplecov установки, такой как

require 'simplecov'
SimpleCov.start

, я получаю множество «покрытия» для файлов и кода, которые на самом деле не были «выполнены» (в каком-то смысле, если бы меня волновало, когдаглядя на покрытие кода для конкретного теста) вообще с отдельным тестом, который я выполнял.

Например, все require, module, class, def, attr_accessor и т. д.помечены зеленым для всех файлов, которые были загружены в сформированном отчете о покрытии.Меня это не волнует, и я был бы рад, если бы эти файлы сообщали о 0% -ном покрытии, если в них не выполнялся «фактический код».

end, rescue и комментарии, например, считаются неактуальны и не помечены красным или зеленым в любых файлах.Мне бы хотелось подобное поведение для перечисленных выше методов.

Есть ли способ получить покрытие кода, которое действительно включает (и измеряет) фактические исполняемые строки кода, которые меня волнуют?


Обновление после первого ответа: пометка всего другого кода как «не релевантного» с помощью, например, # :nocov:, к сожалению, не вариант, так как это повлияет на тысячи файлов для каждого человекатестовый прогон.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

SimpleCov просто показывает вам, что собирает библиотека Cuberage в Ruby, и, как сказано в комментариях к вашему вопросу, эти вещи выполнены, но я тоже нахожу это разочаровывающим - я не хочу загруженный класс , но не используется, для покрытия 40%.

Мое решение состоит в том, чтобы удалить покрытие, которое происходит только в процессе загрузки. Мы используем Rails, поэтому мы начнем с загрузки каждого файла в приложении (это легко сделать в rails, есть конфигурация eager_load); сделать снимок освещения в то время; запустить набор тестов; затем, наконец, вычесть снимок из конечного результата перед выводом simplecov. Любая строка, покрытая ровно один раз в моментальном снимке загрузки и ровно один раз в конечном результате, удаляется.

Ниже приведен пользовательский форматировщик SimpleCov, который я недавно собрал вместе и который выполняет эту работу. Это что-то вроде хака, поскольку он портится с внутренним результирующим объектом гема, поэтому имейте в виду, что он может быть нестабильным для новых версий, но он работает для нас с текущим simplecov (0.16.1). Также обратите внимание, что, поскольку он использует Coverage.peek_result, для этого требуется Ruby 2.3 или более поздняя версия .

Используйте его, установив SimpleCovWithoutLoadingFormatter в качестве средства форматирования для simplecov, и в настройках набора тестов вызовите SimpleCovWithoutLoadingFormatter.take_load_snapshot сразу после загрузки каждый файл вашего приложения.

require 'simplecov'

class SimpleCovWithoutLoadingFormatter
  def self.take_load_snapshot
    @coverage_load_lines_mask = Coverage.peek_result
  end

  def self.coverage_load_lines_mask
    @coverage_load_lines_mask
  end

  def format(result)
    if self.class.coverage_load_lines_mask&.any?
      result_merge_count = result.command_name.split(',').count

      result.files.each do |source_file|
        _file, load_mask = self.class.coverage_load_lines_mask.detect { |file, _load_mask| file == source_file.filename }
        next unless load_mask

        source_file.coverage.each_with_index do |count, i|
          source_file.coverage[i] = nil if count&.positive? && count&.==(load_mask[i] * result_merge_count)
        end
      end
    end

    SimpleCov::Formatter::HTMLFormatter.new.format(result)
  end
end
0 голосов
/ 12 сентября 2018

Само README из simplecov говорит:

Вы можете исключить код из отчета о покрытии, заключив его в # :nocov:.
- https://github.com/colszowka/simplecov#ignoringskipping-code

E. г. пропустить require:

# :nocov:
require 'foo'
# :nocov:
...