きゅうりとBDD

最初にコードを記述してからテストすることに慣れている場合、BDDではこのアプローチはまったく適切ではありません。 BDDの長所は、ToRの設計段階から開発をリードするのに役立つことです。 BDDの場合、これはプロパティ(機能)のリストであり、顧客との記述に適しています。



しかし、最も重要なのは、プロジェクトが同じリストで自動的にテストされることです。 テストツール(この場合はCucumber)は、リストを系統的に調べ、各機能の実装を注意深くチェックします。



Cucumberを使用した開発は、3つの主要なステップで構成されています。

  1. 単純な人間の言語でのプロジェクト機能の説明。 そして、 必ずしも英語はありません
  2. Rubyステップ定義
  3. 開発サイクル:cuckumberで機能をチェックし、ハンドルで失敗した機能を実装します。




このサイクルの最後に、すべてのプロパティがキュウリコントロールを通過すると、新しい機能のリストを顧客に承認し、サイクル全体を再度実行します。 すべてのプロパティを実装(追加および検証)するまでこれを行います。



第一段階。 特徴





一覧


たとえば、私たちはいつものように、新しいブログを開発しています。 そのため、ブログのプロパティをファイル./features/blog.features



ます。 各プロパティについて、Why、Who、およびWhat(順序、A、Should)の概念も説明します。 これらはBDDの願いであり、実際、結果には影響しませんが、この機能から望むものをより明確に明確にするのに役立ちます。



機能:記事の投稿

  旅行の写真を見せるために
  所有者
  記事を投稿できるようにする必要があります

機能:コメントを作成する

  連絡するために
  ユーザー
  コメントをすることができるはずです




もちろん、すべてのプロパティをすぐに書き出す必要はありません。近い将来に実装する予定のプロパティの十分な数です。



シナリオ




プロパティには、1つ以上の動作シナリオがあります。 このシナリオでは、テストが行​​われます。 各シナリオは、条件(指定)、イベント(タイミング)、結果(次に)の3つのカテゴリで説明されています。 複数の条件、イベント、または結果がある場合は、追加の条件がAnd / Butを介して登録されます。



機能:記事の投稿

  旅行の写真を見せるために
  所有者
  記事を投稿できるようにする必要があります
 
  シナリオ:所有者による記事の投稿

    私が所有者としてサインアップしたことを考えると
     「最後の近距離旅行について」という記事を書くとき
    記事のテキストは「非常に大変な夜でした。」
    そして、記事を投稿します
    次に、「記事が作成されました」と表示されます

  シナリオ:ユーザーによる記事の投稿

    ユーザーとしてサインアップすると
    私の記事「私の幻想」を書くとき
    記事のテキストは「..no more」です
    そして、記事を投稿します
    次に、「記事を投稿するアクセス権がありません」と表示されるはずです。




この段階では、人とテストツールが理解できる機能のリストが既にあります。 そして今、あなたは実行することができます:



 >キュウリの機能/ blog.features

 ...

 2つのシナリオ(2つの未定義)
 12ステップ(12未定義)
 0m0.012s

次のスニペットを使用して、未定義のステップのステップ定義を実装できます。

与えられた/ ^私は所有者としてサインアップしました$ / do
  保留中
終わり

 / /私が記事を書いたとき "([^ \"] *) "$ / do | arg1 |
  保留中
終わり

 / ^記事のテキストが "([^ \"] *) "$ / do | arg1 |
  保留中
終わり

いつ/ ^記事を投稿する$ / do
  保留中
終わり

それから/ ^ "([^ \"] *) "$ / do | arg1 |
  保留中
終わり




Cucumberは、次に何をすべきか、どのアクションを決定する必要があるかを示します(ステップ定義)。



ステージ2.アクションの定義(ステップ定義)





キュウリのヒントを/features/step_definitions/blog_steps.rb



コピーし、アクションを書き留めます。例:



    与えられた/ ^私は(。*)としてサインアップしました$ / Do | role |
        current_user = User.find_by_role(ロール)
    終わり

     / /私が記事を書いたとき "([^ \"] *) "$ / do | arg1 |
         aricle = Article.create(:subject => arg1 ,: user => user)
         same_subject =件名
    終わり

     / ^記事のテキストが "([^ \"] *) "$ / do | arg1 |
       aricle.text = arg1
    終わり

    いつ/ ^記事を投稿する$ / do
       artricle.save!
    終わり

    それから/ ^ "([^ \"] *) "$ / do | arg1 |
        response.should(arg1)
    終わり




これで、機能のリストとその動作が定義されました。



ステージ3.テストと開発





テストを実行します。



 >キュウリの機能/ blog.features

機能:記事の投稿
  旅行の写真を見せるために
  所有者
  記事を投稿できるようにする必要があります

  シナリオ:所有者による記事の投稿#features / blog.features:6
    所有者として登録した場合#features / step_definitions / blog_steps.rb:1
      初期化されていない定数User(NameError)
       features / blog.features:7:「所有者として登録した場合」
     「私の最後の旅行について」という記事を書くとき#features / step_de




ご覧のとおり、キュウリはユーザーを知らないと報告しました。 この場合、ユーザーモデルコードを作成します。



Cucumberを再び起動します。 このナズに、彼は別の間違いを誓います-私たちはそれを修正するためなどに別のコードを実装しています それまで。



キュウリがすべてのテストに合格すると、すべてのコードが実装されます。 このようにして、第3段階が完了し、アプリケーションのさらなる設計と新しい機能の実装に進むことができます。



興味深い場合は、次回、実際のアプリケーションがCucumber, Shoulda



webrat



ウィザードでどのように開発されているかを説明します。



PS





材料:



cukes.info-ウェブサイトキュウリ

nlp.od.ua/behavoir-driven-development-ロシア語でBDDについて

railscasts.com/episodes/155-beginning-with-cucumber-初心者向けスクリーンキャストCucumber

github.com/thoughtbot/clearance/tree/master-クリアランスには素晴らしいキュウリの例があります



All Articles