50

我刚刚观看了Minitest 的Railscast

使用 RSpec 与 Minitest 测试 Rails 应用程序的优缺点是什么?从 RSpec 转换到 Minitest 会丢失哪些功能?

4

2 回答 2

75

我是 RSpec 开发人员之一,从未使用过 minitest,因此在阅读此答案时要考虑到我的偏见。

总的来说,RSpec 的强大之处在于它将如此多的测试概念具体化为一流的对象。其中 Test::Unit 和 Minitest 使用简单的方法进行断言,RSpec 使用支持否定、自我描述等的一流匹配器对象。RSpec 的示例是支持丰富元数据的一流对象;minitest/spec 将it块编译成简单的方法,这些方法不支持相同类型的丰富元数据。RSpec 支持使用接受参数的一流构造(共享示例组)来指定共享行为;w/ minitest 您可以使用继承或 mixin 来重用测试,但它没有同类的一流支持。RSpec 有一个明确的格式化程序 API(并且有许多第三方格式化程序使用它);我不知道 minitest 具有相同类型的一流格式化程序 API。

作为一个整天不断地运行测试和练习 TDD 的人,我发现 RSpec 赋予我的力量非常有用。然而,许多人发现它是多余的,而且额外的抽象会增加认知成本。

以下是我认为 minitest 缺乏的 RSpec 的一些特定功能:

  • before(:all)钩子(注意这是 RSpec 的一个高级用户功能,应该很少使用;在使用 RSpec 的多年中,我只在少数场合使用过它)
  • around(:each)挂钩
  • 共享示例组
  • 共享上下文
  • 丰富的元数据支持,可用于控制运行哪些示例、包含哪些示例组共享上下文、哪些示例组模块混入等等。
  • 使用 rspec-mocks 集成了对各种模拟功能的支持;相比之下,Minitest::Mock 更简单,也更受限制。
  • RSpec 有rspec-fire,这太棒了。

使用 Minitest 的好处:

  • 它内置在标准库中,因此您无需安装任何额外的东西。
  • 它既可以用于样式,def test_blah也可以用于it 'blah'样式。
  • 代码库非常小而且简单。RSpec,由于它的年龄和附加功能,相比之下更大。
  • Minitest 加载速度比 RSpec 快(它大约需要 4 个代码文件,而 RSpec 有许多文件分布在 3 个 gem 中)——但请注意,RSpec 绝不慢;这些天来,在我的大多数项目中,我会在不到一秒(通常不到 500 毫秒)内从 RSpec 获得测试反馈。

总的来说,它有点像 Sinatra vs. Rails,我认为 Minitest 和 RSpec 都是不错的选择,具体取决于您的需求。

最后一件事:如果您更喜欢 Minitest 的某些特定方面,但您更喜欢 RSpec 的其他方面,它们可以很容易地混合和匹配。我写了一篇关于这个的博客文章,如果你有兴趣的话。

于 2012-09-18T16:00:24.597 回答
4

Test/Unit我从with转换为规范风格的 Minitest shoulda,它得到了回报。它取消了样板文件,他们说它也提高了速度。我从来没有真正使用过 RSpec。相反,我编写了自己的原始测试和模拟框架(只是为了理解模拟,我在切换到 Minitest 时放弃了它)。我认为 RSpec 中的 stubbing/mocking 可能更高级,所以如果你已经学会了,就继续使用它。否则,坚持使用 Minitest,这将使您能够与不了解 RSpec 的人合作,例如我。

于 2012-09-18T05:07:09.580 回答