プロパティは本番データベース(またはテスト用クローン)で定義されている場合、これはない単体テスト。単体テストは作業単位をチェックし、特定の外部状態が機能することを要求しません。これはOffer1
、データベースで男性のみのオファーとして定義されていることを前提としています。それが外部状態です。したがって、これは統合テスト、具体的にはシステムまたは受け入れテストに近いものです。多くの場合、受け入れテストはスクリプト化されていません(テストフレームワークでは実行されませんが、人間が手動で実行します)。
ドメインモデルでif
ステートメントを使用してプロパティが定義されている場合、同じテストは単体テストです。そして、それはもろいかもしれません。しかし、実際の問題は、コードが脆弱であることです。一般的なルールとして、ビジネスの動作をハードコーディングするのではなく設定できる場合、コードの復元力が高まります。小さなコーディングエラーを修正するために急いで展開することはまれです。しかし、ビジネス要件が予告なしに変更されるのは、火曜日(毎週発生するもの)にすぎません。
単体テストフレームワークを使用してテストを実行している可能性があります。ただし、単体テストフレームワークは、単体テストの実行に限定されません。統合テストも実行できます。
あなたはユニットテストを書いていた場合は、両方を作成しますperson
とoffer1
、データベースの状態には依存して地面から。何かのようなもの
[Fact]
public void ReturnsFalseWhenGivenAPersonWithAGenderOfFemale()
{
var personId = Guid.NewGuid();
var gender = "F";
var person = new Person(personId, gender);
var id = Guid.NewGuid();
var offer1 = new Offer1(id, "ReturnsFalseWhenGivenAPersonWithAGenderOfFemale");
offer1.markLimitedToGender("M");
Assert.False(offer1.IsEligible(person));
}
これはビジネスロジックに基づいて変化しないことに注意してください。offer1
女性を拒否することを主張しているのではありません。それはoffer1
女性を拒絶するタイプの申し出をしている。
テストの一部としてデータベースを作成および構成できます。C#では、NUnitを使用して、またはJavaのJUnitでは、Setup
メソッドでデータベースをセットアップします。おそらく、テストフレームワークには同様の概念があります。この方法では、SQLを使用してデータベースにレコードを挿入できます。
実稼働データベースの代わりにテストデータベースを使用するコードを記述することが難しい場合、アプリケーションのテストの弱点のように聞こえます。テストでは、置換を許可する依存性注入のようなものを使用する方が良いでしょう。次に、現在のビジネスルールに依存しないテストを作成できます。
これの副次的な利点は、多くの場合、ビジネスオーナー(必ずしも企業オーナーではなく、企業階層のこの製品の責任者のような)がビジネスルールを直接構成しやすいことです。この種の技術的なフレームワークがある場合、ビジネスオーナーがユーザーインターフェイス(UI)を使用してオファーを構成できるようにするのは簡単だからです。ビジネスオーナーはUIで制限を選択し、markLimitedToGender("M")
呼び出しを発行します。その後、オファーがデータベースに永続化されると、これが保存されます。しかし、それを使用するためにオファーを保存する必要はありません。そのため、テストでは、データベースに存在しないオファーを作成および構成できます。
説明したシステムでは、ビジネスオーナーが技術グループにリクエストを送信する必要があります。技術グループは適切なSQLを発行し、テストを更新します。または、技術グループがコードとテスト(またはテストとコード)を編集する必要があります。それはかなり重いアプローチのようです。できます。ただし、テストするだけでなく、ソフトウェアの脆弱性はそれほど高くありません。
TL; DR:このようなテストを書くことはできますが、ソフトウェアを書く方がよいので、そうする必要はありません。