web-dev-qa-db-ja.com

ヘルパーメソッドをテストクラスから分離しますか?

テストの際、ヘルパーメソッドは繰り返しのタスクに役立ちます。テスト設定で。

具体例:SpringのRestTemplateを使用して、残りのインターフェイスに対して特定のテストを行っています。簡単にするために、リクエストはヘルパーメソッド(ここでは、メソッドA()と呼びましょう)を使用して送信されます。このメソッドは、応答からオブジェクトを返します。

このヘルパーメソッドA()は、実際にはテストではないメソッドであるため、テストクラスを汚染するようです。テストクラスに複数のヘルパーメソッドがあると、概要に関してマイナスの影響があります。

すべてのヘルパーメソッドを含む、テストクラスの隣に2つ目のクラスを作成することはできますか?そうすることの難しさは何ですか?または、テストクラスの概要を適切に保つ他の方法はありますか?

  • MyTestClass->実際のテストであるメソッドのみを含む
  • MyTestClassUtil-> MyTestClassによって使用されるすべてのヘルパーメソッドを含む
9
Herr Derb

すべてのヘルパーメソッドを含む、テストクラスの隣に2つ目のクラスを作成することはできますか?

allヘルパーメソッドではなく、複数のテストクラスで使用されるヘルパーメソッドを使用します。

ビジネスクラスを実装するのと同じ方法でテストを設計します。

クラス内で複製されたコードをローカルメソッドにリファクタリングします。メソッドが別のテストクラスで使用されている場合は、別のテストで使用されている別のテストヘルパークラスにメソッドを移動します。

したがって、私のOrderTestsクラスにはローカルメソッドassertEqual(String message, IOrder expected, IOrder actual)があり、ヘルパーTestDataFactoryにはOrderTestsで使用される静的メソッドcreateTestOrder()があります、PriceCalculationTestsPaymentTestsDeliveryTests

テストでは、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) {
    }
}
10
k3b

Michael C. Feathersによると レガシーコードを効果的に使用する 彼はオブジェクトシームと呼ばれるものを作成できます。テストするインターフェイスを実装するクラス、またはテストするクラスから継承するクラス。この場合、単体テストで元のコードを汚染することはありません。

2
A.Rashad