2013-03-27 20 views
2

我在调查测试失败的原因方面非常困难。我是一个非常有经验的程序员,并且熟悉一般的调试技术,但是我对Capybara和RSpec是新手,所以我希望有某种我不知道的工具可以帮助我。从Capybara/RSpec更好地记录?

总之,我有一个测试是这样的:

expect { click('.fake_button'); sleep 1 }.to change { clicks.count }.by(1) 

当点击假的按钮,它会触发一个AJAX调用的Rails应用程序,除其他事项外,增加了点击记录到数据库。我可以想到几十件可能会导致此测试失败的事情,并且只有有限的成功从日志中获取信息。测试不会在开发过程中失败,它只会在测试中偶尔失败。测试环境的差异之一在于,测试是在我们办公室的服务器上针对云中的服务器运行的,因此存在网络延迟以及其他可能的问题。

这是非常难以诊断,因为有资料太少走出失败的考验,当然所有的数据库信息被扔掉通过我了解故障的时间。我知道clicks.count在测试中没有发生变化,我可以推断click('.fake_button')成功,但由于服务器时间同步问题,我甚至无法确定点击是否发生在右侧按钮上或者AJAX调用被触发。

我想什么是一些工具来帮助我遵循Web服务器日志这个测试用例(可能使用自动URL参数,例如),什么水豚做详细的记录,并作为网页的记录它发生故障时,包括cookie值。我可以得到这些吗?任何这样的事情?

回答

3

水豚模拟人类的行为。测试代码确实需要什么。这是真正的用户应该期望的。我认为你不应该抱怨代码。

我认为这没关系增加等待时间,比如1〜2,由于网络延迟,但它不应该超过合理值,否则作为真正的用户所期望的应用程序无法正常工作。

要调试水豚码,有三种方法,我概括为:

  1. 添加“save_and_open_page”你想看到结果的地方。然后在测试过程中会出现一个保存的html页面。 (我忘了,如果“launchy”创业板应加)

  2. 暂时将本次测试为JS看到这个测试怎么回事。

    scenario "a fake test", js: true do 
        # code here 
    end 
    

    通过这样做一个真正的浏览器会弹出和水豚会告诉你一步一步如何打码。

  3. 只要运行$ tail log/test.log显示最近发生了什么。

+0

'save_and_open_page'绝对有帮助,谢谢,是的,'launchy'是必需的,正如'js:true'。 'test.log'不是很有用。如果'test.log'中的信息足够有用,我不会问这个问题。 – 2013-03-27 22:10:08

0

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

确保使用:硒作为你的驱动程序,你应该看到Firefox的拿出,并能够通过您的IRB会议上驱动。

+0

请您给我更多的细节,或者给我一个关于如何在'irb'中运行RSpec/Capybara的链接?我不能仅仅运行测试,因为问题是'expect {x} .to {y} .by(1)'更改失败,但是n = y; X;当我在irb中逐行执行时,y == n + 1'是'true'。 – 2013-03-28 00:20:53

+0

我一般都会粘贴代码,所以我可以检查变量并运行额外的东西。只要确保把正确的要求放在最上面。你可以粘贴你的东西,它会去。 irb只是一个交互式的ruby提示符,没有什么奇特的。把它看作你的实时调试器。 – gmoney 2013-03-28 01:17:48

+0

这可能是一个好的参考:http://tom-clements.com/blog/2012/02/25/capybara-on-the-command-line-live-browser-testing-from-irb/ – gmoney 2013-03-28 01:18:27

1

建设关什么@Billy建议,log/test.log没有给我任何有用的信息,我已经使用js: true所以我尝试这样的:

begin 
    expect { click('.fake_button'); sleep 1 }.to change { clicks.count }.by(1) 
rescue Exception => e 
    begin 
    timestamp = Time::now.strftime('%Y%m%d%H%M%S%L') 
    begin 
     screenshot_name = "tmp/capybara/capybara-screenshot-#{timestamp}.png" 
     $stderr.puts "Trying to save screenshot #{screenshot_name} due to test failure" 
     page.save_screenshot(screenshot_name) 
    rescue Exception => inner 
     $stderr.puts "Ignoring exception #{inner} while trying to save screenshot of test page" 
    end 
    begin 
     # Page saved by Capybara under tmp/capybara/ by default 
     save_page "capybara-html-#{timestamp}.html" 
    rescue Exception => inner 
     $stderr.puts "Ignoring exception #{inner} while trying to save HTML of failed test page" 
    end 
    ensure 
    raise e 
    end 
end 

后来,我改变了测试本身利用水豚的AJAX的

starting_count = clicks.count 
    click('.fake_button') 
    page.should have_css('.submitted')  # Capybara is smart enough to wait for this to happen 
    clicks.count.should == starting_count + 1 

注意,我正在寻找在AJAX回调的东西添加到页面中JavaScript,所以显示出来的CSS是一个标志:通过做这样的事情同步功能AJAX呼叫完成。

rescue块很重要,因为屏幕截图由于没有足够的内存来渲染整个页面并将其转换为图像而具有较高的故障率。

编辑

虽然我还没有尝试过,一个可行的解决方案是Capybara::Screenshot自动保存在任何故障的屏幕截图和HTML。只是阅读代码,它看起来像是屏幕截图失败时会出现问题,截图触发时我无法知道页面处于什么状态,但它看起来确实值得一试。