ruby - rspec 中的依赖测试

标签 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可以实现吗?如果没有,还有其他方法吗( gem 等)

最佳答案

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

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

但是

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

看,Cucumber !用法很简单:

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

在你的例子中,你将在 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 步骤处理典型的事情,例如 When I go to url/a/b/cThen I should see text "foo"on页面。我不知道您使用的是哪个 GUI 测试框架,但可能已经有相应的步骤,所以我建议您在 Cucumber %framework name% 上进行 google。即使没有,一次编写这些步骤也不会比尝试从 RSpec 制作 Cucumber 更难。

关于ruby - rspec 中的依赖测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14835283/

相关文章:

ruby - 如何根据数组中对象的两个属性创建哈希?

java - 我们如何在 Java 中测试 Actors?

asp.net - 在不输入任何内容的情况下模拟数据库中的记录

ruby-on-rails - Rspec:如何访问失败示例的当前种子数

ruby - 在 rails 之外使用 rails 方法

ruby-on-rails - 如果下一个不存在,Ruby 数组重复值,

testing - 如何让小部件测试等到 Bloc 更新状态?

ruby-on-rails - 帮助追踪 Controller 规范失败的原因

ruby-on-rails - 如何规范依赖 Memcached 的操作?

ruby-on-rails - 如果 rails 中不存在路由,则重定向到根页面