我正在尝试构建 Ruby 宝石。我使用基于 Ruby 3.3 和 devcontainer 的 Docker 映像设置了开发环境。
我使用工具初始化了一个 gem bundle gem
。这设置了创建新 gem 所需的基本结构。这安装了 MiniTest 5.25.1 和 Rubocop 1.67.0,以及一些其他依赖项。
我做的第一件事是将 SimpleCov 添加到我的 Gemfile 中,然后bundle install
安装 SimpleCov 0.22.0。我通过更新来配置 SimpleCov,test/test_helper.rb
以要求 SimpleCov 和SimpleCov.start
。
然后,我将第一个文件添加到我的 Gem 中lib/gemname/modulename/file.rb
,并添加了相应的测试test/gemname/modulename/test_file.rb
。编写了一个非常简单的几行方法和一个测试来调用该方法并对其进行断言。我想验证 MiniTest、SimpleCov 和 Rubocop 是否正常运行。
当我运行bundle exec rake
测试和 Rubocop 时,输出似乎表明覆盖率报告是在执行测试之前生成的:
Coverage report generated for Minitest to /workspaces/gemname/coverage.
Line Coverage: 75.0% (9 / 12)
Run options: --seed 44598
# Running:
..
Finished in 0.001718s, 1164.1532 runs/s, 1164.1532 assertions/s.
2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
SimpleCov 自述文件中的一项建议是尝试.simplecov
在项目根目录中使用一个文件。当我按照这些说明操作时,输出略有变化,但仍然表明 SimpleCov 覆盖率报告在测试套件之前被调用,甚至在测试助手中的 require 之前被调用:
Warning: Error occurred while trying to load /workspaces/gemname/.simplecov. Error message: uninitialized constant Simplecov
Run options: --seed 20890
# Running:
..
Finished in 0.001560s, 1281.7818 runs/s, 1281.7818 assertions/s.
2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
我确实注意到生成的 gemspec 文件包含版本文件的 require 语句以及spec.require_paths
。我删除了这两个文件以查看是否会产生影响,但结果没有。即使没有这些,SimpleCov 似乎也会在测试运行之前尝试生成其覆盖率报告。
由于 gemspec 加载较早,我预计lib/gemname/version.rb
文件覆盖范围会出现问题,因为它在 SimpleCov 之前加载。但是,我已确认 SimpleCov 是必需的,并且在首次加载测试类后启动。
由于用 实例化的 gembundle gem
包含跨多个文件的整个目录结构和配置,所以很难获取具体的代码,但我整理了一个演示此行为的最基本的存储库,并将其放在 GitHub 上提供。
我如何确保 SimpleCov 等到测试完成后再生成覆盖率报告?
TL;DR 您的
test_helper.rb
文件应该更新以包含:至于这里出了什么问题,我不太熟悉 MiniTest,但看起来它与 SimpleCov 的集成一直很差。这个问题听起来与以下评论有关:
https://github.com/simplecov-ruby/simplecov/issues/685#issuecomment-410127090(致谢
@bf4
)如果您调整您的
test_helper.rb
以包括以下内容:...您会发现它被调用了两次,一次是在测试运行之前,一次是在测试运行之后!设置
external_at_exit
似乎抑制了这种情况。现在,minitest/simplecov_plugin
SimpleCov 提供了一个,但即使这样似乎也无法解决问题,尽管这可能归结于它被包含在哪里。