我想分析我们代码的测试覆盖率,因此安装了simplecov gem。
我们的测试环境有2个独立的项目:REST API测试(Java+Rest-Assureed(和Web UI测试(Java-Selenium(。
如您所见,我们在 rails 应用程序中没有单元测试,我们正在使用外部项目进行测试。
我按照教程中的描述配置了 simplecov gem,并将其放在 rails 脚本中:
require 'simplecov'
SimpleCov.start 'rails'
puts "require simplecov"
加载应用程序时,我看到我打印的字符串。
我运行了两个自动化测试项目,在 rails 日志中看到了它们的打印输出,但我没有看到任何控制器/模型的覆盖范围,我只看到一些 gem 和 rails 的初始化文件的一小部分。
我搜索了网络,并尝试将代码短语放入boot.rb甚至puma.rb中,它返回了相同的结果。
有什么想法吗?
编辑
对所有评论都没有帮助,但我想出了一些非常有趣的东西,在所有情况下,我只看到标记为已测试的方法的名称,而不是内容(在控制器中(。
我试图将simplecov开始短语放在bin/rails,puma.rb,config.ru,environment.rb中,所有这些都没有给出预期的代码覆盖率结果。
我不确定 simplecov 是否可以测量整个 rails 应用程序的覆盖范围......但是我在谷歌上搜索了一些可以作为机架中间件附加的东西:
https://github.com/danmayer/coverband
它的输出与 simplecov 兼容。因此,看起来它对您的情况可能有用。
正如您在问题中提到的,您正在使用彪马。我怀疑,由于它是多线程的,它会产生一些 rails 应用程序,并且它们的 simplecov 输出会覆盖彼此的结果。我会尝试使用像 webrick 这样的单线程服务器 - 但这可能会导致您的测试变慢(取决于测试的实际启动方式(或尝试coverband
gem。
另外 - 即使服务器是单线程的 - 我不确定每个请求是否会覆盖simplecov
的输出。
也许你必须指定路径
require 'simplecov'
SimpleCov.start do
# add_filter '/admin/'
add_group "Models", "app/models"
add_group "Controllers", "app/controllers"
add_group "Lib", "lib/"
add_group "Helpers", "app/helpers"
end
您需要在加载任何文件之前启动 SimpleCov,因此请尽早将这些行放在 ruby 入口点中:
require 'simplecov'
SimpleCov.start
你可以在这里看到我的一个存储库中的示例: https://github.com/tareksamni/DockUp/blob/master/spec/spec_helper.rb
启动后,我确实autoload
我的 ruby 代码SimpleCov
.您还需要相同:
require 'simplecov'
SimpleCov.start
require './autoload'
我在尝试获得 e2e 剧作家测试的报道时遇到了同样的问题。同时,子流程处理在 2020 年添加到 SimpleCov 中,因此我为 CI 创建了独角兽会议
timeout 60
worker_processes 1
preload_app true
listen 3000
app_path = File.expand_path('../', __dir__)
stderr_path "#{app_path}/log/unicorn.stderr.log"
if ENV['CI']
require File.expand_path('../lib/tutuf/simplecov', __dir__)
SimpleCov.command_name 'End-to-End Tests'
SimpleCov.enable_for_subprocesses true
SimpleCov.at_fork do |pid|
# This needs a unique name so it won't be overwritten
SimpleCov.command_name "#{SimpleCov.command_name} (subprocess: #{pid})"
SimpleCov.formatter SimpleCov::Formatter::LcovFormatter
SimpleCov.minimum_coverage 0
SimpleCov.start
end
end
然后启动了独角兽服务器
bundle exec unicorn_rails --config-file config/unicorn_test.rb --env test --daemonize
并运行了测试
npx playwright test e2e --workers=1
覆盖范围在关闭服务器时写入磁盘。为了能够将其发布到 codacy,我添加到 CI 配置
kill -QUIT `cat tmp/pids/unicorn.pid`
while [ -s tmp/pids/unicorn.pid ]; do
sleep 2
done
以便 SimpleCov 在尝试发送报告之前先将报告刷新到磁盘。最初我从 0.2 秒的等待时间开始,但这还不够,我将其增加到 2 秒。根据您运行的计算机和覆盖范围报告的大小,您可能需要进一步增加它。