使用simplecov测试Ruby on Rails覆盖率

sczxawaw  于 2023-10-17  发布在  Ruby
关注(0)|答案(4)|浏览(129)

我想分析我们代码的测试覆盖率,因此安装了simplecov gem。
我们的测试团队有两个独立的项目:REST API测试(Java+Rest-Assured)和Web UI测试(Java-Selenium)。
正如你所看到的,我们没有在rails应用程序内部进行单元测试,我们正在使用外部项目进行测试。
我按照教程中的描述配置了simplecov gem,并将其放入rails脚本中:

require 'simplecov'
SimpleCov.start 'rails'
puts "require simplecov"

当加载应用程序时,我看到我打印的字符串。
我运行了两个自动化测试项目,在rails日志中看到了它们的原理,但是我没有看到任何控制器/模型的覆盖,我只看到了一些gems和rails的初始化文件的一小部分。
我在网上搜索了一下,试着把代码放在 Boot .rb甚至puma.rb中,它都返回了相同的结果。
有什么想法吗?

  • 编辑 *

所有的注解都没有帮助,但我发现了一些非常有趣的事情,在所有情况下,我只看到标记为测试的方法的名称,而不是内容(在控制器中)。
我尝试在bin/rails、puma.rb、config.ru、environment.rb中使用simplecov启动短语,但都没有给出代码覆盖率的预期结果。

bvjxkvbb

bvjxkvbb1#

我不确定Simplecov能否衡量整个Rails应用程序的覆盖率。但是我在谷歌上搜索了一些你可以作为机架中间件附加的东西:
https://github.com/danmayer/coverband
它的输出与simplecov兼容。所以看起来对你的案子很有用。
正如你在问题中提到的,你正在使用彪马。我怀疑,由于它是多线程的,它会产生一些rails应用程序,它们的simplecov输出会覆盖彼此的结果。我会尝试像webrick这样的单线程服务器,但这可能会使你的测试变慢(取决于测试是如何启动的),或者尝试coverband gem。
另外,即使服务器是单线程的,我也不确定每个请求是否会覆盖simplecov的输出。

ecfdbz9o

ecfdbz9o2#

也许你必须指定路径

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
vq8itlhq

vq8itlhq3#

你需要在加载任何文件之前启动SimpleCov,所以尽可能早地将这些行放在你的ruby入口点中:

require 'simplecov'
SimpleCov.start

你可以在我的一个repos中看到一个例子:https://github.com/tareksamni/DockUp/blob/master/spec/spec_helper.rb
我在启动SimpleCov后执行了autoload代码。你也需要同样的:

require 'simplecov'
SimpleCov.start

require './autoload'
rur96b6h

rur96b6h4#

我也遇到了同样的问题,试图获得e2e剧作家测试的覆盖面。同时,SimpleCov在2020年添加了子进程处理,因此我为CI创建了unicorn conf

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秒。根据您运行的计算机和覆盖率报告的大小,您可能需要进一步增加它。

相关问题