【问题标题】:Ruby on Rails test coverage with simplecov使用 simplecov 的 Ruby on Rails 测试覆盖率
【发布时间】:2019-01-19 10:29:26
【问题描述】:


我想分析我们代码的测试覆盖率,因此安装了 simplecov gem。

我们的测试环境有 2 个独立的项目: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 并返回相同的结果。



有什么想法吗?

编辑

所有 cmets 都没有任何帮助,但我发现了一些非常有趣的东西,在所有情况下,我只看到标记为已测试的方法的名称,而不是内容(在控制器中)。
我尝试将 simplecov 起始短语放在 bin/rails、puma.rb、config.ru、environment.rb 中,都没有给出想要的代码覆盖结果。

【问题讨论】:

  • 这里有几件事可能会出错。首先,您应该运行 puma 单线程。 SimpleCov 的多线程支持是有限的。其次,您是否尝试过使用 SimpleCov 的 at_exit 挂钩?它将帮助您找出 SimpleCov 何时何地停止“记录”代码执行覆盖率:github.com/colszowka/simplecov#customizing-exit-behaviour。第三,Ruby 的覆盖范围可能已经提供了您所需要的一切,因此您一开始就不需要 SimpleCov:ruby-doc.org/stdlib-2.5.0/libdoc/coverage/rdoc/Coverage.html 我希望对您有所帮助。
  • 我们的 puma 是单线程运行的,而且你分享的关于 ruby​​ 库的内容似乎是按类进行的,这可能很难控制
  • 我不明白“我们正在使用外部项目进行测试。”
  • @SimonFranzen 测试不是 Rails 单元测试,而是使用 selenium 和 rest-assured 等外部​​项目。
  • 那么我不确定 SimpleCov 如何跟踪这些测试和覆盖率。

标签: ruby-on-rails ruby automated-tests simplecov


【解决方案1】:

我不确定 simplecov 是否可以测量整个 Rails 应用程序的覆盖范围...但我在 Google 上搜索了一些可以作为机架中间件附加的东西:

https://github.com/danmayer/coverband

它的输出与 simplecov 兼容。所以它看起来对你的情况很有用。

正如您在问题中提到的,您使用的是 puma。我怀疑,由于它是多线程的,它会产生一些 rails 应用程序,并且它们的 simplecov 输出会覆盖彼此的结果。我会尝试使用像 webrick 这样的单线程服务器 - 但这可能会使您的测试变慢(取决于测试的真正启动方式)或尝试 coverband gem。

另外——即使服务器是单线程的——我不确定每个请求是否不会覆盖simplecov 的输出。

【讨论】:

  • 正是我想要的!像魅力一样工作!干杯!!
【解决方案2】:

也许你必须指定路径

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

【讨论】:

  • 通过这些路径,我得到了 0/0 (100%) 的覆盖率,这可能是错误的。
  • @YogevAbr 您是否尝试过使用绝对路径,以确保这不是工作目录的问题?喜欢add_group "Models", "/home/user/path/to/project/app/models"
【解决方案3】:

您需要在加载任何文件之前启动 SimpleCov,因此请尽早将这些行放在您的 ruby​​ 入口点中:

require 'simplecov'
SimpleCov.start

您可以在我的一个存储库中看到一个示例: https://github.com/tareksamni/DockUp/blob/master/spec/spec_helper.rb

在启动SimpleCov 之后,我会使用autoload 我的红宝石代码。您也需要这样做:

require 'simplecov'
SimpleCov.start

require './autoload'

【讨论】:

  • 我没有规范助手,因为我没有使用 rails 环境运行任何测试,哪个文件首先使用 rails 5 加载?你知道吗?
  • 相同的结果。我真的开始认为我在浪费时间,这是 simplecov 的一个错误。
猜你喜欢
  • 1970-01-01
  • 2020-08-12
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 2013-02-19
相关资源
最近更新 更多