理論
まず、ビヘイビア駆動開発(以降BDD)とは何か、この手法がテスト駆動開発(以降TDD)とどのように異なるかを見てみましょう。
テストによる開発(英語のテスト駆動開発)は、プログラムまたはそのフラグメントの単体テストをプログラム自体の前に記述し(英語のテストファースト開発)、本質的にその開発を制御するプログラミング手法です。 それは極端なプログラミングの主な習慣の1つです。
事前テストのアプローチは多くの人に有効ですが、すべての人に適しているわけではありません。 TDDの適用に成功したすべてのアプリケーション開発者に対して、このアプローチを積極的に拒否する開発者が数人います。 TestNG、Selenium、FESTなどの多くのテストインフラストラクチャにもかかわらず、コードテストを行わない理由はまだたくさんあります。
TDDを削除する2つの一般的な理由は、「テストする時間がない」と「コードが複雑すぎて検証が難しい」です。 事前記述テストを使用したプログラミングのもう1つの障害は、「コードの前にテストを記述する」という概念そのものです。 ほとんどの場合、テストは具体的なアクションであり、抽象的ではありません。 経験から、まだ存在しないものを検証することは不可能であることが示唆されています。 この概念のフレームワーク内にとどまる一部の開発者にとって、予備テストのアイデアは単なる矛盾です。
しかし、テストの作成やコンポーネントのテストの観点から考えるのではなく、機能について考え始めるとしたらどうでしょうか? 機能性について言えば、アプリケーションの動作方法、実際にはその仕様を意味します。
実際、私たちのほとんどはすでにこのように考えています。 参照:
フランク:スタックとは何ですか?
Linda:これは、オブジェクトを「先入れ先出し」または「後入れ先出し」の順序で保管するデータ構造です。 通常、この構造には、push()やpop()などのメソッドを持つAPIがあります。 時々peek()メソッドが存在します。
フランク:push()メソッドは何をしますか?
Linda:push()メソッドは、fooなどの入力オブジェクトを受け取り、配列などの内部コンテナーに配置します。 通常、push()メソッドは何も返しません。
フランク:2つのオブジェクトをpush()メソッドに渡すと、たとえば、最初にfooを、次にbarを渡すとどうなりますか?
Linda:2番目のbarオブジェクトは、少なくとも2つのオブジェクトを含む概念スタックの最上部にある必要があるため、pop()メソッドが呼び出されると、最初のfooオブジェクトの前にbarオブジェクトを最初に抽出する必要があります。 pop()メソッドが再び呼び出されると、fooオブジェクトが返され、スタックが空になります(これら2つのオブジェクトを追加する前に何もなかったと想定されます)。
フランク:それで、pop()メソッドはスタックに最後に追加されたアイテムを削除しますか?
Linda:はい。pop()メソッドは一番上の要素を削除する必要があり、スタック内にそれらを削除する要素があると想定されています。 peek()メソッドも同じように機能しますが、オブジェクトは削除しません。 peek()メソッドは、スタックの一番上の要素を残す必要があります。
フランク:スタックに何も追加されていないときにpop()メソッドを呼び出すとどうなりますか?
Linda:pop()メソッドは、スタックにまだ何も追加されていないことを示す例外をスローする必要があります。
フランク:push()nullコマンドを実行するとどうなりますか?
Linda:nullはpush()メソッドの有効な値ではないため、スタックは例外をスローする必要があります。
フランクがデータ構造に強くないことを除いて、このダイアログで特別なことを強調できますか? 「テスト」という言葉はどこでも使われていません。 しかし、「すべき」という言葉は定期的に省略され、非常に自然に聞こえました。
BDDアプローチは、新しいものでも革新的なものでもありません。 これは単に、「テスト」という言葉が「すべき」という言葉に置き換わるTDDアプローチの進化的な派生物です。 言葉を脇に置いておくと、多くの人は、「テスト」の概念よりも開発プロセスにとって「当然」の概念がより自然であることに気付くでしょう。 機能(コードが何をすべきか)の観点から考えると、仕様をテストするためにクラスが最初に記述されたときのアプローチにつながります。
練習する
RSpecはRubyのBDDフレームワークです
インストール:
[sudo] gem install rspecどちらか
git clone git://github.com/dchelimsky/rspec.git顧客が銀行であることを想像してみましょう。 もう一度、BDDのスタイルで顧客との対話を示します。
cd rspec
熊手
rake install_gem
あなた:アカウント作成後のアカウントの内容を教えてください?
顧客:アカウントの残高は0ドルである必要があります。
RSpecでこの会話を説明する方法は次のとおりです。
describe Account, " when first created" do
before do
@account = Account. new
end
it "should have a balance of $0" do
@account.balance.should eql(Money. new (0, :dollars))
end
after do
@account = nil
end
end
* This source code was highlighted with Source Code Highlighter .
この例を実行すると、RSpecは同様の説明を返す場合があります。
アカウント、最初の作成時
-残高が0ドルである必要があります
コードで#beforeおよび/または#afterブロックを使用する方法の例:
describe Thing do
before(:all) do
# This is run once and only once, before all of the examples
# and before any before(:each) blocks.
end
before(:each) do
# This is run before each example.
end
before do
# :each is the default, so this is the same as before(:each)
end
it "should do stuff" do
...
end
it "should do more stuff" do
...
end
after(:each) do
# this is before each example
end
after do
# :each is the default, so this is the same as after(:each)
end
after(:all) do
# this is run once and only once after all of the examples
# and after any after(:each) blocks
end
end
* This source code was highlighted with Source Code Highlighter .
結論として
記事が好意的なレビューを受けた場合、このトピックに関する一連の記事が表示されます。
手始めに、詳細な自習用のリンクをいくつか以下に示します。
公式文書
優れたステップバイステップマニュアル(英語)
テストによる開発(rus。)
行動駆動開発(BDD)の紹介(ロシア語)
BDD定義
簡単なRSpecマニュアル
TDDの定義(ロシア語)