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

标签 ruby simplecov

当使用 super 简单的 simplecov 设置时

require 'simplecov'
SimpleCov.start

在我运行的单个测试中,我得到了大量未真正“执行”的文件和代码的“覆盖率”(在查看特定测试的代码覆盖率时我会关心的任何意义上)。

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

例如,

endrescue 和评论被认为是不相关的,不会在任何文件中标记为红色 绿色。我希望上面列出的方法有类似的行为。

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


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

最佳答案

SimpleCov 只是向您展示 Ruby 的 Coverage 库收集了什么,正如对您问题的评论所说,这些事情执行了,但我也觉得这令人沮丧 - 我不想要一个类已加载但未使用,覆盖率为 40%。

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

下面是我不久前拼凑的一个自定义 SimpleCov 格式化程序,它可以完成这项工作。这有点 hack,因为它与 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

关于没有所有必需的和方法定义的 Ruby 代码覆盖率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52294125/

相关文章:

ruby - 从同名方法调用 ruby​​ 中的方法

ruby-on-rails - CSR 失败 : Error Parsing Request ASN1 bad tag value met (ASN: 267 CRYPT_E_ASN1_BADTAG)

ruby - 在 Ubuntu 上安装 OpenSSL 用于 Rails 开发?

ruby-on-rails - 运行parallel_test时如何合并CircleCI内的多个simplecov目录?

simplecov - 如何配置SimpleCov忽略#inspect方法

ruby - fxruby 进度条宽度

ruby-on-rails - Ruby/Rails 如何从俄语字符串解析日期时间

ruby-on-rails - Rspec SimpleCov NoMethodError

ruby-on-rails - 使用 simplecov 的 Ruby on Rails 测试覆盖率

ruby-on-rails - SimpleCov计算用户模型的0%覆盖率