9

私のアプリケーション

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

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

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

テスト

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

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

問題

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

Asp.net MVC アプリケーションの統合およびシステム テストをどのように作成する必要がありますか?
または、その問題のための.netアプリケーションはありますか?

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

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

  • TaskController呼び出しますTaskService
  • TaskService呼び出しますTaskRepository
  • TaskRepositoryEF データを内部で操作する

だからここに私の(省略された)クラスがあります:

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
}

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

4

3 に答える 3

5

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

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

HTH。

于 2010-09-30T12:41:02.773 に答える
2

関連する質問に答えました:統合テストの実装。ここでは、明確なアプローチを提示することで、この問題に対処したと思います。

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

上記が適切に行われている場合は、個別のピースが正しくフックされていることを確認するだけでよいので、そのために完全なシステムテストを使用します。これは、コードがSOLIDとDRYに従う場合に、最も効果的です。

于 2010-09-30T18:19:48.087 に答える
2

UI を含まない統合テストは、NUnit、xUnit などで記述できます。

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

また、T-SQL 単体テスト用のTSTや、.NET の BDD に興味がある場合はSpecFlowも参照してください。

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

于 2010-09-30T13:09:02.767 に答える