web-dev-qa-db-ja.com

ミニテストとRspec

ミニテストの Railscast を見たところです。

RailsアプリをテストするためにRSpecとMinitestを使用する場合の長所と短所は何ですか?RSpecからMinitestへの変換で失われる機能はどれですか?

49
GTDev

私はRSpec開発者の1人であり、minitestを使用したことがないので、この回答を読むときは私の偏見を考慮に入れてください。

概して、RSpecのパワーは、非常に多くのテスト概念をファーストクラスのオブジェクトに具体化するという事実から来ています。 Test :: UnitとMinitestがアサーションを作成するための単純なメソッドを使用する場合、RSpecは否定、自己記述などをサポートするファーストクラスのマッチャーオブジェクトを使用します。 RSpecの例は、豊富なメタデータをサポートするファーストクラスのオブジェクトです。 minitest/specはitブロックを単純なメソッドにコンパイルしますが、これは同じ種類の豊富なメタデータをサポートしていません。 RSpecは、引数を受け入れるファーストクラスコンストラクト(共有サンプルグループ)を使用した共有動作の指定をサポートしています。 w /ミニテスト 継承またはテストを再利用するためのミックスイン を使用できますが、同じ種類のファーストクラスのサポートはありません。 RSpecには明示的なフォーマッターAPIがあります(それを使用するサードパーティのフォーマッターが多数あります)。 minitestが同じ種類のファーストクラスのフォーマッターAPIを持っていることは知りません。

常にテストを実行し、終日TDDを実践している人として、RSpecが非常に役立つことがわかりました。しかし、多くの人々はそれがやり過ぎだと感じており、追加の抽象化には認識コストが追加されます。

RSpecには、minitestに欠けていると私が信じている特定の機能があります。

  • before(:all)フック(これはRSpecのパワーユーザー機能であり、めったに使用されないことに注意してください。私は、長年のRSpecの使用で数回しか使用していません)
  • around(:each)フック
  • 共有サンプルグループ
  • 共有コンテキスト
  • 実行されるサンプル、共有コンテキストが含まれるサンプルグループ、モジュールが混在するサンプルグループなどを制御するために使用できる豊富なメタデータサポート。
  • Rspec-mocksを使用した幅広いモック機能の統合サポート。 Minitest :: Mockは、比較してはるかにシンプルで、制限があります。
  • RSpecには rspec-fire があり、これはすばらしいことです。

Minitestを使用する利点:

  • 標準ライブラリに組み込まれているため、追加でインストールする必要はありません。
  • def test_blahまたはit 'blah'スタイル。
  • コードベースは非常に小さくシンプルです。 RSpecは、その古い時代と追加機能のために、比較して大きくなっています。
  • MinitestはRSpecよりも高速にロードされます(3つのGemに多くのファイルが分散しているRSpecと比較すると、コードのファイル数は約4です)。ただし、RSpecが決して遅くないことに注意してください。最近のほとんどのプロジェクトでは、RSpecから1秒未満(そして多くの場合500ミリ秒未満)でテストフィードバックを受け取っています。

全体的に、それはSinatra対Railsに少し似ており、ニーズに応じて、MinitestとRSpecはどちらも良い選択だと思います。

最後にもう1つあります。Minitestに特定の側面があり、RSpecのより良い部分がある場合は、それらを簡単に組み合わせることができます。私は これについてブログ記事を書いた 、もし興味があれば。

74
Myron Marston

shouldaを使用してTest/Unitからスペックスタイルのミニテストに変換しました。それはボイラープレートを排除し、速度も改善すると彼らは言う。 RSpecを実際に使用したことはありません。代わりに、私は独自のプリミティブテストおよびモッキングフレームワークを記述しました(モッキングを理解する目的で、Minitestに切り替えたときにそれを放棄しました)。 RSpecでのスタブ/モックはもっと進んでいると思いますので、もしあなたがすでにそれを学んだなら、そのまま使い続けてください。それ以外の場合は、Minitestを使用してください。これにより、RSpecを知らない人(私など)とのコラボレーションが可能になります。

4
Boris Stitnicky