【问题标题】:Generalizing Cucumber/Capybara Tests推广 Cucumber/Capybara 测试
【发布时间】:2012-02-22 21:24:47
【问题描述】:

我编写了一个功能来测试我的 web 应用程序的默认配置,使用 Cucumber 和 Capybara。部分功能如下所示:

And the page has a photo labeled "Device"
And the page has a checkbox labeled "Device"
And I check "Device"
And I submit the form
Then the resulting page has no photo labeled "Device"

效果很好。我希望在自己的服务器上安装和配置 Web 应用程序的用户能够运行测试以帮助确认他们的配置是否正确。 “设备”是用户可以更改的默认配置文件中的字符串。它是数组中的一个元素,他们可以在配置应用实例时添加到数组中或从数组中删除。

这是对工具的合理使用,还是我在滥用 Cucumber 和/或 Capybara?如果它是明智的,我会怎么做?如果这是一个坏主意,我可以使用哪些工具来代替?

这是我如何让它工作的。我只是不确定这是最好的方法。

为此,该功能必须看起来更像这样:

And the page has at least 3 photos, let us call the last one "third_photo"

在对应的步骤定义中,我使用一个XPath为第一张照片拉出对应的标签字符串,并将其分配给一个存储在类变量中的Hash对象。

And /^I the page has at least (\d*) photos, let us call the last one "([^\"]*)"$/ do |n, name|
  if ! defined?(@note)
    @note = Hash.new;
  end
   @note[name] = find(:xpath, '//ol[@id="menu"]/li[' +n+ ']/a').text;
end

后续步骤定义现在可以访问该值,无论它是什么。

所以,另一个功能可能是:

Then I uncheck "third_item"

相应的步骤定义可能是:

Then /I uncheck "([^\"]*)"/ do |item|
  uncheck(@note[item])
end

但我感觉不太好。如果不出意外,我想可能与在步骤定义之外定义的另一个实例变量发生名称冲突。

感觉要么我做错了,要么我使用了错误的工具。这样做的正确方法是什么?

【问题讨论】:

    标签: ruby rspec cucumber integration-testing capybara


    【解决方案1】:

    不知道您在追求什么,但感觉您的测试和实现非常紧密耦合。也许这就是您的感觉,好像您在测试中描述您的应用程序。 我对你的问题没有很好的答案,仅仅是因为我不“理解”它。但是,我会敦促您尝试将测试与实现分离,看看是否有任何抽象等待被发现。

    【讨论】:

    • 我感觉不太好的部分是使用类变量将值从一个步骤定义传递到另一个。感觉就像我正在打破封装。但据我所知,这实际上是推荐的方法。
    【解决方案2】:

    http://www.cloudspace.com/blog/2010/06/23/using-instance-variables-with-cucumber-steps/ 上有一篇关于在步骤定义中使用实例变量的博文。

    评论者谈论这需要的耦合以及至少一种可能的解决方法。

    特别是 davetron5000 说:

    我们所做的是根本不使用实例变量,而是 提供一个可以进入的共享状态。这个哈希在之后被清除 每次测试运行。不理想,但它比随机实例更干净 到处都是变量(并且还确保了一个合理的清洁 每次测试前的状态)

    【讨论】:

      猜你喜欢
      • 2018-06-06
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      相关资源
      最近更新 更多