質問

私のアプリケーション

次のようなアプリケーション設計があります。

  • Web アプリケーション層 - POCO と呼び出しサービスを使用するコントローラーとビューを備えた asp.net MVC アプリ
  • サービス層 - POCO を使用し、リポジトリを呼び出すビジネス プロセス
  • データ層 - POCO を使用し、同じ層の一部である EF モデルの形式でモデルと通信するリポジトリ
  • POCO レイヤー - これらのレイヤー間の相互通信に使用されるすべてのクラスを定義します。

したがって、上位層はデータエンティティをまったく使用しないため、私のデータ層はデータモデルの実装に対して完全に透過的です。

テスト

私が理解している限りでは、(Asp.net MVC に関連した) 単体テスト、統合テスト、およびシステム テストは次のとおりです。

  • 単体テスト - これは簡単です。分離されたオブジェクトをモックして単体テストに挿入し、テストされたユニットがそれらを使用できるようにします。
  • 統合テスト - 運用機能ユニットのグループを作成し、残りをモックする必要があります。したがって、実稼働データベースを実際に使用せずにコントローラー、サービス、およびリポジトリの統合をテストする統合テストを作成します。
  • システム テスト - モックなしですべてのレイヤーでテストを実行します。つまり、運用 (テスト) データベースも使用する必要があります。

問題

単体テストとシステム テストの書き方は簡単にわかりますが、統合テストの書き方はわかりません。もしかしたら私の見方は完全に歪んでいて、全く理解できないのかもしれません。

Asp.net MVC アプリケーションの統合テストとシステム テストはどのように作成すればよいでしょうか?
それとも、それに関する .net アプリケーションでしょうか?

問題の説明に役立つコード

次のようなクラスがあるとします。

  • TaskController に電話をかける TaskService
  • TaskService に電話をかける TaskRepository
  • TaskRepository EF データを内部で操作する

したがって、ここに私の(省略された)クラスがあります:

public class TaskController
{
    private ITaskService service;

    // injection constructor
    public TaskController(ITaskService service)
    {
        this.service = service;
    }

    // default constructor
    public TaskController() : this(new TaskService()) {}

    public ActionResult GetTasks()
    {
        return View(this.service.GetTasks());
    }
    ...
}

public class TaskService : ITaskService
{
    private ITaskRepository repository;

    // injection constructor
    public TaskService(ITaskRepository repository)
    {
        this.repository = repository;
    }

    // default constructor
    public TaskService() : this(new TaskRepository()) {}

    public IList<Task> GetTasks()
    {
        return this.repository.GetTasks();
    }
    ...
}

public class TaskRepository : ITaskRepository
{
    public IList<Task> GetTasks()
    {
        // code that gets tasks from EF and converts to Task POCOs
    }
    ...
}

単体テストは単純で、次のようになります。

public void UnitTest()
{
    var mock = new Mock<ITaskService>();
    // other code that mocks the service

    TaskController controller = new TaskController(mock.Object);

    // do the test
}

しかし、統合テストの場合、統合の特定の部分だけをモックするにはどうすればよいでしょうか。

public void IntegrationTest()
{
    // no mocking at all
    TaskController = new TaskController();
    // do some testing
}

まず第一に、ここでデータベースをモックすることはできませんか?リポジトリを模擬して実際のサービスとコントローラーを使用することもできますが...

役に立ちましたか?

解決

統合テストでは、コンポーネント間の統合をテストする必要があります。単体テストは単一コンポーネントの個々の部分をテストしますが、統合テストはコンポーネント間の相互作用をテストし、ライブで動作することを目的としています。したがって、統合テストではデータベースとその他の外部依存関係を利用することになりますが、単体テストでこれらのサービスを模擬するのが最適です。

私にとってシステム テストとは、機能テスト (fit などを使用した別のレベルのテスト)、または testcomplete や telerik の QA ツールなどのツールを使用した ui テストです。

HTH。

他のヒント

UI を含まない統合テストは、引き続き NUnit、xUnit などで作成できます。

特に ASP.NET MVC (または任意の Web アプリケーション) の場合は、次のように使用できます。 ワティン または セレン UI を使用してシステム/統合テストを作成します。

こちらもご覧ください T.S.T. T-SQL 単体テスト用、および スペックフロー .NET の BDD について興味がある場合は、

注記:質問がコードと特定の状況の説明で更新される前に、これを書きました。それはもはや質問に実際には対処していませんが、うまくいけば、それでも誰かにとって興味深く/役立つでしょう。

関連する質問に回答したところです。 結合テストの実装. 。取るべき明確なアプローチを提示することで、この問題に対処したと思います。

問題の一部は、高レベルの統合テストが複雑になりすぎることです。素早く。これが問題の性質であるため、関連するクラスに応じて単体テストと集中的な統合テストを通じて、すべての個別の部分が意図したとおりに動作することを確認することを好みます。

上記の設定が完了したら、個別の部分が正しくフックされていることを確認するだけで済みます。そのため、私はそのために完全なシステム テストを使用します。これは、コードが SOLID および DRY に従っている場合に最大限の効果を発揮します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top