8

我编写功能测试,并且我需要执行取决于先前测试通过的测试。假设我有一个按钮,可以打开一个窗口,其中有一个函数。也就是说,为了检查这个功能,我需要首先检查按钮的正确操作(即打开窗口或没有功能)。因此,我需要这样做,如果单击按钮时测试失败,则测试未运行以检查功能窗口。单独编写测试 - 对我来说不是一种选择。我想看到这样的东西:

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可以实现吗?如果没有,是否有其他方法(宝石等)

4

1 回答 1

14

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

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

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

看,黄瓜!用法很简单:

  1. 在 Ruby 中定义参数化的场景步骤,并在 RSpec 样式中定义期望
  2. 用自然语言编写场景(是的,不仅是英语,甚至是俄语或其他语言——Regexps 的力量就在你身边)

在您的情况下,您将拥有类似的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

以及用于检查窗口打开等的类似内容(参见示例)。然后你可以以任何方式组合定义的步骤,例如你的两个场景可能看起来像

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 步骤来处理典型的事情,例如When I go to url/a/b/c and Then I should see text "foo" on the page。我不知道你使用的是哪个 GUI 测试框架,但可能已经有步骤了,所以我建议你在Cucumber %framework name%上谷歌。即使没有,编写一次这些步骤也不会比尝试从 RSpec 制作 Cucumber 更困难。

于 2013-02-12T16:44:04.333 回答