rspec中的相关测试

时间:2013-02-12 14:52:42

标签: ruby testing rspec automated-tests

我写了功能测试,我需要做的测试取决于之前测试的通过。假设我有一个按钮,可以打开一个有功能的窗口。也就是说,为了检查这个功能,我需要先检查按钮的正确操作(即打开窗口或不起作用)。因此,我需要这样做,如果单击按钮时测试失败,则测试不会运行以检查功能窗口。单独编写测试 - 对我来说不是一个选择。我想看到这样的事情:

describe "some tests" do
  open_result = nil

  it "should check work button" do
    click_to_button()
    open_result = window_opened?
    open_result.should == true
  end

  if open_result

    describe "Check some functional" do

      it "should check first functional"

      it "should check second functional"

    end

  end

end

我知道这种方法对rspec不起作用。这只是我想看到的简单描述。使用rspec可以实现吗?如果没有,还有其他方式(宝石等)

1 个答案:

答案 0 :(得分:13)

RSpec被设计为单元测试框架,因此从中获得完美的功能测试行为可能有点困难。在RSpec的哲学测试中,必须独立。使用 autotest 时尤其重要:在这种情况下,执行顺序确实是不可预测的。悲伤却又是真的。

当然,您可以使用全局($a或实例(@a,此处不确定)变量在测试之间保存一些状态。无论如何,您需要将if移动到it块中,以便及时执行。如果不满足前提条件,您可以使用pending关键字来中断测试而不会失败。

<强> BUT

我确信最好的解决方案是避免golden hammer反模式,而不是在单元测试框架中编写功能测试。您不想测试某些单独的功能。您确实想要测试方案。所以我建议尝试一些场景测试套件。

看哪,Cucumber!用法很简单:

  1. 在Ruby中定义参数化场景步骤,以及RSpec风格的期望
  2. 用自然语言写出场景(是的,不仅是英语,甚至是俄语或其他什么 - Regexps的力量在你身边)
  3. 在您的情况下,您将拥有features/step_definitions/gui_steps.rb类似

    的内容
    Given /I pushed a button "(.*)"/ do |name|
        @buttons.find(name).click() # This line is pseudo-code, you know
    end
    
    检查窗口打开等等(见examples)。然后,您可以以任何方式组合已定义的步骤,例如,您的两个方案可能看起来像

    Scenario: Feature 1
        Given I pushed a button "go"
        And I focus on opened window
        When I trigger "feature 1"
        Then I should se "result 1" in text area
    
    Scenario: Feature 2
        Given I pushed a button "go"
        And I focus on opened window
        When I trigger "feature 2"
        Then I should se "result 2" in text area
    

    在这两种情况下,如果某个场景步骤失败(例如我专注于打开的窗口 - 如果它没有打开),后续步骤不会被执行 - 只是如你所愿。作为奖励,您可以获得极其详细的输出内容和步骤(请参阅网站上的图片)。

    好消息是,您并不总是需要自己定义所有步骤。例如,当您测试Web应用程序时,您可以使用webrat步骤来处理典型的事情,例如当我转到url / a / b / c 然后我应该看到文本“foo”on页面。我不知道你使用哪个GUI测试框架,但可能已经有了它的步骤,所以我建议你在 Cucumber%framework name%上谷歌。即使不是这样,一次编写这些步骤并不比尝试从RSpec制作Cucumber更困难。