Minitest和Rspec

GTD*_*Dev 49 ruby testing rspec ruby-on-rails minitest

我刚刚观看了Minitest 的Railscast.

使用RSpec与Minitest测试rails应用程序的优缺点是什么?我将失去哪些功能从RSpec转换为Minitest?

Myr*_*ton 74

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

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

作为一直在不断进行测试和练习TDD的人,我发现RSpec的强大功能让我非常有用.然而,许多人发现它有点矫枉过正,并且额外的抽象会增加认知成本.

以下是RSpec的一些具体功能,我相信minitest缺乏:

  • before(:all) 钩子(请注意这是RSpec的高级用户功能,应该很少使用;我在使用RSpec的多年中仅使用过几次)
  • around(:each) 挂钩
  • 共享示例组
  • 共享上下文
  • 丰富的元数据支持,可用于控制运行哪些示例,哪些示例组共享上下文包含在内,哪些示例组模块可以混合使用等等.
  • 集成支持各种模拟功能w/rspec-mocks; 相比之下,Minitest :: Mock更简单,更有限.
  • RSpec有rspec-fire,很棒.

使用Minitest的好处:

  • 它内置于标准库中,因此您无需额外安装任何东西.
  • 它可以用于def test_blahit 'blah'样式.
  • 代码库非常小而且简单.RSpec凭借其较老的年龄和附加功能,相比之下更大.
  • Minitest的加载速度比RSpec快(与RSpec相比,大约有4个代码文件,其中有许多文件分布在3个宝石中) - 但请注意,RSpec绝不慢; 在我的大多数项目中,我在不到一秒的时间内(通常在500毫秒内)从RSpec获得测试反馈.

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

最后一件事:如果Minitest有特定的方面你想要更好,但是你对RSpec更喜欢的其他东西,它们很容易混合和匹配.如果您有兴趣,我写了一篇关于此的博文.