BDDとTDDの関係


30

BDDとTDDの関係は何ですか?

私が理解したことから、BDDはTDDよりも2つの主要なものを追加します。テストの命名(保証/すべき)と受け入れテストです。BDDによる開発中にTDDに従う必要がありますか?「はい」の場合、TDDユニットテストの名前は同じシュア/スタイルで指定する必要がありますか


1
BDDは、十分に立証TDDS(Unitests)の集合である
DD

Behavior Driven Designキャンプから回答を追加したい人はいますか?私の観点からは、これらの答えはすべて、BDDの最初の数回の繰り返しに関するものです。最近のBDDのアプリケーションの成功は、設計に近いことが多く、適切な場合には自動テストを完全に省略することさえあります。
ポールヒックス

BDDとTDDの違いは、マクロ経済学とミクロ経済学の違いに似ています。BDD =例を使用して要件の理解を構築し、オプションで自動マクロテストを実行するために使用できます。(agilenoir.biz/en/am-i-behavioral-or-not)、TDD =コーディングを駆動するためのマイクロテストの作成。アジャイル思考ポッドキャストはこれらの違いもカバーしています:agilenoir.biz/en/agilethoughts/test-automation-pyramid-series
Lance Kind

回答:


37

BDDはTDDサイクルの周りにサイクルを追加します。

そのため、振る舞いから始めて、それがテストを推進し、テストが開発を推進させます。理想的には、BDDはある種の受け入れテストによって駆動されますが、それは100%必要というわけではありません。予想される動作が定義されている限り、問題ありません。

それで、ログインページを書いているとしましょう。

ハッピーパスから始めます。

Given that I am on the login page
When I enter valid details
Then I should be logged into the site
And shown my default page

このギブアンドアンドホエンアンドザアンドアンド構文は、行動駆動型開発では一般的です。それの利点の1つは、非開発者がそれを読み取ることができる(そして、トレーニングで、書かれている)ことです。つまり、利害関係者は、タスクを正常に完了するために定義した動作のリストを表示し、不完全な製品をリリースするずっと前に、彼らの期待に応えます。

Gherkinとして知られるスクリプト言語があります。これは上記によく似ており、これらの動作の句の背後にテストコードを記述できます。通常の開発フレームワーク用のGherkinベースのトランスレーターを探す必要があります。これはこの答えの範囲外です。

とにかく、ふるまいに戻ります。現在のアプリケーションはまだこれを行っていないのに(もしそうなら、なぜ誰かが変更を要求しているのでしょうか?)、テストランナーを使用しているのか、単に手動でテストしているのかにかかわらず、このテストに失敗します。

そこで、TDDサイクルに切り替えてその機能を提供するときが来ました。

BDDを書いているかどうかに関係なく、テストには共通の構文の名前を付ける必要があります。最も一般的なものの1つは、説明した「should」構文です。

テストを書く:ShouldAcceptValidDetails。満足できるまで、Red-Green-Refactorサイクルを繰り返します。動作テストに合格しましたか?そうでない場合は、別のテストを作成します:ShouldRedirectToUserDefaultPage。あなたが幸せになるまで赤緑リファクタリング。行動に設定された基準を満たすまで、洗浄、すすぎ、繰り返します。

そして、次の動作に進みます。

Given that I am on the login page
When I enter an incorrect password
Then I should be returned to the login page
And shown the error "Incorrect Password"

これで、以前の動作をパスするためにこれを先取りしてはいけません。この時点でこのテストに失敗する必要があります。TDDサイクルに戻ってください。

といった具合に、ページが完成します。

Ruby開発者ではない場合でも、BDDおよびTDDの詳細については、The Rspec Bookを強くお勧めします。


コメントを入れていただけますか?私はまだ...それを得ることはありません
ハニー

4

私の理解:

  • BDDは、行動に焦点をより明確にするためにTDDのブランド変更として始まりました。
  • 動作と実行可能な仕様に焦点を当てるために、より正式なサポート(DSLおよびツール)を提供します。
  • BDDはTDDのスーパーセットと見なすことができます。それは時間の経過とともに成長し、より多くの要件抽出側を含むようになりましたが、それでも開発プロセス側はその中核部分です。

そのため、BDDの適切な部分であるTDDに対処します。BDDは、プロセスの意図を明確にするためのTDDの言語の変更として始まりました。 Dan Northの BDDに関する入門記事では、テストではなく動作という言葉に焦点を当てるのがなぜ役に立つのかを説明しています。これは、ソフトウェアを正しく構築しているだけでなく、適切なソフトウェアを構築していることを確認するのに役立ちます。これは常に優れたTDDアプローチの一部でしたが、ダンはそれをBDDに成文化しました。


私が思うに、BDDはTDDよりも少し明確にしたり、少なくとも公式化してツールサポートを提供したりするのは、この2サイクル/ダブルループ/ズームインズームアウト/アウトサイドインアプローチです。まず、機能の予想される動作(外側のループ)を説明し、次に内側のループにズームインして、低レベルの仕様に対処します。

ダブルループTDDhttp://www.metesreau.com/ncraft-workshop/ から

GherkinはCucumberやSpecFlowなどのツールと組み合わせて、これらの高レベルの機能仕様を記述し、アプリケーションコードを実行するコードにリンクする方法を提供します。私は、これがBDDがTDDとは異なると感じるかもしれないと主張しますが、実際には同じことを行っており、ツールサポートとDSLが追加されています。「従来の」TDDに少し近いのは、rspec、nspec、spockなどのツールを使用することです。これらは、「従来の」TDDで行うのと同じプロセスに少し似ていますが、より行動に焦点を当てた言語を使用します。

活動するBDD(強く推奨)ジョン・ファーガソンスマートによって、彼はその後、低レベルの仕様については、スポックのようなツールに落下、外側のレベルの実行可能な仕様でjBehaveのようなものから始めて、ダブルループアプローチを提唱しています。


BDDは、テスト駆動の概念をビジネスの利害関係者により近づけます。Gherkinはビジネスで読めるように設計されており、「リビングドキュメント」、つまり実行可能な仕様から自動的に生成される進捗レポートのアイデアは、利害関係者にフィードバックを与えることです。

現在のBDDのもう1つの部分は、それが本当に大規模なプロセスの一部としてTDDを組み込むものになる場所であり、要件の引き出しの要素です。機能インジェクション、インパクトマッピング、リアルオプションなどのアイデアは、この側面の一部です。

これに関する標準的な回答については、ダンノースに再度行くのが最善かもしれません。チームがすべて開発者である場合、BDD = TDDです。チームにさまざまな利害関係者が関与している場合、BDDはXPに近く、TDDはその一部です。


2

BDDとTDDの関係は何ですか?

それらは同じものです。

私が理解したことから、BDDはTDDを超える2つの主なものを追加します:テストの命名(保証/すべき)

それは実際にはBDDが「追加」するものではありません。これは、TDDの教育と理解を容易にするための別の規則です。

BDDを作成した人たちはすべてTDDを教えていましたが、理解するのが最も難しいのは、TDDがテストとはまったく関係がないということです。学生がそのハードルを乗り越えると、彼らにとってははるかに簡単になりました。しかし、「テスト」という言葉(または「アサート」などの関連用語)が実際にどこにでも現れる場合、テストについて考えることから離れることは非常に困難です。そこで、彼らはいくつかの言葉を入れ替えました。

しかし、それは言葉だけです!TDDとBDDの間に実際の違いはありません

および受け入れテスト。

受け入れテストは、BDDと同様にTDDの重要な部分です。繰り返しますが、TDDとBDDの間に違いはありません。TDD 正しく行われているの BDD、BDD TDDが正しく行われています。


受け入れテストはどのようにTDDの重要な部分ですか?
SiberianGuy

@Idsa:コードは、パスする必要があると思われるテストではなく、コードが行うはずのテストにパスする必要があるという点で重要です。これに戸惑う人が多すぎると思います。ほとんどのユニットテストは低レベルであり、システムが全体として行うように書かれたものをテストするという難しい問題を回避します。
gbjbaanb

@Idsa:BDDにとって重要であるのと同じように、もちろん、2つは同じものです!受け入れテストは、APIやプロトコルなどを扱うより詳細な内部サイクルではなく、機能とユーザーを扱うTDDの外部サイクルを駆動します。ケント・ベックはこれを「ズームイン/ズームアウト」と呼んでいると思います。たとえば、JUnitテストスイートでこれを簡単に確認できます。JUnitテストスイートには、おそらく単体テストと同じくらいの受け入れテストが含まれています。
ヨルグWミットタグ

受け入れテストはTDDおよびBDDの重要な部分です。しかし、BDDがTDDに等しいと言うことは、TDDがテストファーストに等しいと言うことに似ています。テストでコードを実行できるようにしない限り、TDDを実行していません(テストを前もって書いて喜んでいる人を知っていましたが、ユニットを書いていない場合のようにコードを常に書くべきだと主張していました)テストとそのテストはそれに応じて作成する必要があります)。同様に、ビヘイビアーがテストを実行することを許可していない限り、BDDは実行していません。
pdr

1
@Idsa:受け入れテストを含まない TDDの誤った説明が多くあることに注意してください。それら-残念ながらかなり人気があり、かなり広く教えられている-間違った説明は、混乱を避けるために、BDDの人々がTDDを別の名前でブランド変更するのが良い考えだと思った理由の1つです。それにもかかわらず、それを十分な頻度で繰り返すことはできませんが、TDDとBDDはまったく同じものです。
ヨルグWミットタグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.