2012-05-01 14 views
20

私は、ダンノースがBDDを考案する意図の1つとして、語彙をテストドメインの複雑さから遠ざけることを知っていました。しかし、外部からのアプローチを実装するには、嘲笑された振る舞い(または、好きな場合は、スタブされた振る舞い)をいくらか理解する必要があるようです。北はthis videoに、私が最も外側のドメインオブジェクトから始め、内向きに作業すると、共同作業者を発見して後で適切な実装に置き換えるときに協力者を模倣すると示唆しています。最終的には、私は一連のエンドツーエンドのテストで終わります。BDDで模擬する方法

Martin Fowlerは、TDDの2つのキャンプを定義したときには、this blog postで少し違ったように見えました。「可能な限り実際のオブジェクトとモックを使用するクラシックTDD」と、 。彼はBDDが後者に向かって傾いているのを見た。つまり、機能の開発が終わった時点で、「模擬的な」アプローチは実際のテストにモックを残すでしょう(BDDディスカッションでその言葉を使用するのはごめんなさい)。

公平で、両方の材料は古く、BDDがユニットレベルと受入れレベルの間で適用される間に進展するにつれて物がより明瞭になったのかもしれません。

私の話が完全に終わったら、私のシナリオは実際にどのくらいのエンドツーエンドテストが必要なのでしょうか? North explains BDDには抽象化が必要です。たとえば、ログインの動作をテストしているとき、私のシナリオでは、ログインプロセスの意味を詳しく説明します。しかし、が必要であるが、ログインではない他のシナリオを実行しているとき、私はこれらのステップを何度もやり直す必要はありません。私は簡単に抽象化したいと思う "私はログインしている"と言うので、私は他の行動を実行することができます。

抽象化への私のアプローチは、私が特定の共同作業者を模擬する(または「テストダブル」を提供する)ことであり、いくつかのシナリオでは他のシナリオよりも多くを使用することがあります。たとえば、DBやメールサーバーなどの外部リソースを常に模擬していますか?

おそらく私は間違った質問をしています。 BDDは、すべてのコミュニケーション、フィードバックサイクルの短縮、およびあなたが知らないものの発見です。私たちが実際に関心を持っている行動が実際に機能している限り、無関係な疑問であるかもしれません。私は他の人のアプローチがここにあるのは不思議です。

答えて

6

私はキーがBDDの動作に焦点を当てていると思います。

現時点で私はUI要素を無視して永続層を捨ててしまいがちです。これらの層にはビジネスロジックがほとんどありません(UIやDBに直接オブジェクトモデルを直接バインドする傾向があります既存のテスト済みのフレームワーク)。

私が構築していた最近の(単純な)WPFアプリケーションでは、受け入れテストでViewModelをアプリケーションのエントリポイント/外部ポイントとして使用し、データリポジトリからすべてが嘲笑されました。アプリケーションのすべてのルールとロジックは、2つの間のどこかに存在していました。実際は、指定してテストする必要があったアプリケーションの動作です。

1

アーキテクチャに依存します。 MVVMでは、モデルを模擬してビューモデルをテストできます。 MVPの場合、プレゼンターをテストするためにビューやモデルをモックすることができます。ユニットテストではなくエンドツーエンドのテストを作成する場合は、ビューモデル/プレゼンタを介してアプリケーションのもう一方の端(サービス/データベース層)までテストします。

7

私には、私が正しいことを構築したことをBDDで確認することができます。 これは、アプリケーションを実際のデータベースに接続して、実際のUIを使用すると正しく動作することを意味します。それはあなたが話している最後の終わりです。

私のアプリケーションをメモリ内の記憶装置に接続し、そのAPIレベル(UIのすぐ下)でアプリと話している場合。私はそれがまったく同じように動作することを期待します。

ここでは、私たちが行動という意味を明確にする必要があります。私たちがBDDを行うときに興味深い行動は何ですか?

私の場合、ユーザーストーリーから始めてシナリオを書くと、主にアプリケーションAPI、サービス層、ドメインエンティティ、ヘルパーなどを経由する動作に興味があります。主に私はUIやデータベースで何が起こるかにはあまり関心がありません。実際の肉はすべてサーバー側で書かれたコードです。これは私が関心を持っている振る舞いです。あなたがそう思っているのであれば、UIとDBを取り除くのは理にかなっています。 UIの予想される動作は、アプリケーションが提供するデータを表示することです。 UIはばかなことです。 DBの予想される動作は、アプリケーションが提供または必要とするエンティティを格納および取得することです。それはまた本当にばかなことです。今は他のすべて、それはすべてのスマートされ、私は責任を負う。

私は幸い私のリポジトリのメモリ内のバージョンを使用してUIなしで私のBDDシナリオを実行します。私がそれから得たボーナスは、本当に速く、集中して維持可能なテストです。

UIとDBに関して、私はそこでの動作をテストするためにjavascript単体テストを書いていますが、今日いくつかのUIは、表示と非表示のロジックをたくさん持つことができますが、そのような振る舞いは私のユーザーストーリーbddシナリオ(彼らはUIについて話すべきではありません)。

DBについては、実際のリポジトリがDBに読み書きできることを確認するための統合テストを書いています。

最後に、一緒に配線するとすべてが正常であることを確認するために、いくつかのエンドツーエンドテストを作成します。