3

我有一个带有遗留测试/单元(minitest)测试和 RSpecs 的 Rails 3.2.8 项目。虽然我们让 Jenkins 运行持续集成,但我们已经有一段时间没有注意到失败了。原因是某些东西似乎在测试失败时覆盖退出代码并返回退出代码 0,无论是否存在失败的测试或规范。

我已经进行了一些挖掘,但想深入了解 Kernel#at_exit 堆栈以查看哪些 gem/plugins 正在注册一个 proc。我知道这是用 C 实现的语言特性。

所以,我正在寻求帮助给这只牦牛剃毛:

  • 为什么我的失败测试返回退出代码 0?
  • 假设某事正在向 at_exit 添加 proc/callback,我如何进入查看回调是什么?
    • 我知道它是用 C 编写的,并且查看了源代码。我没有看到任何红宝石挂钩。是否可以添加第 3 方扩展,或者是否有人知道 ruby​​ 的补丁可以在那里获得一些可见性?
    • dtrace 能进去看看吗?

我做过的一些事情:

  • 我已经找到了 gems 和已安装的库,at_exit但没有发现任何可疑之处。
  • 在我的 Rails 应用程序中使用相同的 gemset,如果我创建一个具有单一规范的新应用程序并运行它,它会按预期工作(通过测试返回退出代码 0,失败返回 1)
  • 寻找有助于提供可见性的 ruby​​ 补丁/扩展at_exit

我还没有做的一些事情:

  • 尝试学习 DTrace(我在 Mac 上) - 我看过演示如何使用它,但我还没有尝试过。
  • 从我的项目中删除每个 gem 以查看可能导致它的原因 - 它似乎确实是特定于项目的。

提前感谢您的帮助!

PS:这里是这个项目的 Gemfile 中的 gem:

gem 'rails', '~> 3.2.8'
gem 'acts-as-taggable-on', '~> 2.3.1'
gem "akamai_api", :path => "vendor/git/akamai_api"
gem 'dalli'
gem "gabba"
gem "googlecharts", :require => "gchart"
gem "hpricot"
gem 'jquery-rails'
gem 'linkscape'
gem "logging", "1.4.3"
gem 'machinist', '>= 2.0.0.beta2'
gem "mysql2"
gem 'newrelic_rpm'
gem "premailer-rails3"
gem 'rack-cache'
gem "rack-ssl-enforcer"
gem 'sendgrid'
gem "tokyocabinet", "1.29"
gem 'twitter-bootstrap-rails', :git => 'git://github.com/seyhunak/twitter-bootstrap-rails.git'
gem "useragent"
gem "yajl-ruby", :require => "yajl"

group :assets do
  gem 'coffee-rails'
  gem 'sass-rails'
  gem 'uglifier'
end

group :no_rake do
  gem "vanity"
end

group :development, :test do
  gem 'debugger'
  gem 'thin'
  gem 'rspec-rails'
end

group :test do
  gem 'vanity'
  gem 'minitest-rails'
  gem 'mocha'
end

作为更新,我在 Gemfile 中进行了二叉树搜索(关闭一半,运行测试,关闭另一半……重复),直到测试正确失败。日志记录 gem 导致 rspec 返回非零,而 googlecharts gem 正在搞乱测试/单元。在这一点上,我不知道为什么。

我还没有深入了解库的哪些行为(或我的应用程序中的依赖代码)正在影响测试。使用 Kernel#at_exit 快速 grep 没有返回任何内容,并且快速浏览每个源的源代码也没有发现任何内容。我会继续挖掘,但这就是我到目前为止所发现的。

我还没有提交错误报告,因为我还不知道问题是什么。

4

1 回答 1

2

你必须爱红宝石:)

alias original_at_exit at_exit
def at_exit(*args, &block)
  puts "registered at exit: #{caller * "\n"}"
  original_at_exit *args, &block
end
于 2012-10-30T12:58:29.550 回答