Behavior-driven-development-quick-guide
行動駆動開発-はじめに
行動駆動開発(BDD)は、テスト駆動開発(TDD)から生まれたソフトウェア開発プロセスです。
BDDの進化を担当しているDan North氏によると、「BDDは、複数のレベルで例を使用して、重要なソフトウェアを提供するための共通の理解と表面の不確実性を生み出しています。」
BDDは例を使用して、開発に携わるすべての人にとって読みやすく理解しやすい言語で記述されたシステムの動作を示します。 これらの例が含まれます-
- 実行可能な仕様に変換されます。
- 受け入れテストとして使用されます。
BDD –主な機能
行動駆動型開発は次のことに焦点を当てています-
- ソフトウェア開発者、ビジネスアナリスト、および利害関係者とのコミュニケーションを促進する共有プロセスと共有ツールを提供して、ビジネス価値のある製品を提供することを目的として、ソフトウェア開発で協力します。
- システムの実装方法ではなく、システムが行うべきこと。
- 読みやすさと可視性の向上。
- ソフトウェアの動作だけでなく、顧客の期待に応えていることを確認します。
BDDの起源
欠陥が適切なタイミングで検出されず、検出された時点で修正されると、欠陥を修正するためのコストは倍増します。 次の例を考えてください。
これは、要件が正しく取得されない限り、後の段階で要件を誤解した結果生じる欠陥を修正するのに費用がかかることを示しています。 さらに、最終製品が顧客の期待に応えられない場合があります。
時間の必要性は、開発アプローチです-
- 要件に基づいています。
- 開発全体の要件に焦点を当てています。
- 要件が満たされていることを確認します。
上記の要件を処理できる開発アプローチはBDDです。 したがって、行動駆動開発-
- システムのさまざまな予想される動作の例を導き出します。
- ビジネスドメインの用語を使用して言語で例を記述できるようにし、顧客を含む開発に関わるすべての人が簡単に理解できるようにします。
- 会話を使用して、時々顧客と批准した例を取得します。
- 開発全体の顧客要件(例)に焦点を当てています。
- 受け入れテストとして例を使用します。
BDDプラクティス
BDDの2つの主なプラクティスは次のとおりです-
- 例による指定(SbE)
- テスト駆動開発(TDD)
例による仕様
Example by Specification(SbE)は、会話の例を使用して、ビジネスルールと構築するソフトウェアの動作を示します。
例による仕様により、製品所有者、ビジネスアナリスト、テスター、および開発者は、ビジネス要件に関する一般的な誤解を排除できます。
テスト駆動開発
BDDのコンテキストでのテスト駆動開発は、例を人間が読める実行可能な仕様に変えます。
開発者は、これらの仕様をガイドとして使用して、新しい機能の増分を実装します。 これにより、無駄のないコードベースと一連の自動化された回帰テストが行われ、ソフトウェアのライフタイム全体にわたってメンテナンスコストが低く抑えられます。
アジャイルBDD
アジャイルソフトウェア開発では、BDDメソッドを使用して、保留中の仕様について共通の理解を得ることができます。
以下の手順は、アジャイルBDDで実行されます-
- 開発者と製品所有者は、プレーンテキストエディターで共同で保留中の仕様を記述します。
- 製品所有者は、システムに期待する動作を指定します。
- 開発者
- これらの動作の詳細を仕様に入力します。
- システムの理解に基づいて質問します。
- 現在のシステムの動作は、新しい機能が既存の機能を破壊するかどうかを確認するために考慮されます。
アジャイルマニフェストとBDD
アジャイルマニフェストは次のように述べています-
私たちは、ソフトウェアを開発し、他の人がそれを行うのを支援することにより、ソフトウェアを開発するより良い方法を発見しています。 この作業を通じて、私たちは価値になっています-
- 個人と相互作用-プロセスとツールより
- 動作ソフトウェア-包括的なドキュメント
- 顧客コラボレーション-契約交渉
- 変更への対応-計画に従う
つまり、右側の項目には値がありますが、左側の項目にはさらに値を付けます。
BDDは次のようにアジャイルマニフェストに合わせます-
Agile Manifesto | BDD Alignment |
---|---|
Individuals and interactions over processes and tools. | BDD is about having conversations. |
Working software over comprehensive documentation. | BDD focuses on making it easy to create software that is of business value. |
Customer collaboration over contract negotiation. | BDD focuses on scenarios based on ideas with continuous communication with the customer as the development progresses. It is not based on any promises. |
Responding to change over following a plan. | BDD focuses on continuous communication and collaboration that facilitates absorption of changes. |
BDD-テスト駆動開発
行動駆動開発に関する参考資料を見ると、「BDDはTDDから派生している」、「BDDおよびTDD」などのフレーズの使用法がわかります。 BDDがどのように生まれたのか、なぜTDDから派生したと言われているのか、BDDとTDDとは何かを知るには、TDDを理解する必要があります。
テストする理由
最初に、テストの基本について説明します。 テストの目的は、構築されたシステムが期待どおりに動作することを確認することです。 次の例を考えてください。
したがって、経験から、導入された時点で欠陥を発見し、すぐに修正することは費用対効果が高いことを学びました。 したがって、開発とテストのすべての段階でテストケースを作成する必要があります。 これは、従来のテスト手法が教えてくれたことであり、テスト初期と呼ばれることがよくあります。
このテストアプローチは、テストがステージの完了後に行われるため、テストラストアプローチと呼ばれます。
テスト最終アプローチの課題
Test-Lastアプローチは、ソフトウェア開発プロジェクトでかなり長い間続いていました。 ただし、実際には、このアプローチでは、特定の段階が完了するまでテストを待機する必要があるため、次の理由で見過ごされがちです-
- ステージの完了の遅延。
- 厳しいスケジュール。
- テストをスキップして、時間通りの配達に焦点を合わせます。
さらに、Test-Lastアプローチでは、開発者が行うことになっている単体テストはしばしばスキップされます。 見つかったさまざまな理由は、開発者の考え方に基づいています-
- 彼らは開発者であり、テスターではありません。
- テストはテスターの責任です。
- これらはコーディングが効率的であり、コードに欠陥はありません。
この結果-
- 提供される製品の品質を損なう。
- テスターのみの品質に対する説明責任を持ちます。
- 欠陥の修正、配達後の高コスト。
- 顧客満足度を獲得できないことは、繰り返しのビジネスの損失を意味し、信頼性に影響を与えます。
これらの要因は、テストに焦点を合わせるために、パラダイムのシフトを求めました。 その結果がテストファーストのアプローチでした。
テストファーストアプローチ
Test-Firstアプローチは、インサイドアウト(コードを記述してからテスト)をアウトサイドイン(テストを記述してからコード)の開発方法に置き換えます。
このアプローチは、以下のソフトウェア開発方法論に組み込まれています(アジャイルでもあります)-
*e* *X* *treme* *P* * rogramming( *XP* )。
* * *T* *est* *D* *riven* *D* * evelopment(TDD)。
これらの方法論では、開発者はコードモジュールの単一行を記述する前に、コードモジュールの単体テストを設計および記述します。 その後、開発者は単体テストに合格することを目標にコードモジュールを作成します。 したがって、これらの方法論では、ユニットテストを使用して開発を推進しています。
目標はテストに基づく開発であることに注意する基本的なポイント。
赤緑リファクタリングサイクル
テスト駆動開発は、単体テストに基づいたコードの開発に使用されます。
- ステップ1 *-作成するコードモジュールを検討します。
- ステップ2 *-テストを書く
- ステップ3 *-テストを実行します。
コードはまだ記述されていないため、テストは失敗します。 そのため、ステップ2は通常、テストの書き込みと呼ばれます。
- ステップ4 *-テストに合格するための最小限のコードを記述します。
- ステップ5 *-すべてのテストを実行して、すべてがテストに合格することを確認します。 このステップを容易にするために、単体テストが自動化されています。
- ステップ6 *-リファクタリング。
- ステップ7 *-次のコードモジュールに対してステップ1からステップ6を繰り返します。
各サイクルは非常に短く、通常の時間には多くのサイクルが含まれている必要があります。
これは、一般に Red-Green-Refactor サイクルとしても知られています。
- 赤-失敗するテストの作成。
- 緑-テストに合格するためのコードの記述。
- リファクタリング-重複を削除し、コードを許容可能な標準に改善します。
TDDプロセスステップ
TDDプロセスの手順を以下に示します。
TDDの利点
テスト駆動開発の利点または利点は次のとおりです-
- 開発者は、最初に、目的の結果がどうあるべきか、そしてコードを作成する前にテストする方法を理解する必要があります。
- コンポーネントのコードは、テストに合格し、コードがリファクタリングされたときにのみ終了します。 これにより、開発者が次のテストに進む前にテストとリファクタリングが保証されます。
- ユニットテストのスイートは各リファクタリングの後に実行されるため、各コンポーネントがまだ動作しているというフィードバックは一定です。
- ユニットテストは、常にデータに応じた生きたドキュメントとして機能します。
- 欠陥が見つかった場合、開発者はその欠陥を明らかにするテストを作成し、テストに合格して欠陥が修正されるようにコードを修正します。 これにより、デバッグ時間が短縮されます。 他のすべてのテストも実行され、それらが合格すると、既存の機能が破損しないことが保証されます。
- 開発者はいつでも設計上の決定とリファクタリングを行うことができ、テストの実行によりシステムが引き続き機能していることが保証されます。 これにより、ソフトウェアが保守可能になります。
- 開発者は、変更が既存の機能に影響を与える場合、テストを実行することで同じことが明らかになり、欠陥をすぐに修正できるため、変更を行う自信があります。
- 連続する各テスト実行で、以前のすべての不具合修正も検証され、同じ不具合の繰り返しが削減されます。
- ほとんどのテストは開発中に行われるため、配信前のテストは短縮されます。
TDDの欠点
開始点は、システムの動作を説明するユーザーストーリーです。 したがって、開発者はしばしば次の質問に直面します-
- いつテストする?
- 何をテストしますか?
- 仕様が満たされているかどうかを知る方法は?
- コードはビジネス価値をもたらしますか?
TDDについての誤解
以下の誤解が業界に存在し、明確化が必要です。
Misconception | Clarification |
---|---|
TDD is all about testing and test automation. | TDD is a development methodology using Test-First approach. |
TDD does not involve any design. | TDD includes critical analysis and design based on the requirements. The design emerges during development. |
TDD is only at Unit level. | TDD can be used at the integration and system levels. |
TDD cannot be used by traditional testing projects. | TDD became popular with Extreme Programming and is being used in other Agile methodologies. However, it can be used in traditional testing projects as well. |
TDD is a tool. |
TDD is a development methodology, and after every new Unit Test passes, it is added to the Automation Test Suite as all the tests need to be run whenever a new code is added or existing code is modified and also after every refactoring. したがって、TDDをサポートするテスト自動化ツールは、このプロセスを容易にします。 |
TDD means handing Acceptance tests to the developers. | TDD does not mean handing Acceptance Tests to the developers. |
受け入れTDD
受け入れテスト駆動開発(ATDD)は、開発の初期段階で、ユーザーストーリーの作成中に受け入れ基準と受け入れテストを定義します。 ATDDは、顧客、開発者、テスター間のコミュニケーションと共通理解に焦点を当てています。
ATDDのキープラクティスは次のとおりです-
- ドメインについての共通の理解を構築するために、実世界のシナリオについて話し合います。
- これらのシナリオを使用して、受け入れ基準に到達します。
- 受け入れテストを自動化します。
- これらのテストに開発の焦点を合わせます。
- テストを実際の仕様として使用して、変更を容易にします。
ATDDを使用する利点は次のとおりです-
- 要件は明確であり、機能的なギャップはありません。
- 開発者が予見する特殊なケースを理解している人もいます。
- 受け入れテストは開発をガイドします。
TDD対BDD
ダンノースによると、プログラマは通常、テスト駆動開発の実行中に次の問題に直面します-
- どこから始めれば
- テストするものとテストしないもの
- 一度にテストする量
- 彼らのテストと呼ぶもの *テストが失敗する理由を理解する方法
これらすべての問題の解決策は、行動駆動型開発です。 これは、確立されたアジャイルプラクティスから発展し、アジャイルソフトウェア配信に新しい、チームにとってそれらをよりアクセスしやすく効果的にするように設計されています。 時間が経つにつれて、BDDはアジャイル分析および自動化された受け入れテストの全体像を網羅するように成長しました。
TDDとBDD* の主な*違いは次のとおりです-
- TDDは、ソフトウェアの動作を説明します。
- 一方、BDD-
- エンドユーザーがソフトウェアを使用する方法を説明します。
- コラボレーションとコミュニケーションを促進します。
- システムの動作の例を強調します。
- 例から導き出された実行可能な仕様を目指します
BDD-BDD方式のTDD
TDDでは、「受け入れテスト」という用語は誤解を招くものです。 受け入れテストは、実際にシステムの予想される動作を表します。 アジャイルプラクティスでは、チーム全体のコラボレーションと、顧客や他の利害関係者との相互作用が強調されています。 これにより、プロジェクトに関わるすべての人が容易に理解できる用語を使用する必要性が生じています。
TDDを使用すると、必要な*動作*について考えることができるため、「動作」という用語は「テスト」という用語よりも便利です。 BDDはテスト駆動開発であり、テストではなく動作に焦点を当てた語彙を備えています。
ダンノースの言葉を借りると、「テストでの思考から行動での思考への移行が非常に深いため、TDDをBDD、または行動駆動型開発と呼ぶようになりました。」TDDは何かの仕組みに焦点を当てています。構築します。
BDDは、開発者がよく直面する次の質問に答えます-
Question | Answer |
---|---|
Where to start? | outside-in |
What to test? | User Stories |
What not to test? | anything else |
これらの回答により、ストーリーフレームワークは次のようになります-
ストーリーフレームワーク
*[役割]*
欲しい [機能]
*[ベネフィット]*
これは、「*機能*が実行されると、結果として得られる*利益*は*役割を演じる人*になります」という意味です。
BDDはさらに次の質問に答えます-
Question | Answer |
---|---|
How much to test in one go? | very little-focused |
What to call their tests? | sentence template |
How to understand why a test fails | documentation |
これらの答えは、次の例のフレームワークになります-
フレームワークの例
初期コンテキストを与えて、
- イベント*が発生したとき、
- そして*いくつかの結果を保証します。
これは、「特定のイベントが発生したときに、初期コンテキストから始めて、結果がどうあるべきかを知っている」ことを意味します。
したがって、この例はシステムの予想される動作を示しています。 例は、システムのさまざまなシナリオを説明するために使用されます。
ストーリーとシナリオ
ATMシステムに関するDan Northの次の図を考えてみましょう。
ストーリー
- 顧客*として、
私はATMから現金を引き出したい
- そう*私は銀行で並んで待つ必要はありません。
シナリオ
このストーリーには2つのシナリオが考えられます。
- シナリオ1 *-アカウントにクレジットがあります
アカウントにクレジットが付与されている
- そして*カードは有効です
- そして*ディスペンサーには現金が含まれています
- いつ*顧客が現金を要求する
- その後*口座から引き落とされることを確認する
- そして*現金が確実に分配される
- そして*カードが返されることを確認する
- シナリオ2 *-アカウントは当座貸越限度を超えて引き落とされます
- 与えられた*アカウントが引き落とされた
- そして*カードは有効です
- いつ*顧客が現金を要求する
- その後*拒否メッセージが表示されることを確認します
- そして*現金が出されないようにする
- そして*カードが返されることを確認する
イベントは両方のシナリオで同じですが、コンテキストは異なります。 したがって、結果は異なります。
開発サイクル
BDDの開発サイクルは、外部からのアプローチです。
- ステップ1 *-赤になる高レベル(外部)のビジネス価値の例(CucumberまたはRSpec/Capybaraを使用)を記述します。 (RSpecはRuby言語でBDDフレームワークを生成します)
- ステップ2 *-実装の最初のステップである赤の下位レベル(内部)RSpecの例を記述します。
- ステップ3 *-その下位レベルの例を渡すための最小限のコードを実装し、緑色になることを確認します。
- ステップ4 *-次の低レベルのRSpecの例を書いて、赤になるステップ1をパスするように押します。
- ステップ5 *-ステップ1の高レベルの例が緑色になるまで、ステップ3とステップ4を繰り返します。
注-次の点に留意してください-
- *赤/緑*状態は許可ステータスです。
- 低レベルのテストが緑色の場合、新しいサンプルを作成したり、既存の実装をリファクタリングしたりできます。 リファクタリングのコンテキストでは、新しい機能/柔軟性を追加しないでください。
- 低レベルのテストが赤の場合、既存のテストを緑にするためにのみ実装コードを作成または変更する権限があります。 存在しない次のテストに合格するコードを記述する衝動に抵抗する必要があります。または、良いと思われる機能を実装する必要があります(顧客は尋ねなかったでしょう)。
BDD-例による仕様
「例による仕様」の著者であるGojko Adzicによると、例による仕様は、適切な製品が効率的に提供されるようにソフトウェア製品の変更を促進する一連のプロセスパターンです。
Example by Specificationは、抽象的なステートメントの代わりに現実的な例を使用して要件をキャプチャして説明することに基づいて、ソフトウェア製品の要件とビジネス指向の機能テストを定義するための共同アプローチです。
例による仕様-概要
Example by Specificationの目的は、優先順位付けされた検証可能なビジネス要件の開発と提供に焦点を当てることです。 Example by Specificationの概念自体は比較的新しいものですが、それは単に既存のプラクティスを言い換えたものです。
それは、ユビキタス言語として知られている非常に具体的で簡潔な語彙をサポートしています-
- 実行可能要件を有効にします。
- チームの全員が使用します。
- 機能横断型チームによって作成されます。
- 全員の理解を獲得します。
Example by Specificationは、ビジネスドメインを反映する自動テストを構築するための直接入力として使用できます。 したがって、例による仕様の焦点は、適切な製品を構築し、製品を適切に構築することにあります。
例による仕様の目的
Example by Specificationの主な目的は、適切な製品を構築することです。 それは共有された理解に焦点を合わせており、したがって、真実の単一のソースを確立しています。 受入基準の自動化が可能になるため、欠陥検出ではなく欠陥防止に重点が置かれます。 また、欠陥を早期に発見するために、テストを早期に促進します。
SbEの使用
例による仕様は、ビジネス価値を説明する予想されるシステムの動作を示すために使用されます。 イラストは、具体的かつ実際の例を使用しています。 これらの例は、実行可能な要件を作成するために使用されます-
- 翻訳なしでテスト可能。
- ライブドキュメントでキャプチャされます。
以下は、特定の仕様を説明するために例を使用する理由です-
- 彼らは理解しやすいです。
- 彼らは誤解しにくいです。
SbEの利点
Example by Specificationを使用する利点は次のとおりです-
- 品質の向上
- 無駄の削減
- 生産欠陥のリスクを低減
- 集中した努力
- 変更をより安全に行うことができます
- ビジネスへの関与の改善
SbEのアプリケーション
例による指定は、アプリケーションを見つけます-
- 複雑なビジネスまたは複雑な組織。
- 純粋に技術的な問題ではうまく機能しません。
- UIに焦点を当てたソフトウェア製品ではうまく機能しません。
- レガシーシステムにも適用できます。
SbEおよび受け入れテスト
受け入れテストの観点から例による仕様の利点は-
- 単一の図が、詳細な要件とテストの両方に使用されます
- プロジェクトの進捗状況は、受け入れテストの観点からです-
- 各テストでは、動作をテストします。
- テストは、動作のために合格するか、そうでないかのいずれかです。
- テストに合格すると、特定の動作が完了したことを表します。
- 100の動作を完了する必要があるプロジェクトの60の動作が完了している場合、60%が完了しています。
- テスターは欠陥修正から欠陥防止に切り替え、ソリューションの設計に貢献します。
- 自動化により、ソリューションに対する要件変更の影響を即座に理解できます。
例による仕様-さまざまな役割にとっての意味
Example by Specificationの目的は、ビジネス価値を提供するためにプロジェクト全体の顧客を含むチームの全員のコラボレーションを促進することです。 わかりやすくするために誰もが同じ語彙を使用しています。
Role | Use of SbE |
---|---|
Business Analyst |
|
Developer |
|
Tester |
|
Everyone |
|
SbE –プロセスパターンのセット
この章の冒頭で見たように、仕様例は、ソフトウェア製品の変更を促進して適切な製品が効率的に提供されるようにする一連のプロセスパターンとして定義されます。
プロセスパターンは次のとおりです-
- 共同仕様
- 例を使用して仕様を説明する
- 仕様の改良
- サンプルの自動化
- 頻繁に検証する
- リビングドキュメンテーション
共同仕様
共同仕様の目的は次のとおりです-
- チームでさまざまな役割を果たして、共通の理解と語彙を共有します。
- 誰もがプロジェクトに参加して、機能に関するさまざまな視点を提供できるようにします。
- 共有されたコミュニケーションと機能の所有権を確保します。
これらの目標は、Three Amigosミーティングとしても知られる仕様ワークショップで満たされます。 Three AmigosはBA、QA、開発者です。 プロジェクトには他の役割もありますが、これら3つの役割は、定義から機能の提供まで責任と説明責任を果たします。
会議中-
- ビジネスアナリスト(BA)は、新機能の要件とテストを提示します。
- 3つのAmigo(BA、開発者、およびQA)が新機能について説明し、仕様を確認します。
- QAと開発者は、不足している要件も特定します。
- 三アミーゴ
- ユビキタス言語を使用して共有モデルを利用します。
- ドメインボキャブラリーを使用します(必要に応じて用語集が保持されます)。
- 違いと矛盾を探します。
- この時点で実装の詳細にジャンプしないでください。
- 機能が十分に指定されているかどうかについて合意に達します。
- 要件とテストの所有権を共有することで、品質仕様が促進されます
- 要件はシナリオとして提示され、明示的で明確な要件を提供します。 シナリオは、ユーザーの観点から見たシステムの動作の例です。
サンプルを使用した仕様の説明
シナリオは、テスト可能な仕様を作成するためのGiven-When-Then構造を使用して指定されます-
指定 <何らかの前提条件>
および *<追加の前提条件> オプション*
いつ <アクション/トリガーが発生>
その後 <何らかの投稿条件>
および *<追加の投稿条件> オプション*
この仕様は、システムの動作の一例です。 また、システムの受け入れ基準も表します。
チームが例について話し合い、例が機能の予想される動作をカバーするという合意が得られるまで、フィードバックが組み込まれます。 これにより、テストのカバレッジが良好になります。
仕様の改良
仕様を改良するには、
- 例を正確に記述してください。 例が複雑になる場合は、より単純な例に分割します。
- ビジネスの観点に焦点を当て、技術的な詳細を避けます。
- 正と負の両方の条件を考慮してください。
- ドメイン固有の語彙を順守します。
- 例について顧客と話し合う。
- これを達成するために会話を選択してください。
- 顧客が興味を持っている例のみを検討してください。 これにより、必要なコードの生成のみが可能になり、必要でない可能性のあるすべての組み合わせをカバーしなくなります
- シナリオを確実にパスするには、そのシナリオのすべてのテストケースがパスする必要があります。 したがって、仕様を拡張してテスト可能にします。 テストケースには、さまざまな範囲とデータ値(境界およびコーナーケース)、およびデータの変更をもたらすさまざまなビジネスルールを含めることができます。
- 複雑な計算、データ操作/変換などの追加のビジネスルールを指定します。
- 機能しないシナリオを含める(例: 例、仕様としてのパフォーマンス、負荷、使いやすさなど)
自動化の例
自動化層は非常にシンプルに保つ必要があります。テスト対象のシステムに仕様を配線するだけです。 同じためのツールを使用できます。
ドメイン固有言語(DSL)を使用してテストの自動化を実行し、入力と出力の間の明確な接続を示します。 スクリプトではなく仕様に焦点を当てます。 テストが正確で、理解しやすく、テスト可能であることを確認してください。
頻繁に検証する
すべての変更(追加/変更)で開発パイプラインに検証例を含める。 製品の品質を確保するために採用できる(および採用すべき)多くの手法とツールがあります。 それらは、 Test Early、Test Well 、および Test Often の3つの主要な原則を中心に展開します。
テストを頻繁に実行して、脆弱なリンクを特定できるようにします。 動作を表す例は進行状況を追跡するのに役立ち、動作は対応するテストに合格した後にのみ完了すると言われています。
リビングドキュメンテーション
仕様はできるだけシンプルで短くしてください。 仕様を整理し、作業の進行に合わせて進化させます。 チーム全員がドキュメントにアクセスできるようにします。
サンプルプロセスステップによる仕様
この図は、例による仕様のプロセスステップを示しています。
アンチパターン
アンチパターンは、ソフトウェア開発における特定のパターンであり、不適切なプログラミング手法と見なされます。 一般的な問題に対する一般的なアプローチであり、形式化され、一般的に優れた開発プラクティスと見なされている設計パターンとは対照的に、アンチパターンは反対であり、望ましくありません
アンチパターンはさまざまな問題を引き起こします。
Anti-pattern | Problems |
---|---|
No collaboration |
|
Unaware when code is finished |
|
Too detailed or too UI centric examples |
|
Underestimating effort required |
|
問題の解決-品質
アンチパターンを監視することで品質を確保できます。 アンチパターンによって作成される問題を最小限に抑えるために、次のことを行う必要があります-
- 例を使用して指定してください。
- サンプルをクリーンアップして改善します。
- 例を満たすコードを書く
- サンプルを自動化してデプロイします。
- すべてのユーザーストーリーに対してこのアプローチを繰り返します。
アンチパターンに起因する問題を解決するには、遵守することを意味します-
- コラボレーション。
- 何に焦点を当てます。
- ビジネスに焦点を当てています。
- 準備して。
上記のそれぞれの意味を理解しましょう。
コラボレーション
コラボレーションで-
- ビジネスマン、開発者、テスターはそれぞれの観点から意見を出します。
- 自動化された例は、チームが正しいものを構築したことを証明しています。
- このプロセスは、テスト自体よりも価値があります。
何に焦点を当てる
「何」という質問に集中する必要があります。「何」に焦点を合わせながら、
- 考えられるすべてのケースをカバーしようとしないでください。
- 異なる種類のテストを使用することを忘れないでください。
- 例をできるだけシンプルにしてください。
- 例は、システムのユーザーが簡単に理解できるものでなければなりません。
- ワークショップでツールが重要な役割を果たすべきではありません。
ビジネスに焦点を当てる
ビジネスに集中するには-
- 仕様をビジネス目的で維持します。
- 仕様の作成とレビューにビジネスを含めます。
- オートメーションレイヤーのすべての詳細を非表示にします。
準備して
次の準備をしてください-
- チームのプラクティスが変更されても、メリットはすぐには明らかになりません。
- SbEの導入は困難です。
- 時間と投資が必要です。
- 自動テストは無料ではありません。
道具
例による指定にはツールの使用は必須ではありませんが、実際にはいくつかのツールが利用可能です。 ツールを使用しなくても、例による仕様に従って成功する場合があります。
次のツールは、例による仕様をサポートしています-
- きゅうり
- SpecFlow
- Fitnesse
- Jbehave
- 一致
- ビハット
- ジャスミン
- 楽しむ
- Speclog
行動駆動開発-ツール
開発チームは、多くの場合、BDDはツールフレームワークであると誤解しています。 実際には、BDDはツールフレームワークではなく開発アプローチです。 ただし、他の開発アプローチの場合と同様に、BDD用のツールもあります。
さまざまなプラットフォームおよびプログラミング言語でいくつかのBDDツールが使用されています。 彼らは-
- キュウリ(Rubyフレームワーク)
- SpecFlow(.NETフレームワーク)
- 動作(Pythonフレームワーク)
- JBehave(Javaフレームワーク)
- JBehave Web(Seleniumと統合されたJavaフレームワーク)
- レタス(Pythonフレームワーク)
- 一致(Javaフレームワーク)
- Behat(PHPフレームワーク)
- Kahlan(PHPフレームワーク)
- DaSpec(JavaScriptフレームワーク)
- ジャスミン(JavaScriptフレームワーク)
- Cucumber-js(JavaScriptフレームワーク)
- Squish GUIテスター(JavaScript、Python、Perl、Ruby、Tcl用のBDD GUIテストツール)
- Spock(Groovyフレームワーク)
- ヤダ(ジャスミン(JavaScriptフレームワーク)などのフレームワークのガーキン言語サポート)
きゅうり
Cucumberは、世界中で使用される実行可能な仕様のための無料のツールです。 Cucumberを使用すると、ソフトウェア開発チームはソフトウェアの動作をプレーンテキストで説明できます。 テキストは、ビジネスで読み取り可能なドメイン固有の言語で記述されており、ドキュメント、自動テスト、および開発支援として機能し、すべて1つの形式にまとめられています。 Cucumberでは、40以上の異なる言語(英語、中国語など)を使用できます。
キュウリ–主な機能
キュウリの主な機能は次のとおりです-
- キュウリは、実行可能仕様、テスト自動化、およびリビングドキュメントに使用できます。
- Cucumberは、Ruby、Java、NET、Flex、または任意の言語で書かれたWebアプリケーションで動作します。
- Cucumberは、FITが行うことと同様に、テーブルでより簡潔なテストをサポートします。
- Cucumberは、要件、自動化されたテスト、ドキュメントを結合して、ソフトウェアを検証するプレーンテキストの実行可能仕様にすることで、ソフトウェア開発ライフサイクルに革命をもたらしました。
SpecFlow
SpecFlowは、.NETプラットフォーム用のBDDツールです。 SpecFlowはオープンソースプロジェクトです。 ソースコードはGitHubでホストされています。
SpecFlowはGherkin Syntax for Featuresを使用します。 Gherkin形式はCucumberによって導入され、他のツールでも使用されています。 Gherkin言語はGitHubのプロジェクトとして維持されています-https://github.com/cucumber/gherkin
振る舞う
BehaveはPythonフレームワークに使用されます。
- 動作は、「機能」と呼ばれるディレクトリに格納されている3種類のファイルで動作します-
- 動作シナリオを含む機能ファイル。
- シナリオのPythonステップ実装を含む「steps」ディレクトリ。
- オプションで、一部の環境制御(ステップ、シナリオ、機能、または射撃の全体の前後に実行するコード)。
- 振る舞い機能は、Gherkinを使用して(いくつかの変更を加えて)作成され、「name.feature」という名前が付けられます。
- 機能およびシナリオに添付されたタグは、それらに渡された「機能」または「シナリオ」オブジェクトを介して環境機能で使用できます。 これらのオブジェクトには、「タグ」と呼ばれる属性があります。これは、機能ファイルで見つかった順序で添付されたタグ名のリストです。
- ガーキン標準の修正-
- Behaveは、標準のGherkinファイルを解析し、Gherkinを拡張して小文字のステップキーワードを許可します。これらは、より読みやすい機能仕様を許可する場合があるためです。
レタス
レタスは、キュウリに基づいた非常にシンプルなBDDツールです。 Pythonプロジェクトの自動テストとしてプレーンテキストの機能記述を実行できます。 レタスは、BDDで最も一般的なタスクを目指しています。
一致
Concordionは、Java Frameworkの例による仕様を自動化するためのオープンソースツールです。
コア機能はシンプルですが、link:/concordion/index [強力な拡張フレームワークAPI]を使用すると、Excelスプレッドシートを仕様として使用したり、スクリーンショットを出力に追加したり、ログ情報を表示したりするなどの機能を追加できます。
Concordionでは、段落、表、適切な句読点を使用して通常の言語で仕様を記述し、Given/When/Thenを使用する構造化言語は不要です。
コンコードは、他の言語に移植されています-
- C#(Concordion.NET)
- Python(PyConcordion)
- Ruby(Ruby-Concordion)
行動駆動開発-キュウリ
Cucumberは、実行可能仕様、テストの自動化、およびLivingドキュメントをサポートするツールです。
振る舞い駆動開発は、例による仕様を拡張します。 また、テスト駆動開発のベストプラクティス、特に外部からの作業の観点を形式化します。 開発作業は、実行可能な仕様に基づいています。
実行可能な仕様の*キー機能*は次のとおりです-
- 実行可能な仕様は-
- システムの動作を表す例から派生。
- ビジネスや利害関係者を含む、開発に関与するすべての人々のコラボレーションで書かれています。
- 受け入れ基準に基づきます。
- 実行可能な仕様に基づいた受け入れテストは自動化されています。
- 共有されたユビキタス言語は、次のような実行可能な仕様と自動テストを記述するために使用されます-
- ドメイン固有の用語は、開発全体で使用されます。
- 顧客や利害関係者を含む全員が、同じ方法でシステム、その要件、実装について話します。
- 要件、設計ドキュメント、コード、テストなどに存在するシステムを議論するために同じ用語が使用されます。
- 誰でも要件を読み、理解し、より多くの要件を生成する方法を理解できます。
- 変更は簡単に対応できます。
- ライブドキュメントが維持されます。
Cucumberは、実行可能仕様とシステムの実際のコードおよび自動化された受け入れテストを結び付けるため、このプロセスを支援します。
これを実際に行う方法は、顧客と開発者が一緒に作業できるように設計されています。 受け入れテストに合格すると、それが表すシステムの動作の仕様が正しく実装されたことを意味します。
典型的なキュウリ受入試験
次の例を考えてください。
機能-サインアップ
- サインアップは迅速かつフレンドリーでなければなりません。
- シナリオ-サインアップの成功
- *新規*ユーザーは、確認メールを受け取り、個人的に挨拶する必要があります。
- *指定*私はサインアップすることを選択しました。
- *いつ*私は有効な詳細でサインアップします。
- *その後*確認メールが届きます。
- *そして*パーソナライズされた挨拶メッセージが表示されるはずです。
この例から、我々はそれを見ることができます-
- 受け入れテストは*機能*を参照してください。
- 機能は*シナリオ*で説明されています。
- シナリオは*ステップ*で構成されています。
仕様は、プレーンテキストファイルの自然言語で記述されていますが、実行可能です。
キュウリの働き
Cucumberは、システムに対して実行できるシナリオを探す機能を含むテキストファイルを処理するコマンドラインツールです。 Cucumberの仕組みを理解しましょう。
- ファイルの命名方法とファイルの場所(それぞれのフォルダー)に関する一連の規則を使用して、簡単に開始できるようにします。
- Cucumberを使用すると、仕様、自動テスト、ドキュメントを同じ場所に保管できます。
- 各シナリオは、シナリオの前提条件、アクション、および事後条件を説明するステップのリストです。各ステップがエラーなしで実行される場合、シナリオは合格としてマークされます。
- 実行の終了時に、Cucumberは合格したシナリオの数を報告します。
- 何かが失敗した場合、開発者が進行できるように、失敗したものに関する情報を提供します。
Cucumberでは、 Features 、 Scenarios 、Stepsは Gherkin と呼ばれる言語で記述されています。
ガーキンは、構造を持つプレーンテキストの英語(または60以上のその他の言語の1つ)です。 ガーキンは習得が容易であり、その構造により、簡潔な方法で例を書くことができます。
- Cucumberは、Gherkinで記述された実行可能な仕様を含むファイルを実行します。
- Cucumberには、プレーンテキストのGherkin Stepsをシステムと対話するアクションに変換するためのStep Definitionsが必要です。
- Cucumberがシナリオ内のステップを実行するとき、実行する一致するステップ定義を探します。
- ステップ定義は、パターンが付加された小さなコードです。
- このパターンは、ステップ定義をすべての一致するステップにリンクするために使用され、コードはガーキンステップが検出されたときにCucumberが実行するものです。
- 各ステップにはステップ定義が付随します。
- ほとんどの手順では、入力を収集し、フレームワークで呼び出しを行うために、アプリケーションドメインに固有のフレームワークに委任します。
Cucumberは、十数種類の異なるソフトウェアプラットフォームをサポートしています。 あなたに合ったCucumber実装を選択できます。 すべてのCucumber実装は同じ全体的な機能を提供し、独自のインストール手順とプラットフォーム固有の機能も備えています。
ステップとステップ定義のマッピング
Cucumberの鍵は、ステップとステップ定義の間のマッピングです。
キュウリの実装
以下にCucumberの実装を示します。
Ruby/JRuby | Ruby/JRuby |
JRuby | JRuby (using Cucumber-JVM) |
Java | Java |
Groovy | Groovy |
NET | .NET (using SpecFlow) |
JavaScript | JavaScript |
JavaScript | JavaScript (using Cucumber-JVM and Rhino) |
Clojure | Clojure |
Gosu | Gosu |
Lua | Lua |
PHP | PHP (using Behat) |
image | Jython |
image:/behavior_driven_development/c.jpg[C] | C++ |
Tcl | Tcl |
フレームワーク統合
以下にフレームワークの実装を示します。
Ruby on Rails | Ruby on Rails |
Selenium | Selenium |
PicoContainer | PicoContainer |
Spring Framework | Spring Framework |
Watir | Watir |
行動駆動開発-ガーキン
Gherkinは、 Features、Scenarios、およびSteps を記述するために使用される言語です。 Gherkinの目的は、具体的な要件を作成することです。
具体的な要件の意味を理解するには、次の例を検討してください-
お客様が無効なクレジットカード情報を入力しないようにする必要があります。
対
顧客が正確に16桁ではないクレジットカード番号を入力した場合、フォームを送信しようとすると、正しい桁数を知らせるエラーメッセージが表示されて再表示されます。
後者にはあいまいさはなく、エラーを回避し、はるかにテスト可能です。
Gherkinは、より具体的な要件を作成するように設計されています。 ガーキンでは、上記の例は次のように見えます-
特徴
無効なクレジットカードの詳細を入力する際のフィードバック*機能の定義*
ユーザーテストでは、_Documentation_を間違える多くの人々を見てきました
背景 以下のすべてのシナリオに当てはまります
- 指定*購入するアイテムを選択しましたが、
- そして*クレジットカード番号を入力しようとしています
シナリオ-クレジットカード番号が短すぎます*シナリオの定義*
いつ 16桁未満のカード番号を入力します
- そして*その他の詳細はすべて正しい
そして*フォームを送信*ステップ
- その後*フォームを再表示する必要があります
- そして*正しい桁数を通知するメッセージが表示されるはずです
ガーキンの形式と構文
Gherkinファイルはプレーンテキストファイルであり、拡張子は.featureです。 空白でない各行は、Gherkinキーワードで始まり、その後に任意のテキストが続く必要があります。 キーワードは-
- 特徴
- シナリオ
- 与えられた、いつ、そして、そして、しかし(ステップ)
- バックグラウンド
- シナリオ概要
- 例
- "" "(ドキュメント文字列)
- | (データ表)
- @(タグ)
- #(コメント)
- *
特徴
*Feature* キーワードは、ソフトウェア機能を説明し、関連するシナリオをグループ化するために使用されます。 機能には3つの基本的な要素があります-
- キーワード–機能。
- 機能キーワードと同じ行に提供される機能の名前。
- 複数の行にまたがることができるオプションの(ただし、強く推奨される)説明。 キーワードFeatureを含む行と、シナリオ、背景、またはシナリオアウトラインで始まる行の間のすべてのテキスト。
機能には、名前と説明に加えて、シナリオまたはシナリオの概要のリスト、およびオプションの背景が含まれています。
Featureの名前を取得して小文字に変換し、スペースを下線で置き換えることにより、*。feature *ファイルに名前を付けるのが一般的です。 例えば、
feedback_when_entering_invalid_credit_card_details.feature
システム内の機能を識別するために、「機能注入テンプレート」と呼ばれるものを使用できます。
<ユーザーのタイプ>として<目標を満たす>ために<機能>が必要です
説明
Gherkinドキュメントの一部は、キーワードで始まる必要はありません。
機能、シナリオ、シナリオの概要または例に続く行には、キーワードで始まる行がない限り、好きなものを書くことができます。 これは説明を含める方法です。
シナリオ
システムの動作を表現するには、各機能に1つ以上のシナリオを添付します。 その機能に関するすべての動作を完全に指定するには、機能ごとに5〜20のシナリオを表示するのが一般的です。
シナリオは次のパターンに従います-
- 初期コンテキストを説明する
- イベントを説明する
- 期待される結果を説明する
コンテキストから始め、アクションを説明し、結果を確認します。 これはステップで行われます。 Gherkinには3つのキーワードが用意されており、各コンテキスト、アクション、および結果をステップとして説明しています。
- Given -コンテキストを確立する
- いつ-アクションを実行する
- その後-結果を確認する
これらのキーワードは、シナリオを読みやすくします。
例
シナリオ-アカウントからお金を引き出します。
- *与えられた*私は私のアカウントに100ドルを持っています。
- *いつ*私は20ドルを要求します。
- その後 20ドルを分配する必要があります。
複数の Given または When ステップが下にある場合、 And または But を使用できます。 シナリオを詳細に指定できます。
例
シナリオ-盗まれたカードを使用して引き出しを試みます。
- *与えられた*私は私のアカウントに100ドルを持っています。
- *しかし*私のカードは無効です。
- *いつ*私は50ドルを要求します。
- *その後*私のカードは返却されません。
- *そして*銀行に連絡するように言われるべきです。
シナリオを作成する際には、「各シナリオが意味を持ち、他のシナリオとは無関係に実行できる必要がある」ことを忘れないでください。 これは-
- 1つのシナリオの成功条件は、他のシナリオがその前に実行されたという事実に依存することはできません。
- 各シナリオは特定のコンテキストを作成し、1つのことを実行して、結果をテストします。
このようなシナリオには、次の利点があります-
- テストはより簡単で理解しやすくなります。
- シナリオのサブセットのみを実行でき、テストセットの破損を心配する必要はありません。
- システムによっては、テストを並行して実行できるため、すべてのテストの実行にかかる時間を短縮できます。
シナリオ概要
複数の入力または出力を使用してシナリオを作成する必要がある場合、値のみが異なる複数のシナリオを作成することになります。 解決策は、シナリオの概要を使用することです。 シナリオの概要を書くには、
- シナリオアウトラインステップの変数は、<および>でマークアップされます。
- 変数のさまざまな値は、表に例として示されています。
例
電卓に2つの数値を追加するためのフィーチャーを作成しているとします。
機能-追加。
Scenario Outline: Add two numbers.
Given the input "<input>"
When the calculator is run
Then the output should be <output>"
Examples
| input | output |
| 2+2 | 4 |
| 98+1 | 99 |
| 255+390 | 645 |
シナリオアウトラインセクションの後には、常に1つまたは複数の例のセクションが続きます。これは、テーブルのコンテナーです。 テーブルには、シナリオの概要手順の変数に対応するヘッダー行が必要です。 以下の各行は、変数値を入力して新しいシナリオを作成します
行動駆動開発-SpecFlow
SpecFlowはオープンソースプロジェクトです。 ソースコードはGitHubでホストされています。 アプリケーションの機能(ユースケース、ユーザーストーリー)の受け入れ基準を保存するためにSpecFlowが使用する機能ファイルは、Gherkin構文を使用して定義されます。
Gherkin形式はCucumberによって導入され、他のツールでも使用されています。 Gherkin言語はGitHubのプロジェクトとして維持されています-https://github.com/cucumber/gherkin
機能要素とSpecFlow
機能要素の主要な機能は次のとおりです-
- 機能要素は、機能ファイルのヘッダーを提供します。 機能要素には、アプリケーションの対応する機能の名前と高レベルの説明が含まれます。
- SpecFlowは、機能の名前から派生したクラス名を使用して、機能要素の単体テストクラスを生成します。
- SpecFlowは、受け入れ基準を表すシナリオから実行可能な単体テストを生成します。
- 機能ファイルには、機能の受け入れテストを記述するために使用される複数のシナリオが含まれる場合があります。
- シナリオには名前があり、複数のシナリオステップで構成できます。
- SpecFlowは、シナリオの名前から派生したメソッド名を使用して、各シナリオの単体テストメソッドを生成します。
複数のシナリオステップ
シナリオには複数のシナリオステップを含めることができます。 受け入れテストを構成する前提条件、アクション、または検証ステップを定義する3つのタイプのステップがあります。
- 異なるタイプのステップはそれぞれ Given、When または Then キーワードで始まり、同じタイプの後続のステップは And および But キーワードを使用してリンクできます。
- Gherkin構文では、これら3つのタイプのステップを任意に組み合わせて使用できますが、通常、シナリオには Given、When 、および Then ステートメントの別個のブロックがあります。
- シナリオのステップはテキストを使用して定義され、DataTableと呼ばれる追加のテーブルまたはDocString引数と呼ばれる複数行のテキストを持つことができます。
- シナリオの手順は、カスタムコードを実行してアプリケーションを自動化する主な方法です。
- SpecFlowは、各シナリオステップの単体テストメソッド内で呼び出しを生成します。 呼び出しは、シナリオステップに一致するステップ定義を実行するSpecFlowランタイムによって実行されます。
- マッチングは実行時に行われるため、バインディングがまだ実装されていなくても、生成されたテストをコンパイルして実行できます。
- シナリオのステップにテーブルと複数行の引数を含めることができます。 これらはステップ定義で使用され、追加のテーブルまたは文字列引数として渡されます。
Tags
タグは、機能とシナリオに割り当てることができるマーカーです。 機能にタグを割り当てることは、機能ファイル内のすべてのシナリオにタグを割り当てることと同等です。 先頭に@が付いたタグ名はタグを示します。
- 単体テストフレームワークでサポートされている場合、SpecFlowはタグからカテゴリを生成します。
- 生成されたカテゴリ名はタグの名前と同じですが、先頭に@はありません。
- これらの単体テストカテゴリを使用して、実行するテストをフィルタリングおよびグループ化できます。 たとえば、重要なテストに@importantをタグ付けしてから、これらのテストをより頻繁に実行できます。
背景要素
バックグラウンド言語要素により、機能ファイルのすべてのシナリオに共通の前提条件を指定できます
- ファイルの背景部分には、シナリオの他のステップの前に実行される1つ以上のシナリオステップを含めることができます。
- SpecFlowは、シナリオ用に生成されたすべての単体テストから呼び出されるバックグラウンド要素からメソッドを生成します。
シナリオの概要
シナリオの概要を使用して、データ駆動型の受け入れテストを定義できます。 シナリオの概要は、常にシナリオテンプレート仕様(<placeholder>構文を使用したデータプレースホルダーを含むシナリオ)と、プレースホルダーに値を提供する一連の例で構成されます。
- 単体テストフレームワークがサポートしている場合、SpecFlowはシナリオアウトラインから行ベースのテストを生成します。
- それ以外の場合は、シナリオアウトラインのパラメーター化された単体テストロジックメソッドと、各サンプルセットの個別の単体テストメソッドを生成します。
- トレーサビリティを向上させるため、生成された単体テストメソッド名は、シナリオの概要タイトルと例の最初の値(例の表の最初の列)から取得されます。
- したがって、サンプルセットの最初の列として一意で説明的なパラメーターを選択することをお勧めします。
- Gherkin構文では、すべての例の列にシナリオアウトライン内の一致するプレースホルダーが必要なので、テストの名前をより読みやすくするために使用される例のセットに任意の列を導入することもできます。
- SpecFlowは、ステップバインディングを照合する前に、プレースホルダー置換を個別のフェーズとして実行します。
- したがって、ステップバインディングの実装とパラメーターは、直接シナリオまたはシナリオアウトラインのどちらで実行されるかには依存しません。
- これにより、ステップバインディングを変更せずに、受け入れテストでさらに例を指定できます。
コメント
行を#で開始することにより、任意の場所で機能ファイルにコメント行を追加できます。 ただし、仕様内のコメントは、受け入れ基準が誤って指定されている兆候である可能性があるため、注意してください。 SpecFlowはコメント行を無視します。