没有所有要求和方法定义的 Ruby 代码覆盖率?



当使用超级简单的simplecov设置时,例如

require 'simplecov'
SimpleCov.start

对于我正在运行的单个测试中根本没有真正"执行"的文件和代码(在任何意义上,我在查看特定测试的代码覆盖率时都会关心(,我得到了大量的"覆盖率"。

例如,对于在生成的覆盖率报告中加载的所有文件,所有requiremoduleclassdefattr_accessor等都标记为绿色。我不关心这些,如果没有在其中执行"实际代码",如果这些文件报告0%的覆盖率,我会很高兴。

例如,endrescue和注释被认为是不相关的,并且在任何文件中都没有标记为红色绿色。我希望上面列出的方法具有类似的行为。

有没有办法获得真正只包括(和测量(我关心的实际正在执行的代码行的代码覆盖率?


第一次回答后更新: 将所有其他代码标记为"不相关",例如 不幸的是,# :nocov:不是一个选项,因为这会影响每个单独测试运行的数千个文件。

SimpleCov 只是向您展示 Ruby 的覆盖率库收集的内容,正如对您的问题的评论所说,这些东西执行了,但我也觉得这令人沮丧 - 我不希望一个加载但未使用的类达到 40% 的覆盖率。

我的解决方案是删除仅在加载过程中发生的覆盖范围。我们使用 Rails,所以我们从加载应用程序中的每个文件开始(这在 rails 中很容易,有一个eager_load配置(;拍摄当时的覆盖范围快照;运行测试套件;然后最后在 SimpleCov 输出之前从最终结果中扣除快照。在加载快照中恰好覆盖一次以及在最终结果中恰好覆盖一次的任何行都将被删除。

下面是我不久前拼凑的自定义 SimpleCov 格式化程序,可以完成这项工作。这有点黑客,因为它弄乱了 gem 的内部结果对象,所以请注意,对于新版本来说它可能不稳定,但它适用于当前的 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

simplecovREADME说:

您可以通过将代码

包装在# :nocov:中来从覆盖率报告中排除代码。
— https://github.com/colszowka/simplecov#ignoringskipping-code

例如,跳过require

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

相关内容

  • 没有找到相关文章

最新更新