テストに使用するダミーデータをどのように管理していますか? それらをそれぞれのエンティティと一緒に保管しますか? 別のテスト プロジェクトで?外部リソースからシリアライザーでそれらをロードしますか? それとも、必要に応じて再作成しますか?
それぞれがエンティティを含む別のモジュールに依存するいくつかのモジュールを持つアプリケーション スタックがあります。各モジュールには独自のテストがあり、実行にはダミー データが必要です。
多くの依存関係を持つモジュールには、他のモジュールからの多くのダミー データが必要になります。ただし、それらはテストリソースの一部であるため、ダミーオブジェクトを公開しないため、すべてのモジュールが必要なすべてのダミーオブジェクトを何度もセットアップする必要があります。
また、エンティティのほとんどのフィールドは null 許容ではないため、オブジェクト レイヤーに対してトランザクションを実行する場合でも、値を含める必要があり、ほとんどの場合、一意性、長さなどの制限があります。
これを回避するベスト プラクティスの方法はありますか、それともすべてのソリューションが妥協しているのでしょうか?
もっと詳しく
スタックは次のようになります。
1 つのモジュール:
src/main/java --> gets jared (.../entities/*.java contains the entities)
src/main/resources --> gets jared
src/test/java --> contains dummy object setup, will NOT get jared
src/test/resources --> not jared
Maven を使用して依存関係を処理します。
モジュールの例:
- モジュール Aにはいくつかのダミー オブジェクトがあります
- モジュール Bには独自のオブジェクトが必要であり、かつモジュール A と同じ
オプション a)
テスト モジュールTは、すべてのダミー オブジェクトを保持し、すべてのモジュール内のすべてのテストにテスト スコープでそれらを提供できます (したがって、ロードされた依存関係は jared になりません)。それはうまくいきますか?意味: TをAにロードしてAでインストールを実行すると、 Tによって導入された参照、特にBによって導入された参照は含まれませんか? ただし、AはBのデータモデルについて知っています。
オプション b)
モジュール A は、AがBのダミー データについて知らない間に、 Bがそれらを取得src/main/java../entities/dummy
できるようにするためのダミー オブジェクトをどこかに提供します。
オプション c)
すべてのモジュールには、シリアル化されたダミー オブジェクトである外部リソースが含まれています。それらは、それらが属するモジュールに依存しているため、それらを必要とするテスト環境によって逆シリアル化できます。ただし、これにはすべてのモジュールがダミーオブジェクトを作成してシリアル化する必要がありますが、どのようにそれを行うのでしょうか? 別の単体テストを使用して単体テスト間に依存関係が発生する場合、またはスクリプトを使用すると、デバッグが難しくなり、柔軟性がなくなります。
オプション d)
モック フレームワークを使用し、必要に応じてテストごとに必須フィールドを手動で割り当てます。ここでの問題は、エンティティのほとんどのフィールドが null 許容ではないため、セッターまたはコンストラクターを呼び出す必要があり、最初からやり直してしまうことです。
望まないこと
必要なオブジェクトの構造は常に変化するため、静的データを使用して静的データベースをセットアップすることは望ましくありません。今はたくさん、あと少し。したがって、休止状態ですべてのテーブルと列をセットアップし、単体テスト時にそれらにデータを入力する必要があります。また、静的データベースは多くの潜在的なエラーとテストの相互依存性をもたらします。
私の考えは正しい方向に進んでいますか?大量のデータを必要とするテストに対処するためのベスト プラクティスは何ですか? いくつかの他のモジュールからのある種のデータで満たされたオブジェクトを必要とするいくつかの相互依存モジュールがあります。
編集
2 番目の回答に応じて、現在どのように行っているかについての詳細情報:
簡単にするために、 、 、 の 3 つのモジュールがPerson
ありProduct
ますOrder
。
オブジェクトPerson
を使用していくつかのマネージャー メソッドをテストします。MockPerson
(人/src/test/Javaで:)
public class MockPerson {
public Person mockPerson(parameters...) {
return mockedPerson;
}
}
public class TestPerson() {
@Inject
private MockPerson mockPerson;
public testCreate() {
Person person = mockPerson.mockPerson(...);
// Asserts...
}
}
クラスはMockPerson
パッケージ化されません。
同じことが製品テストにも当てはまります。
( product/src/test/java内:)
public class MockProduct() { ... }
public class TestProduct {
@Inject
private MockProduct mockProduct;
// ...
}
MockProduct
必要ですが、パッケージ化されません。
注文テストには と が必要MockPerson
になるMockProduct
ため、現在、 と の両方を作成してMockOrder
テストする必要がありますOrder
。
(順番に/src/test/java :)
これらは重複Person
しているため、変更のたびに変更する必要がありProduct
ます
public class MockProduct() { ... }
public class MockPerson() { ... }
これはここにあるべき唯一のクラスです:
public class MockOrder() { ... }
public class TestOrder() {
@Inject
private order.MockPerson mockPerson;
@Inject
private order.MockProduct mockProduct;
@Inject
private order.MockOrder mockOrder;
public testCreate() {
Order order = mockOrder.mockOrder(mockPerson.mockPerson(), mockProduct.mockProduct());
// Asserts...
}
}
問題は、更新する必要がperson.MockPerson
あり、order.MockPerson
いつでもPerson
変更されることです。
とにかく依存関係がある他のすべてのテストが Mock.mock を呼び出して適切にセットアップされたオブジェクトを取得できるように、Mocks を jar と共に公開する方がよいのではないでしょうか? それとも、これは暗黒面ですか? 簡単な方法ですか?