BDD与黄瓜和rspec – 何时是多余的?
Rails /工具特定版本: 你的unit testing有多深?
现在我写下:
- 黄瓜function(集成testing) – 这些testing针对我们的应用程序返回的HTML / JS,但有时也testing其他的东西,如调用第三方服务。
- RSpec控制器testing(functiontesting),最初只有当控制器有任何有意义的逻辑,但现在越来越多。
- RSpec模型testing(unit testing)
有时这是完全必要的; 有必要对模型中的行为进行testing,这对最终用户来说并不是完全明显或可见的。 模型复杂时,一定要进行testing。 但其他时候,在我看来,testing是多余的。 例如,如果你testing方法foo
如果它只是由bar
调用, bar
进行testing? 如果bar
是一个简单的辅助方法,在Cucumber特性中使用并且容易testing的模型会怎么样? 你是否在rspec和Cucumber中testing了这个方法? 我发现自己正在为此付出努力,因为编写更多的testing需要花费时间,并且维护实际上相同行为的多个“版本”,这使得维护testing套件的时间更加紧凑,从而导致更改更加昂贵。
总之,你是否相信有一段时间只写黄瓜function就够了? 还是应该经常在各个层面上进行testing? 如果您认为存在灰色地带,您需要进行function/unit testing的门槛是多less? 实际上,你现在做什么,为什么(或为什么不),你认为这是足够的?
编辑 : 这是一个什么可能是“testing矫枉过正”的例子。 诚然,我能够很快写出这个,但这完全是假设的。
好的问题,我最近在使用一个Rails应用程序的同时也使用了Cucumber / RSpec。 我尽可能地在每一个层次上进行testing,但是,我也发现,随着代码库的增长,我有时觉得我不必要地重复自己。
使用“Outside-in”testing,我的过程通常是这样的:黄瓜scheme – >控制器规格 – >型号规格。 越来越多的我发现自己跳过了控制器的规格,因为黄瓜的场景涵盖了很多function。 我通常回去添加控制器的规格,但它可以感觉像一个苦差事。
我经常采取的一步是用rake cucumber:rcov
在我的黄瓜特征上运行rcov rake cucumber:rcov
并寻找覆盖rake cucumber:rcov
的显着差距。 这些是我确定要关注的代码的一部分,所以他们有适当的覆盖面,无论是unit testing还是集成testing。
我相信模型/库应该广泛地进行unit testing,而且是核心业务逻辑。 它需要在正常的Web请求/响应过程之外进行隔离工作。 例如,如果我通过Rails控制台与我的应用程序进行交互,我正在直接使用业务逻辑,并且我希望确保我在模型/类上调用的方法已经过很好的testing。
在一天结束的时候,每个应用程序都是不同的,我认为决定多lesstesting覆盖率应该投入到代码库的不同部分并find合适的平衡,以便testing套件不会随着您的应用程序的增长,让您感到厌倦。
以下是我从我的书签中挖掘出来的一篇值得一读的有趣文章: http : //webmozarts.com/2010/03/15/why-not-to-want-100-code-coverage/
Rails有一个经过良好testing的代码库,所以我会避免重新testing这些步骤中涉及的东西。
例如,除非是自定义代码,否则在单元和function级别testingvalidation的结果是毫无意义的。 尽pipe如此,我会在集成级别上testing它们。 黄瓜function充当您项目的规范,所以指定您需要对x和y进行validation,即使实现是模型中的单行声明也是很好的。
我用rspectesting复杂的模型/ lib方法,然后用黄瓜networking的主要业务逻辑,所以我相信,networking的主要function将100%的工作,如果我有更多的时间和资源,我testing其他的一切。
简单的方法编写简单的规格更容易。 它比写cukes更容易。
如果你保持简单的方法 – 并保持你的规格简单 – 只testing该方法内部的逻辑 – 你会发现unit testing的乐趣。
如果有什么是多余的,它的黄瓜testing。 如果你有良好的testing模型和lib你的软件应该工作。
您通常不想同时拥有黄瓜故事和RSpec控制器规格/集成testing。 select一个(一般黄瓜是更好的select,除了某些特殊情况)。 然后使用RSpec模型,这就是你所需要的。