Ruby on rails 3 从水豚/RSpec更好地记录?

Ruby on rails 3 从水豚/RSpec更好地记录?,ruby-on-rails-3,rspec,capybara,Ruby On Rails 3,Rspec,Capybara,我很难调查测试失败的原因。我是一名经验丰富的程序员,精通一般调试技术,但我对Capybara和RSpec还不熟悉,所以我希望有一些我不知道的工具可以帮助我 简而言之,我有一个类似这样的测试: expect { click('.fake_button'); sleep 1 }.to change { clicks.count }.by(1) 当单击假按钮时,它会触发对Rails应用程序的AJAX调用,其中包括向数据库添加单击记录。我能想到许多可能导致此测试失败的因素,从日志中获取信息的成功率有限

我很难调查测试失败的原因。我是一名经验丰富的程序员,精通一般调试技术,但我对Capybara和RSpec还不熟悉,所以我希望有一些我不知道的工具可以帮助我

简而言之,我有一个类似这样的测试:

expect { click('.fake_button'); sleep 1 }.to change { clicks.count }.by(1)
当单击假按钮时,它会触发对Rails应用程序的AJAX调用,其中包括向数据库添加单击记录。我能想到许多可能导致此测试失败的因素,从日志中获取信息的成功率有限。这些测试在开发过程中并没有失败,只是在测试中偶尔失败。测试环境的一个不同之处是,测试是在我们办公室的服务器上针对云中的服务器运行的,因此存在网络延迟以及其他可能的问题

这是很难诊断的,因为失败的测试中只有很少的信息,当然,当我读到关于失败的信息时,所有的数据库信息都被丢弃了。我知道
clicks.count
在测试中没有改变,我可以推断
click('.fake_按钮')
成功了,但是由于服务器时间同步问题,我甚至不能确定单击是否发生在右按钮上,或者是否触发了AJAX调用


我想要的是一些工具来帮助我在web服务器日志(例如,可能使用自动URL参数)中跟踪这个测试用例,详细记录Capybara所做的事情,以及故障发生时的网页记录,包括cookie值。我能得到这些吗?有那样的事吗

水豚模拟人类行为。测试代码完全按照需要执行。这是真正的用户应该期待的。我认为你不应该抱怨代码

我认为,由于您的网络延迟,可以增加等待时间,比如说1到2,但不应超过合理的值,否则应用程序不能像实际用户预期的那样工作

要调试水豚代码,我总结了三种方法:

  • 将“保存和打开页面”添加到要查看结果的位置。然后,在测试过程中将出现一个保存的html页面。(我忘了是否应该添加“launchy”gem)

  • 暂时将此测试设置为JS,以查看此测试如何进行

    scenario "a fake test", js: true do
      # code here
    end
    
    通过这样做,一个真正的浏览器将弹出,水豚将一步一步地向您展示它是如何播放代码的

  • 只需运行
    $tail log/test.log
    即可显示最近发生的事情


  • 水豚模拟人类的行为。测试代码完全按照需要执行。这是真正的用户应该期待的。我认为你不应该抱怨代码

    我认为,由于您的网络延迟,可以增加等待时间,比如说1到2,但不应超过合理的值,否则应用程序不能像实际用户预期的那样工作

    要调试水豚代码,我总结了三种方法:

  • 将“保存和打开页面”添加到要查看结果的位置。然后,在测试过程中将出现一个保存的html页面。(我忘了是否应该添加“launchy”gem)

  • 暂时将此测试设置为JS,以查看此测试如何进行

    scenario "a fake test", js: true do
      # code here
    end
    
    通过这样做,一个真正的浏览器将弹出,水豚将一步一步地向您展示它是如何播放代码的

  • 只需运行
    $tail log/test.log
    即可显示最近发生的事情


  • 调试测试的一个好方法是使用irb来观察浏览器中实际发生的事情。RSpec失败通常会为简单的案例提供适当的信息,但对于更复杂的事情,我要么将案例拆分为简单的案例,要么将其放入irb进行实时会话,以确保它做了它应该做的事情


    确保使用:selenium作为您的驱动程序,您应该会看到firefox出现,并且能够由您的irb会话驱动。

    调试测试的一个好方法是使用irb来观察浏览器中实际发生的情况。RSpec失败通常会为简单的案例提供适当的信息,但对于更复杂的事情,我要么将案例拆分为简单的案例,要么将其放入irb进行实时会话,以确保它做了它应该做的事情


    确保使用:selenium作为您的驱动程序,您应该会看到firefox出现,并且能够由您的irb会话驱动。

    根据@Billy的建议,
    log/test.log
    没有给我任何有用的信息,我已经在使用
    js:true
    ,所以我尝试了以下方法:

    开始
    期望{click('.fake_button');sleep 1}。通过(1)更改{clicks.count}
    救援异常=>e
    开始
    timestamp=Time::now.strftime(“%Y%m%d%H%m%S%L”)
    开始
    屏幕截图_name=“tmp/capybara/capybara屏幕截图-#{timestamp}.png”
    $stderr.puts“由于测试失败而试图保存屏幕截图#{screenshot_name}”
    第页保存截图(截图名称)
    rescue异常=>内部异常
    $stderr.puts“在试图保存测试页面的屏幕截图时忽略异常#{inner}”
    结束
    开始
    #默认情况下,由Capybara在tmp/Capybara/下保存的页面
    保存页面“水豚html-{timestamp}.html”
    rescue异常=>内部异常
    $stderr.puts“试图保存失败测试页面的HTML时忽略异常#{inner}”
    结束
    确保
    提高e
    结束
    结束
    
    后来,我更改了测试本身,通过如下操作利用了Capybara的AJAX同步功能:

    expect { click('.fake_button'); sleep 1 }.to change { clicks.count }.by(1)
    
    start_count=clicks.count
    单击(“.fake_按钮”)
    page.should有_css('.submitted')35;水豚足够聪明,可以等待这种情况发生
    clicks.count.should==开始计数+1
    
    请注意,我正在寻找的CSS是通过AJAX回调在JavaScript中添加到页面的内容,因此它显示为AJAX调用完成的信号

    rescue
    块很重要,因为屏幕截图的故障率很高,因为没有足够的内存