我写了一个功能来测试我的网络应用程序的默认配置使用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
但我感觉不太好。如果没有别的,我想可能会与步骤定义之外定义的另一个实例变量发生名称冲突。
感觉我要么做错了要么我正在使用错误的工具。这样做的正确方法是什么?
答案 0 :(得分:0)
不知道你之后在钓鱼,但感觉你的测试和实施是紧密耦合的。也许这就是你的感觉,似乎你在测试中描述你的应用程序。 我对你的问题没有很好的答案,只是因为我不理解"它。但是,我会建议您尝试将测试与实现分离,看看是否有任何抽象等待找到。
答案 1 :(得分:0)
有一篇关于在http://www.cloudspace.com/blog/2010/06/23/using-instance-variables-with-cucumber-steps/的步骤定义中使用实例变量的博文。
评论者谈论这需要的耦合以及至少一种可能的解决方法。
特别是,davetron5000说:
我们所做的是完全不使用实例变量,而是使用实例变量 提供共享状态可以进入的has。此哈希在之后被清除 每次试运行。不理想,但它比随机实例更清洁 各地的变量(并确保合理清洁 每次测试前的状态)