我正在尝试构建 Ruby gem。我使用基于 Ruby 3.3 的 Docker 映像和 devcontainer 设置了开发环境。
bundle gem
工具初始化了一个 gem。这建立了创建新宝石所需的基本结构。这安装了 MiniTest 5.25.1 和 Rubocop 1.67.0,以及一些其他依赖项。
我做的第一件事是将 SimpleCov 添加到我的 Gemfile 中,然后
bundle install
,它安装了 SimpleCov 0.22.0。我通过更新 test/test_helper.rb
来配置 SimpleCov 以需要 SimpleCov 和 SimpleCov.start
。
然后,我将第一个文件添加到位于
lib/gemname/modulename/file.rb
的 Gem 中,并在 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
文件。当我按照这些说明进行操作时,输出会略有变化,但仍然表明在测试套件之前甚至在测试助手中的 require 之前调用 SimpleCov 覆盖率报告:
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 是必需的,并且在首次加载被测类后启动。
由于使用
bundle gem
实例化的 gem 包含跨多个文件的完整目录结构和配置,因此很难获取具体代码,但我整理了 演示此行为的最基本存储库,并将其发布在 GitHub 上。
如何确保 SimpleCov 等待测试完成后生成覆盖率报告?
TL;DR 您的
test_helper.rb
文件应更新为包括:
require "simplecov"
SimpleCov.external_at_exit = true
SimpleCov.start
...