Minitest和Rspec

我刚刚观看了Minitest的Railscast 。

使用RSpec vs Minitesttestingrails应用程序有什么优缺点? 我将失去从RSpec转换到Minitest的哪些function?

我是RSpec开发人员之一,从来没有使用minitest,所以当阅读这个答案时,考虑我的偏见。

总的来说,RSpec的力量来源于它将这么多testing概念转化为一stream的对象。 在Test :: Unit和Minitest使用简单的方法来进行断言,RSpec使用一stream的匹配器对象,支持否定,自我描述和更多。 RSpec的示例是支持丰富元数据的一stream对象; minitest / spec将it编译成简单的方法,不支持相同types的丰富的元数据。 RSpec支持使用接受参数的第一类构造(共享示例组)来指定共享行为; w / minitest你可以使用inheritance或一个mixin来重新使用testing ,但它没有相同types的一stream的支持。 RSpec有一个明确的格式化API(有许多第三方格式化程序使用它); 我不知道minitest具有相同的一stream的格式化程序API。

作为一个整天在不断testing和实践TDD的人,我发现RSpec的强大function让我非常有用。 然而,许多人认为它是过度的,而且额外的抽象还有额外的认知成本。

以下是RSpec所具有的一些特定function,我相信minitest缺乏:

  • before(:all)钩子(请注意,这是一个RSpec的高级用户function,应该很less使用;我只在less数情况下使用RSpec多年)
  • around(:each)钩子
  • 共享示例组
  • 共享上下文
  • 丰富的元数据支持,可以用来控制运行哪些示例,哪些示例组共享上下文包含在哪些示例组模块混入等等。
  • 综合支持广泛的嘲讽functionw / rspec-mocks; Minitest ::模拟是比较简单得多,更有限。
  • RSpec有rspec-fire ,这真棒。

使用Minitest的好处:

  • 它内置在标准库中,所以你不需要额外安装任何东西。
  • 它可以用于def test_blah或者it 'blah'风格。
  • 代码库很小,很简单。 由于RSpec的年龄和附加特征,RSpec比较大。
  • Minitest的加载速度比RSpec快(这是大约4个代码文件相比,RSpec有很多文件分布在3个gem) – 但请注意,RSpec是不是很慢; 在我现在的大部分项目中,我都能在一秒之内(通常在500毫秒以内)获得RSpec的testing反馈。

总的来说,这有点像Sinatra vs. Rails,我认为Minitest和RSpec都是很好的select,取决于你的需求。

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

我把Test/Unit转换成spec-style Minitest与shoulda ,它会得到回报。 它取消了样板,他们说这也提高了速度。 我从来没有真正使用RSpec。 相反,我写了自己的原始testing和嘲笑框架(只是为了理解嘲笑,我放弃了它切换到Minitest)。 我认为RSpec中的stubbing / mocking可能会更先进,所以如果你已经学会了,就继续使用它。 否则,坚持Minitest,这将使您能够与那些对RSpec无知的人,比如我合作。