この記事は技術的すぎるため、ほとんどの読者には理解しにくいかもしれません。技術的な詳細を削除せずに、( 2017年2月) |
| Rスペック | |
|---|---|
| 開発者 | スティーブン・ベイカー、デビッド・チェリムスキー、マイロン・マーストン、アンディ・リンデマン、ジョン・ロウ、ポール・カサレット、サム・フィッペン、ブラッドリー・シェーファー[ 1 ] |
| 初回リリース | 2007年5月18日[ 2 ] (2007年5月18日) |
| 安定版リリース | |
| リポジトリ | |
| オペレーティング·システム | クロスプラットフォーム |
| タイプ | 行動駆動開発フレームワーク /テストツール |
| ライセンス | MITライセンス |
| Webサイト | rspec |
RSpec はRuby コードをテストするためにプログラミング言語Rubyで書かれたコンピュータドメイン固有言語(DSL) (特定のアプリケーションドメイン)テストツールです。 [ 4 ]これは動作駆動開発(BDD)フレームワークであり、本番アプリケーションで広く使用されています。この概念の背後にある基本的な考え方はテスト駆動開発(TDD) であり、最初にテストを記述し、開発はそれらのテストを満たすのに十分なコードを記述することに基づいており、その後リファクタリングが行われます。JMockに基づいてフレームワークに完全に統合された独自のモックフレームワークが含まれています。[ 5 ] RSpec 構文のシンプルさから、Ruby アプリケーション用の人気のあるテストツールの 1 つとなっています。RSpec ツールは、、およびの 3 つの他の gem で構成されるgemをインストールすることによって使用できます[ 4 ]rspecrspec-corerspec-expectationrspec-mock.
RSpecは、2005年にSteven Baker氏と彼のチームメンバーであるDave Astels氏、Aslak Hellesøy氏、David Chelimsky氏によって実験的に開始されました。Chelimsky氏は、Ruby on Railsとの統合を容易にするRSpec-Railsの開発を担当しました。最初のリリースであるRSpec 1.0は2007年5月にリリースされ、RSpecの主要機能を多数含み、最新リリースにも含まれています。しかし、テスト速度などの技術的な問題により、後に開発は中止されました。RSpecの3番目のバージョンであるRSpec 3は2014年7月にリリースされ、verify doubleやcomposable matcherなど、多くの新機能が追加されました。
前述のように、RSpecはオブジェクトの振る舞いを記述するためのドメイン固有言語を提供します。RSpecで使用されるキーワードは、他の言語やTDDフレームワークで使用されるキーワードと類似しています。[ 6 ]例えば、Test::Unitで使用されるキーワードは、以下のようにRSpecのキーワードにマッピングできます。
同じコンテキストで使用されているにもかかわらず、似たような名前を持つキーワードは数多くあります。RSpecの構文は読みやすさを提供し、コードの挙動を記述することでプログラマーに自由度を与えます。すべてのテストフレームワークは、あるコンテキストが与えられ、あるイベントが発生したときにどのような結果が期待されるかというフローで動作します。describe ()、context()、it()などのメソッドは、それぞれテストコードのアナロジーとスケルトンを形成します。
describe ()メソッドは、クラス、メソッド、またはサンプルグループを記述するために使用されます。これは実際にテストコードを含む外側のブロックであり、その中に含まれるコードの特性を表します。このメソッドは、いくつかの引数とオプションのブロックを受け取ります。[ 6 ]ただし、通常は1つまたは2つの引数を使用してサンプルグループの動作を記述します。最初の引数はクラスまたはモジュールへの参照を表し、2番目の引数はオプションで、データ型はStringになります。[ 6 ]サンプルグループはネストすることもできます。describe メソッドの使用例は次のとおりです。[ 6 ]
ユーザーを記述します、「アカウント残高がありません」{ .... } =>アカウント残高がないユーザーcontext ()ブロックは、describe ブロックで記述されたクラスまたはメソッドが使用されているコンテキストを記述するために使用されます。このシナリオでは、これはdescribe()という単語の別名とみなすことができ、どちらも互換的に使用できます。一般的に、describe()は物に対して、context()はコンテキストに対して使用されます。これは、異なるシナリオで異なる結果を試すのに役立ちます。上記の例は、context()メソッドを使用して次のように記述できます。[ 6 ]
ユーザーを記述するコンテキスト「アカウント残高がありません」を実行する....終了終了[ 6 ] context()を使用すると、仕様ファイルのスキャンが容易になり、それが何に関連しているのかが明確になります。
これは、コンテキスト内のサンプルの仕様を記述するRSpecメソッドです。it ()ブロックは文字列を引数として取り、キーワード「it」の後の文字列は、ブロックが実行することが期待される関数、つまりテストケースと見なすことができます。次の例を考えてみましょう。[ 6 ]
ユーザのコンテキストを記述し、「口座残高がありません」と入力します。「住宅ローンを承認することはできません」と入力します。「口座残高がないため、ローンを承認することはできません。」と入力します。RSpecにおいて、期待値とは、コード例の実行における特定の時点で、何かがどのような状態にあると期待されるかを表す文です。RSpecは、シンプルなフレームワークと、should()やshould_not()といったキーワードを用いて期待値を表現します。RSpecは、一般的な演算だけでなく、あまり一般的ではない式に対しても、期待値と一致するものを探すマッチャー(オブジェクト)をサポートしています。例えば、ある結果の期待値が数値5だとすると、同じ結果に対応するマッチャーequalを使用するRSpecの期待値は以下のように記述されます。[ 6 ]
result.should equal(5)
RSpecは、役割やインターフェースの発見に焦点を当てることを容易にするテストダブルを作成するためにRSpec::Mocksと呼ばれるライブラリを提供していますが、何よりも実装された依存関係なしで進歩することで結合と非決定性からの分離を提供します。[ 6 ]
RSpec は、数多くのテキストエディタやカバレッジスイートでサポートされています。また、RSpec は、ドメイン固有のニーズに合わせて RSpec を拡張するためのユーティリティや拡張ポイントも多数提供しています。例えば、グループや例に関連付けられたメタデータを使用してレポートを作成したり、グローバル設定を使用して各例グループに before ブロックと after ブロックを割り当てたり、マクロを使用したりといったことが 可能です。
1. RSpec を使い始める: (インストール手順) http://rspec.info/
2. Beck, K. (2014).例によるテスト駆動開発.ボストン: Addison-Wesley.