2

最近、BDD と TDD について読み始めて、夢中になりました。整理されていない大量の情報源と、何が最善で何がそうでないかについてのさまざまな意見に戸惑いました。最後に、xBehave と xUnitに落ち着きました。流暢な構文と、流暢なアサーションと流暢な検証を使用した動作の定義の容易さが気に入っています。

また、学習のために取り組んでいるテスト プロジェクトでタマネギ アーキテクチャを実装しようとしています。私のシナリオは次のとおりです。プロジェクトは、簡単にするために製品トラッカーです。製品を作成し、誰がそれを所有しているかを追跡できます。私は2つの仕様を実装したい:

  • 名前なしで新しい製品が作成されると、エラーが表示されます
  • 所有者を割り当てずに新しい製品を作成すると、エラーが表示されます。

新しい Product と新しい ProductService をインスタンス化する仕様を作成し、それによってさらに Product が作成されました。仕様に合格し、検証が行われています。問題は次のとおりです。

  1. ProductRepository クラスをテストするにはどうすればよいですか? 次にテストするか、それともモックを作成して最初にすべての仕様を完成させてから、戻ってリポジトリ クラスをテストしますか?
  2. 最初の仕様で ProductService クラスをモックする必要がありましたか?
  3. それは単体テストレベルで行われていますか?単体テスト クラスを作成する必要がありますか?
  4. リポジトリをテストすると、統合テストになりませんか?

今のところ UI はなく、ドメイン、サービス、およびインフラストラクチャ レイヤーの仕様を書いています。

  • UI テストに watin を使用する必要がありますか?
  • watin/specflow に切り替えることはより理にかなっており、レイヤーを上から下まで完全にテストするための労力を節約できますか?

これが私が取り組んだ仕様の1つです。

[Scenario]
public void creating_new_product_without_a_name_should_throw_error()
{
    var productService = default(IProductService);
    var action = default(Action);
    _
        .Given("a new product", () =>
            productService = new ProductService() as IProductService)

        .When("creating the new product without a name", () =>
            action = () => productService.Create(new Product()))

        .Then("it should should display an error", () =>
            action.ShouldThrow<ValidationException("Name is required."));
}

事前に返信いただきありがとうございます。このスレッドに返信する場合は、いくつかの資料/記事/サンプル コードを使用して、提案に従う方がよい理由を説明してください。

4

1 に答える 1

0

小さな部品をテストしていて、それらを大きなものに接着することを計画しているようです。これは(IMO、繰り返しになりますが)TDDではありません(そして確かにBDDではありません)。テストで設計/アーキテクチャを推進することはできません。

そもそも、デザインについてはあまり考えないでください。タマネギのアーキテクチャ、リポジトリ、サービスについては考えないでください。

ソリューション全体をエンドツーエンドで検証するテストを作成することから始めます。そのテストをできるだけ小さくします。まず、ラベルが表示されていることを確認します。次に、テストに合格するために考えられる最小のソリューションを作成します。次に、別のテストとその解決策を作成します。

しばらくしてから、コード(本番環境だけでなくテストも)を見て、責任を見つけてください。どこかにサービスの胚がありますか?抽出してください!しかし、時期尚早にそれをしないでください。コードにどのように見せたいかを教えてもらいましょう。

ドメイン(製品、所有者など)について前もって考え始め、コードの早い段階でそれを含めます。永続性(リポジトリ)でもう少し待ちますが、長すぎないでください。

このレベル(エンドツーエンド)でテストを続けます。必要に応じてマイクロテストを追加します。したがって、「ProductRepository / Serviceクラスをテストするにはどうすればよいですか」という質問に対する私の答えは、あなたへの質問です。必要ですか?それとも、エンドツーエンドのテストで十分にカバーされていますか?そうでない場合、なぜですか?

于 2012-06-04T06:36:17.673 に答える