初めて単体テストを見ています。私は Visual Studio 2008 を使用しているため、ビルドイン テスト フレームワークから始めました。
ボタンを押して、空欄を埋める方法を調べ始めました。すべてはかなり単純に思えます。
ただし、2 つの問題があります。
1) 空の単体テストの多くは冗長なようです。単体テストを作成しないメソッドを選択するための経験則はありますか。2) データベース (この場合は SQL Server) を読み書きするメソッドのテストを作成するためのベスト プラクティスはありますか?
(1)の例を挙げます。
WCF Web サービスの単体テストを作成しています。wscf.blue を使用して、Web サービスの WSDL/XSD を最初に記述します。
ユーザーのリストを使用してデータベースのユーザー テーブルに書き込むメソッドの (大幅に簡略化された) コードのパスを次に示します。
Entry Point
|
|
V
void PutOperators(PutOperatorsRequest request) (This method is auto generated code)
|
|
V
void PutOperatorsImplementation(PutOperatorsRequest input) (Creates a data context and a transaction, top level exception handling)
|
|
V
void PutEntities<T>(IEnumerable<T> input) (Generic method for putting a set of entities into the database, just a for loop, T is Operator in this case)
|
|
V
U PutEntity<T, U>(T entity) (Generic Method for converting the input to what the database expects and adding it to the DataContext ready for submission, T is Operator, U is the data layer entity, called User)
|
|
V
(This method calls 3 methods, first 2 of which are methods belonging to "entity" passed into this method, the 3rd is an abstract method that, when overridden, knows how to consume a BL entity and flatten it to a database row)
void EnsureIDPresent() (Ensures that incoming entity has a unique ID, or creates one)
void ValidateForInsert(AllOperators) (Does this ID already exists, etc)
User ToDataEntity(Operator entity) (simple field mapping excersice, User.Name = Operator.Name, etc)
したがって、私が知る限り、明らかにテスト可能な何かを行う3つのメソッドがあります。
EnsureIDPresent()
- このメソッドは、簡単にテストできる方法でそれを入力および変更します
ValidateForInsert()
- このメソッドは入力を受け取り、基準が満たされない場合は例外をスローします
ToDataEntity()
- このメソッドは入力を受け取り、データ行エンティティを作成し、値を設定します。非常に簡単にテストできるはずです。
もあります:
PutOperatorsImplementation()
- DataContext.SubmitChanges() と TransactionScope.Complete() が呼び出されるのはここです。データベースに何が書き込まれるかをテストするテストを作成する必要がありますか? そして、何?それらのレコードを削除しますか? ここで何をすべきかわからない。
次のテストを削除する必要があると思います。
PutOperators()
- 自動生成されたコード、1 行で PutOperatorsImplementation() を呼び出します
PutEntities()
- PutEntity() を呼び出す単なる for ループであり、これは基本クラスのジェネリック メソッド
PutEntity()
です - 単体テストが既にある 3 つのメソッドを呼び出し、DataContext.InsertOnSubmit を呼び出します。
データを取得するための同様のパスもあります。
GetOperatorsResponse GetOperators(GetOperatorsRequest request)
- 自動生成
GetOperatorsResponse GetOperatorsImplementation(GetOperatorsRequest input)
- DataContext を設定する
List<Operator> GetEntities()
- Linq クエリ
Operator ToOperator(User)
- 1 つのデータ エンティティを同等の BL エンティティにフラット化します。
ToOperator()
私はただテストするべきだと思いますGetEntities()
既知の適切なテスト データを含む専用のテスト データベースを用意する必要がありますか?
それはこれにアプローチする正しい方法ですか?