テストの際、ヘルパーメソッドは繰り返しのタスクに役立ちます。テスト設定で。
具体例:SpringのRestTemplate
を使用して、残りのインターフェイスに対して特定のテストを行っています。簡単にするために、リクエストはヘルパーメソッド(ここでは、メソッドA()
と呼びましょう)を使用して送信されます。このメソッドは、応答からオブジェクトを返します。
このヘルパーメソッドA()
は、実際にはテストではないメソッドであるため、テストクラスを汚染するようです。テストクラスに複数のヘルパーメソッドがあると、概要に関してマイナスの影響があります。
すべてのヘルパーメソッドを含む、テストクラスの隣に2つ目のクラスを作成することはできますか?そうすることの難しさは何ですか?または、テストクラスの概要を適切に保つ他の方法はありますか?
MyTestClass
->実際のテストであるメソッドのみを含むMyTestClassUtil
-> MyTestClass
によって使用されるすべてのヘルパーメソッドを含むすべてのヘルパーメソッドを含む、テストクラスの隣に2つ目のクラスを作成することはできますか?
allヘルパーメソッドではなく、複数のテストクラスで使用されるヘルパーメソッドを使用します。
ビジネスクラスを実装するのと同じ方法でテストを設計します。
クラス内で複製されたコードをローカルメソッドにリファクタリングします。メソッドが別のテストクラスで使用されている場合は、別のテストで使用されている別のテストヘルパークラスにメソッドを移動します。
したがって、私のOrderTests
クラスにはローカルメソッドassertEqual(String message, IOrder expected, IOrder actual)
があり、ヘルパーTestDataFactory
にはOrderTests
で使用される静的メソッドcreateTestOrder()
があります、PriceCalculationTests
、PaymentTests
、DeliveryTests
。
テストでは、1つまたは複数の標準のファクトリメソッドを使用し、必要に応じて変更できます。例:
DeliveryTests.executeOrderWithNoDeliveryAdressShouldThrow() {
// a valid standard order with one article, user, deliveryadress, ...
Order sut = TestDataFactory.createTestOrder();
sut.setDeliveryAdress(null); // implements "WithNoDeliveryAdress"
try {
sut.execute(); // this should throw
Assert.fail(); // this should never be reached because of exception.
} catch(OrderNotCompleteException) {
}
}
Michael C. Feathersによると レガシーコードを効果的に使用する 彼はオブジェクトシームと呼ばれるものを作成できます。テストするインターフェイスを実装するクラス、またはテストするクラスから継承するクラス。この場合、単体テストで元のコードを汚染することはありません。