【问题标题】:How do I troubleshoot autotest infinite loop problems?如何解决自动测试无限循环问题?
【发布时间】:2010-07-06 21:01:16
【问题描述】:

我正在使用 cucumber、rails3、rspec2 和 autotest。我试图弄清楚为什么我的功能无限循环。我怀疑在测试期间某些文件被更改了,但我不确定是哪个文件。我在.autotest 中添加了一些例外情况,没有骰子。

我可以采取任何步骤来解决此问题吗?

如果我能看到哪些文件正在触发重新运行,或者在运行时,哪些文件正在被监视/未被监视,那就太棒了。

这是我的 .autotest 内容

require 'autotest/growl'

Autotest::Growl::clear_terminal = false

# Skip some paths
Autotest.add_hook :initialize do |autotest|
    %w{.git .DS_store db log tmp rerun.txt}.each { |e| autotest.add_exception(e) }
end

【问题讨论】:

    标签: ruby-on-rails rspec cucumber autotest


    【解决方案1】:

    好的,所以我想通了。我深入研究了 autotest 的源代码,以便更好地了解正在发生的事情。它从所有异常中创建一个 Regexp.union 并忽略相对路径与编译表达式匹配的文件。

    为了更好地理解这个错误,我将项目目录中的所有内容都添加到了.autotest,除了./app./lib./public./script./spec./features。像这样的:

    # .autotest - to troubleshoot
    Autotest.add_hook :initialize do |at|
      at.add_exception(%r{^\./\.git})
      ...
      at.add_exception(%r{^\./db})
      ...
      at.add_exception(%r{^\./rerun.txt})
      ...
    end
    

    当我这样做时,我没有得到一个无限循环。之后,我才开始注释掉每个异常。事实证明,我必须手动忽略的唯一文件是Gemfile.lock。出于某种原因,这要么被改变,要么混淆了自动测试,以至于它使黄瓜循环。

    因此,这个.autotest 解决了这个问题:

    # .autotest - to fix
    Autotest.add_hook :initialize do |at|
      # Gemfile.lock is causing cucumber to run infinitely. Don't watch it.
      at.add_exception(%r{^\./Gemfile.lock})
    end
    

    我将报告黄瓜列表,让他们知道他们应该将其添加到内置的自动测试异常中。

    【讨论】:

    • 我尝试在 Gemfile.lock 上进行例外处理,但这并没有成功。我最终使用了以下内容: Autotest.add_hook :initialize do |at| %w{.svn .hg .git vendor rerun.txti db log tmp .DS_store Gemfile.lock}.each {|exception| at.add_exception(exception)} 结束
    • 告诉自动测试忽略Gemfile.lock 对我有用。看起来在运行我的规范时,Gemfile.lock 正在被更改(我的 gem 'capistrano' 行的依赖项在测试期间被更改,然后放回去......奇怪)。
    • 谢谢,谢谢,谢谢。我唯一的遗憾是,我对这个答案只有一个赞成票。
    【解决方案2】:

    只是想说声谢谢。原来,对我来说,它是日志目录。我的.autotest 文件如下所示。

    # .autotest
    Autotest.add_hook :initialize do |at|
      # Log directory is causing cucumber to run infinitely.
      at.add_exception(%r{^\./log})
    end

    有关参考,请参阅http://github.com/aslakhellesoy/cucumber/wiki/Autotest-Integration 中的“自定义自动测试行为”,其中讨论了无限循环问题。

    【讨论】:

      【解决方案3】:

      在 Linux/Unix 中,您可以使用以下命令:

      $ find . -mmin -5
      

      找出最近 5 分钟内修改了哪些文件(或任何适当的间隔)。这可以极大地帮助找到触发无限循环的文件。然后按照其他答案中的说明添加异常。

      就我而言,罪魁祸首是webrat.log

      【讨论】:

        【解决方案4】:

        值得注意的是,您可以将 -v 传递给 autospec/autotest,它会打印出触发它运行的原因。

        【讨论】:

          【解决方案5】:

          将您的文件置于版本控制之下。运行自动测试,然后运行您的 VC 系统的状态命令(例如 git status)以查看发生了什么变化。

          PS:可能是rerun.txt,每次运行功能都会被Cucumber触摸。

          【讨论】:

          • 使用 git。状态报告没有任何变化(我可能忽略了被更改的文件,如果有一个)。我还在我的自动测试异常中添加了 rerun.txt。更新了答案以包含我的 .autotest 内容。
          • 这个想法很有趣,我会尝试重新结帐并尽快跟踪所有内容,看看是否有帮助。
          • 2 个正在修改的文件(根据 git)是 db/test.sqlite3 和 log/test.log。似乎 .autotest 应该告诉 autotest 不要观看它们。我敢肯定黄瓜轨也内置了这个。我的 .autotest 会消失吗?
          • 不,您的.autotest 对我来说是正确的。也许这毕竟不是由于文件更改...一个可能的线索-我排除了vendor,尽管我不记得为什么了。我确实记得遇到过和你一样的问题,autospec 永远循环,这是由于监视的文件被更改了,但我不记得是哪个。
          • 感谢这里的健全性检查和指导。我已经在答案中发布了我最终如何解决问题的方法。 +1 寻求帮助。
          【解决方案6】:

          您可以使用 ruby-debug 。然后,您可以在代码中添加调试器语句并对其进行中断。

          【讨论】:

          • 好的,我可以处理,但是一旦我打破了我如何检查自动测试?我不知道从哪里看才能深入了解它的内部结构,看看它为什么会这样做。
          猜你喜欢
          • 1970-01-01
          • 2015-03-23
          • 1970-01-01
          • 1970-01-01
          • 2020-05-18
          • 2021-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多