Asp.net MVC で統合テストとシステム テストを作成する方法
-
26-09-2019 - |
質問
私のアプリケーション
次のようなアプリケーション設計があります。
- 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。
他のヒント
関連する質問に回答したところです。 結合テストの実装. 。取るべき明確なアプローチを提示することで、この問題に対処したと思います。
問題の一部は、高レベルの統合テストが複雑になりすぎることです。素早く。これが問題の性質であるため、関連するクラスに応じて単体テストと集中的な統合テストを通じて、すべての個別の部分が意図したとおりに動作することを確認することを好みます。
上記の設定が完了したら、個別の部分が正しくフックされていることを確認するだけで済みます。そのため、私はそのために完全なシステム テストを使用します。これは、コードが SOLID および DRY に従っている場合に最大限の効果を発揮します。