推广Cucumber / Capybara测试

时间:2012-02-22 21:24:47

标签: ruby rspec cucumber integration-testing capybara

我写了一个功能来测试我的网络应用程序的默认配置使用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应用程序的用户能够运行测试以帮助确认他们的配置是否正确。 “Device”是默认配置文件中的一个字符串,用户可以更改。它是数组中的元素,在配置应用程序实例时,它们可以添加到数组中或从数组中删除。

这是对工具的合理使用还是我滥用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

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

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

2 个答案:

答案 0 :(得分:0)

不知道你之后在钓鱼,但感觉你的测试和实施是紧密耦合的。也许这就是你的感觉,似乎你在测试中描述你的应用程序。 我对你的问题没有很好的答案,只是因为我不理解"它。但是,我会建议您尝试将测试与实现分离,看看是否有任何抽象等待找到。

答案 1 :(得分:0)

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

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

特别是,davetron5000说:

  

我们所做的是完全不使用实例变量,而是使用实例变量   提供共享状态可以进入的has。此哈希在之后被清除   每次试运行。不理想,但它比随机实例更清洁   各地的变量(并确保合理清洁   每次测试前的状态)