使用集成测试练习BDD - 我是否也需要进行单元测试?

时间:2009-10-13 21:28:27

标签: ruby-on-rails cucumber bdd webrat

目前,我的开发流程如下:

  1. 我使用WebRat
  2. 将预期行为描述为集成测试
  3. 我编写Ruby on Rails代码来提供该行为,因此传递测试
  4. 我重构,确保测试在流程结束时仍然通过
  5. 我写了下一个集成测试
  6. 在我看来,根据定义,我的集成测试正在测试我可以创建的每个模型,控制器和视图。实际上,我是否因为不编写单元测试而遗漏了什么?

3 个答案:

答案 0 :(得分:8)

我实际上非常同情你的观点。我喜欢Cucumber 我喜欢RSpec - 我同时使用它们,但并不总是使用相同的代码。例如,我现在很少为Rails控制器编写RSpec示例,而且我几乎从不编写视图规范。我的大多数控制器非常相似,并且不会偏离“库存”控制器模式 - 这已经过Rails自己的单元测试的良好测试。再次验证相同的行为并不会花费很多时间和模拟所有模型的麻烦。由于Cucumber处于集成级别,我可以跳过这种模拟,并获得我正在寻找的基本验证。在大多数情况下,Cucumber中的视图测试处理得更加透明。 (然后我应该看到“foo”等等。)

但这并不是说我在Rails中没有广泛使用RSpec。我将它用于我的逻辑所在的地方:模型,控制器过滤器和视图助手。我还有几个项目几乎是所有业务逻辑,例如针对复杂第三方接口的库或API适配器。对于那些我经常发现自己使用RSpec并跳过Cucumber的人。

作为一种启发式方法,我建议您强烈考虑在下列任何问题都可以回答“是”时编写单元测试:

  • 我写的代码是不是很复杂?
  • 此代码是否主要用于为其他代码提供答案?
  • 这是我正在重构的现有代码(还没有单元测试)?
  • 我是否在此代码中发现了错误? (如果是这样,在修复它之前写一个单元测试,这样它就不会再次进入。)
  • 关于实现此代码的最优雅方式,我是否需要思考十多秒?
  • 我的蜘蛛侠感觉刺痛吗?

如果以上都不是真的,那么也许你可以通过集成测试来逃避。同样,在很多情况下这是合理的。但如果你以后遇到问题,请准备好付出代价 - 而且如果他们看起来需要,价格应该包括随时编写单元测试。

答案 1 :(得分:3)

集成测试可用于验证代码的不同部分是否已很好地集成。它们可能涉及所有层并覆盖所有代码但是...当集成测试失败时,它会告诉您错误的位置吗?我可能错了,但我不这么认为。这只会告诉你某处存在问题。另一方面,当真实单元测试(使用模拟或存根单独编写)失败时,您确切知道问题所在的单位(这实际上是单元测试的目的,验证单元是否实现了预期的行为) 。换句话说,单元测试和集成测试都很有用,但它们有不同的用途。

答案 2 :(得分:2)

你有任何佣金任务吗?自定义capistrano代码? Cron方法?一个API? Monkeypatches? flex或iPhone应用程序集成怎么样?职业跑步者?

在典型的Rails应用程序中,HTML UI没有执行大量代码。所以不,除非你的应用程序非常简单,否则webrat测试是不够的。