【发布时间】:2008-09-21 01:47:01
【问题描述】:
我正在设置一个 Rails 应用程序,我刚刚完成了一些单元测试,我的朋友说,显然固定装置不再酷,人们现在正在使用 RSpec 或 shoulda。我想知道使用这些其他工具包的实际好处是什么。任何信息都表示赞赏。
-fREW
【问题讨论】:
标签: ruby-on-rails ruby unit-testing testing shoulda
我正在设置一个 Rails 应用程序,我刚刚完成了一些单元测试,我的朋友说,显然固定装置不再酷,人们现在正在使用 RSpec 或 shoulda。我想知道使用这些其他工具包的实际好处是什么。任何信息都表示赞赏。
-fREW
【问题讨论】:
标签: ruby-on-rails ruby unit-testing testing shoulda
我个人更喜欢 Shoulda 而不是 RSpec。我发现应该比 RSpec 有更少的魔法语法。我对 RSpec 的问题是,是的,当我大声朗读它时它非常易读,但是当我开始编写它时,嗯,我永远不确定应该如何编写给定的断言。 Prag Dave explains the problem better than me。他也likes Shoulda 并举了几个例子。
【讨论】:
RSpec 和类似框架是旨在帮助行为驱动开发的工具。它们不仅是编写测试的更漂亮的方式,尽管它们确实对此有所帮助。
这里有很多关于 BDD 的信息:http://behaviour-driven.org/ 和维基百科:http://en.wikipedia.org/wiki/Behavior_Driven_Development
这里列出的好处太多了,所以我建议稍微浏览一下那个网站。
【讨论】:
这里有两个不同的东西:
第一件事是使用什么框架来编写测试/规范。在这里,您可以在 Test::Unit、RSpec、Shouda 等之间进行选择。选择是您是否想要执行传统的 TDD(Test::Unit),或者您是否更喜欢 David Chemlinsky(RSpec 和某种程度上的应该)等开发人员所提倡的指定行为的替代思考方式。
第二件事是如何处理测试数据。有 Rails 固定装置和替代方案设计有其他目标,例如 the FixtureReplacement plugin。在 Rails 2.0 之前,fixture 存在重大且有据可查的实际问题。 Rails 2.0 中修复了许多实际问题。然而,fixture 可能会导致无意的测试耦合,一些替代方案试图避免这种情况。
【讨论】:
RSpec 更加强大,因为它更容易读取和写入测试。使用模拟和存根时它也非常优雅,一旦你开始在测试中使用它们,这个概念将变得非常有用。在一个简单的测试应用程序(NON RAILS!)中尝试一下,您会发现您的规范与等效的标准测试相比有多优雅。
【讨论】:
查看 Josh Susser 的 The Great Test Framework Dance-off,比较流行的 Ruby 测试框架。
【讨论】:
如果您正在构建一个大型应用程序并且没有一个团队都非常擅长编写可以通过黑盒测试进行良好测试的解耦代码,并且准备好完全接受使用/调试大量模拟和存根,不要走工厂路。
无论您在哪里阅读有关 Awesome Factories Are 的文章,您都会看到一些关于工厂在大型应用程序中可能不可行的警告,因为它们比固定装置慢一点。
但是“慢一点”确实慢了几个数量级。
工厂并不比使用标签作为 id 的夹具容易得多,只要您保持夹具井井有条。在某些情况下,工厂更难调试。
就在今晚,我将一个工厂转换为固定装置,使用它的测试文件的运行时间从 65 秒变为 15 秒,尽管该测试文件中只有大约 15% 的测试使用该工厂。
如果您使用 minitest,您可以随机运行测试;这将很快揭示测试之间的任何数据耦合。 (不确定 rspec 是否可以选择随机化测试顺序)
【讨论】:
Test::Unit 适合小型应用程序。但是使用像 Shoulda 或 RSpec 这样的测试框架有很多好处,例如。 G。上下文!!
我看不到 Shoulda 和 RSpec 存在非此即彼的关系。在进行单断言测试时,我使用 Shoulda 作为 RSpec 的替代品。我真的很喜欢 Shoulda 单线,但是在 RSpec 中编写匹配器要容易得多。所以我的建议是在最适合的地方使用不同的测试工具。
【讨论】:
您可以使用 Cucumber 之类的测试框架,它比 RSpec 还要快..
【讨论】: