2011-03-30 60 views
11

我碰巧是Ruby Inside的订户,因为我对Rails特别感兴趣。昨天,Rails的创始人David Heinemeier Hansson几乎说过他只是使用测试/单元。我会理解的,因为这是Rails的内部,但他似乎给出了强烈的意见。他认为RSpec和黄瓜是不必要的复杂。单元测试DHH:RSpec确实是不必要的复杂?

我通常不会太在意,但这取决于谁在说些什么。我很尊重Hansson,他的观点让我思考。当我开始使用Rails时,我从未真正考虑过测试/单元。只需RSpec和黄瓜。

这就是为什么我想要你的洞察力。你认为RSpec确实很复杂,没有多少附加价值?编写测试/单元是否花费更少的时间和精力?

+0

我同意DHH,因为轨道测试/单元看起来不错。我已经使用轨道测试框架工作,RSpec,硒等,并感觉相同DHH – Ashish 2011-03-30 07:29:47

+1

如果你有资源加钱加上时间50%以上的资源加载。 不用说相对冷冻的要求BDD/TDD是伟大的,否则坚持DHH说。 非常感谢他写了这篇博文.. – Abs 2014-05-16 19:43:03

回答

14

我的建议是使用Shoulda(扩展测试::单元)或RSpec与水豚和-no-黄瓜。

我认为对于嵌套上下文使用RSpec或Shoulda是绝对值得的。 RSpec绝对是重量级的(也许是超重的),而且我也因为这个原因在围栏上。

黄瓜,我终于明白,waaay比它通常的价值更繁琐。您可以使用普通酒精测试和水豚更简单,更健全地完成您的需求。记住 - 水豚!=黄瓜,和水豚是完全有能力的一切。

Shoulda很好,因为它只是增加了标准Test :: Unit框架的便利性,因此比RSpec轻得多(从技术上讲,每个解决了一系列不同的问题,但它们都提供了嵌套上下文功能)。 RSpec具有使断言更自然地阅读的优点,并且在许多情况下也生成更有用的失败消息,而不需要在断言上编写消息参数。另外,请记住,黄瓜实际上并不需要RSpec,所以如果你想继续使用黄瓜,你可以用Test :: Unit来做到这一点。选择比比皆是。

+0

事实上,从rpsec免费发布的automagic故障信息是它具有吸引力的很大一部分。 – 2011-03-30 14:16:44

+2

Cucumbersome! ;) – 2012-03-17 22:48:48

+0

由于我写了这篇文章,我已经了解到黄瓜不需要如此繁琐。对所有项目来说都是不正确的,但它可能是编纂规范的非常有价值的方法。编写好的黄瓜测试的关键是要根据商业价值撰写它们,并避免对具体实施的敬畏。如果你的小黄瓜含有像“页面”或“点击”这样的词不那么好。此外,黄瓜测试不一定需要全部堆栈。黄瓜测试可能会在较低的水平上执行,只需通过Capybara进行一些集成测试即可进行全栈验证。 – 2013-08-18 11:00:35

8

这完全是关于语义。 RSpec和Test :: Unit在功能上类似。就我个人而言,我一直比较喜欢RSpec,因为我发现用它编写测试更自然。我也喜欢写简单的custom matchers,并且提供的默认匹配器很有用。

黄瓜是完全不同的野兽。是的,如果你没有正确地组织你的步骤定义,它会非常麻烦并且很难维护,但它确实有一个非常强大的用例,那就是当你的客户正在编写你的规范时。

我已经参与了客户一直在和我们的QA团队一起编写黄瓜场景的项目。作为非技术人员,它是一种非常平易近人的方式,可以在代码中指定用户故事。黄瓜确实帮助我们在遵循敏捷实践时走路。最终产品的质量受益,但不,我不黄瓜作为开发者:)

3

这是一个个人的品味问题。

我喜欢写简单的黄瓜测试,而不用担心细节。只是测试我的应用程序的“开心”的路径。 (便携,可以理解,很慢)

我将详细信息留给测试/单元。(方便,快捷)

它需要更多的时间来理解:的

get :products, :session => @session_id_for_product_banana 
assert_select "table" do 
    assert_select "td#name", "Banana" 
end 

代替

When I go to the banana page 
Then I should see "Banana" 

当然这些测试是不相等的,但谁在乎“香蕉”是否是一个div或一个表或没有正确的html-id。

我不喜欢功能测试,因为重构后,ID可能会消失,会话期望可能会改变。如果是这种情况,您将需要重构代码和测试。如果你使用黄瓜,你不需要改变你的方案。

+2

如果您关心表格中的“香蕉”,而不仅仅是错误消息“未定义的方法”找到“香蕉”的一部分:String? – Arsen7 2011-06-01 10:29:01

+0

这可能发生,但不太可能。 id更改或您决定使用div的可能性更大。如果视图不包含逻辑,那么通常你会在单元测试中遇到这种错误。此外,Cucumber在运行时错误中往往会因为堆栈跟踪而炸毁。 – 2011-06-01 15:52:53