テスト。多くの場合、最後の最後まで残されてから、時間切れや予算超過などの理由でカットされます。
経営陣は、なぜ開発者は「最初から正しく理解する」ことができないのか疑問に思います。開発者(特に大規模なシステム)は、さまざまな利害関係者がシステムのさまざまな部分を説明するときに、警戒を怠ることがあります。 象を説明する盲人 。
ただし、すべてのプロジェクトの最初のステップは、構築するソフトウェアまたは機能の動作についての議論であることは避けられません。クライアントまたはビジネスパーソンが開発チームの誰かに近づき、彼らが何を望んでいるかを説明します。
時々、これらの相互作用は、 アジャイル ユーザーストーリー 。場合によっては、次のように設計ドキュメントの形式で提供されます。 クリスフォックスの ブログの記事 昨年。また、Keynoteのフローチャートやモックアップ、または急いで電話をかけることもできます。
お金で働くクレジットカード番号2017これらのコミュニケーションだけから、開発者は「正しく機能する」システムを構築する責任があります。
これらのコミュニケーションだけから、開発者は「正しく機能する」システムを構築する責任があります。これは特に難しいです フリーランサー より大きなシステムの外で作業する。
ここには明らかなギャップがあります。ビジネスオーナーが最初にシステムの動作を想定している場合、これらの動作が実際にテストされているのはなぜですか。 作業 多くの場合、カットされるステップ?
答えは盲目的に単純かもしれません:テストはしばしば次のように見られません 共有資本 ; 「彼らはエンジニアのためだけのものである」ため、または同様に、単一の1つの部門または人々のグループに価値を提供するため、プロジェクトに価値があるとは考えられていません。
この共有資本、このシステム動作のリストをどのようにテストしますか?テスト駆動開発(TDD)だけでなく、動作駆動開発(BDD)も採用しています。
ビヘイビア駆動開発は、コードが実装しているビジネスビヘイビアに焦点を当てる必要があります。 コードの背後にある「理由」 。チーム中心の(特に部門の枠を超えた)ワークフローをサポートします。
アジャイルBDDは、開発者とアジャイル製品の所有者またはビジネスアナリストのどちらかが一緒に座って、プレーンテキストエディターで保留中の仕様(後で開発者が記入する)を書くときに非常にうまく機能するのを見てきました。
理想的には、両方の当事者が現在のシステム動作のリストを参照して、この新しい機能が既存の機能を壊すかどうかを確認できます。
この単純な行為によって、開発者のように考えることができる十分な制約が得られることがわかりました。「これらのテストを実装する必要があるとすると、コードで実装できる仕様に私/全員をどのように制約するのでしょうか」。仕様が保留されているため、コラボレーションの厚みの中ですばやく簡単に作成できます。
この協調的なアプローチにより、機能がエンドユーザーに提供するものに焦点を当てることができ、ビジネスパーソンがすぐそこにいると、実装ではなく動作について話すように制約されます。これは、BDDとTDDの違いを浮き彫りにします。
シナリオ:あなたは、Railsに実装されている企業会計システムを担当するチームの開発者です。ある日、あるビジネスパーソンから、保留中の請求書をクライアントに通知するためのリマインダーシステムを実装するように依頼されました。このtutoriaごとにBDDを実践しているからです。 (TDDに対して)あなたはそのビジネスパーソンと一緒に座り、行動を定義し始めます。
テキストエディタを開き、ビジネスユーザーが望む動作の保留中の仕様の作成を開始します。
it 'adds a reminder date when an invoice is created' it 'sends an email to the invoice's account's primary contact after the reminder date has passed' it 'marks that the user has read the email in the invoice'
開発中の動作に焦点を当てているため、コードが正しいことだけでなく、適切な機能を構築していることを確認するためにテストが役立ちます。言い回しは、システムの内部実装言語ではなく、ビジネス言語であることに注意してください。請求書を見たり気にしたりしないbelongs_to
開発チームの外部の誰もそれを気にしないので、アカウント。
一部の開発者は、次のように、その場でテストケースを作成し、システムでメソッドを呼び出し、期待値を設定することを好みます。
it 'adds a reminder date when an invoice is created' do current_invoice = create :invoice current_invoice.reminder_date.should == 20.days.from_now end
reminder_date
を設定するコードをまだ記述していないため、テストスイートは失敗します。
失敗した仕様を書いている開発者は理解していますが、私の側にいるビジネスパーソンのおかげで、これは私にとってはうまくいきませんでした。間違ったビジネスパーソンは、詳細に気を取られるか、この新しい知識を利用して、開発者がもっと知っていること(適切なデータベース設計、コードの再利用)を細かく管理しようとします。
私の経験では、特定の行動の概要を1行以上書くと、ビジネスパーソンは退屈します。彼らはそれを自分たちの時間の使い方の悪さだと見なしたり、頭の中で次の行動を説明することを切望したりします。
テスト駆動開発アプローチを使用して、これを別の方法で見て、保留中のテストを書き出しましょう。
it 'after_create an Invoice sets a reminder date to be creation + 20 business days' it 'Account#primary_payment_contact returns the current payment contact or the client project manager' it 'InvoiceChecker#mailer finds invoices that are overdue and sends the email'
これらのテストは役に立ちますが、エンジニアという1つのグループの人々にしか役立ちません。 BDDはとの通信に役立ちます すべて 部門の枠を超えた製品チームのメンバー。
保留中の動作を使用することで、BDDの考え方でテストファーストの開発を行うことができます。まず、テストを作成します。次にそれを実行します(赤);次に、それを機能させます(緑)。 次にそれを正しくする(リファクタリング) 。
BDDコミュニティでは、テスト内のアサーションチェックを英語のように読み取るために多くの作業が行われています。これがステレオタイプのRSpecテストです:
a = 42 a.should == 42
この形式により、後で読みやすくなります。ただし、これはここで行っていることではないことを忘れないでください。重要なのは、行動をできるだけ早く下げることです。 そして 「仕様ごとに1つのテスト済み動作」の原則を実施します。理想的には、保留中の仕様タイトルは、テストしているものを示しているはずです。
BDDは、結果を検証するための凝った方法ではありません。チームのすべてのメンバー間で期待される行動を共有することです。
私たちのシナリオに戻りましょう:会社の会計システムに取り組んでいます。
ビジネスパーソンと一緒にアイテムの機能を説明し、システムの内部(オブジェクトが内部でどのように組み合わされているか)を分析し、外部からシステムを分析します。
いくつかの条件を考えて、次のシナリオで何が起こるかをビジネスアナリストに尋ねます。
* What's the default reminder date going to be? How many days before the invoice due date? * Are those business days or just calendar days? * What happens if there's not a primary contact associated with the account?
そして、あなたは得る 答え 。ビジネスパーソンは、あなたがペットのアイデアに穴を開けようとしているのではなく、過度に衒学者であるのではないことを理解することが重要です。
このように、ビヘイビア駆動開発は、コラボレーションを支援し、2つの部門間の会話を開始するためのツールです。また、目的の機能の範囲を明確にし、開発チームからより適切な見積もりを取得する方法でもあります。おそらく、特定の時点から10営業日を計算する方法がないことに気付いたでしょう。これは、実装する必要のある追加の個別の機能です。
開発者には開発者向けの考慮事項(「「日」とはどういう意味ですか?」)があり、ビジネスマンには独自の考慮事項があります(「ここでは期限切れという用語を使用しないでください。これは別の意味です」)。どちらかのグループを立ち上げて、これらのビジネスロジック動作テストを自分で作成しようとします( きゅうり )それぞれの側の貴重な入力を切り取ります。
また、アジャイルクライアントが物理的に部屋にいない場合の良い代役にもなります。つまり、構築しているものの開発者分析(および翻訳)と組み合わせて、紙に彼らの欲求を持たせることです。
アン 以前のApeeScapeブログ投稿ChrisFoxが設計ドキュメントについて語る 、特にプロジェクトの開始時に。ビジネスの振る舞いを理解して抽出することは、システムがある程度理解できるプロジェクトから、達成するのに数十年のプログラマー年を必要とし、数百または数千の動作仕様を持つプロジェクトにスケールダウンします。
クリスの記事にも言及されています 画面上の動作 このページは明らかに24向けに設計されているため、「このボタンは、薄暗いときにどのように表示されますか」または「11」画面ではどのように表示されますか」と、これは私が常にデザイナーと対立している領域です。画面?」ビジネスパーソンとのこのやりとりは、プロジェクトのグラフィックアセットまたはページのレイアウトのギャップを見つけることができます。
非常に大規模なクロスファンクショナルチームには、デザイナー、開発者、場合によっては運用担当者、データベース管理者、おそらくQA担当者など、独自の懸念を持つ多くのチームメンバーがいます。 はい、TDDとBDDのすべての人のための場所があります! )、それぞれに独自の懸念と質問があります。 BDDは、テスト駆動開発よりもこのコラボレーションを推進できます。 「データがこのテーブルに対して大きすぎるとどうなりますか?」からに、「うーん、それは高価なクエリになります。どういうわけかそれをキャッシュしたいと思います」に、「待って、ユーザーに表示されたら すべて その機密情報の?」、この新機能について質問する開発者やビジネスアナリストだけではないかもしれません。
私は、ソフトウェアエンジニアリングの「アーティファクト」を、プロジェクトまたはプロジェクトチームを説明し、6か月後に発見できる潜在的に物理的なものと考えるのが好きです。優れたアーティファクトは、物事が現状のままである理由を説明します。
優れたアーティファクトは、物事が現状のままである理由を説明します。アーティファクトは、リポジトリまたは共有スペースに保存されたソースコード、またはチケットシステムのチケットです。廊下での会話は遺物ではありません。ホワイトボードの図面もありません。大きな長いクラスのドキュメントまたは設計ドキュメントに変わるホワイトボードの図面— これら アーティファクトです。会議の議事録もアーティファクトです。
アーティファクトは、リポジトリまたは共有スペースに保存されたソースコード、チケットシステムのチケット、内部Wikiのメモ、または永続的なチャットログです。
共有アーティファクトは、私の考えでは、最高のアーティファクトです 。彼らはただ表示するだけではありません なぜ 何かがありますが、なぜそれがアプリに存在するのですか? まったく 。
振る舞いは共有チームの成果物である必要があります—テストは忙しいだけではありません-プログラマーのために働いてください!チーム全体が現在の仕様を簡単に表示できるシステムを用意するのが最善ですが(おそらく、展開システムは動作のリストを抽出してサイトのプライベートエリアまたはWikiに保存します)、手動で行うこともできます。スプリント。
ゲームの名前は、「開発者がビジネス価値をより迅速に提供し、部門間で協力し、より適切な見積もりを行うために必要な仕様を作成するのを支援する」です。
システムが何であるかについてのこの全社的な理解 しますか 資本の一形態でもあります。これは、コードの「方法」に対する「理由」です。
バグのあるソフトウェアが顧客に配信される問題をどのように解決しますか?テストが「開発者だけが気にする」ものと見なされないようにすることによって。
システムのニーズを説明して理解することには、コードの正確さを超えた多くの利点があります。部門間の対話を確立し、すべての利害関係者の懸念が満たされていることを確認します(大きな豪華なタイトルを持つ利害関係者だけではありません)。ビヘイビア駆動開発を使用してこれらのニーズを最初から理解し、チーム全体が関心を持っている外部のビジネス行動をテストします。 それ 質の高いプロジェクトを確保するための優れた方法です。