Transient Fixture Management

Transient Fixture Management



Building Fresh Fixtures

Transient Fresh Fixture や Persistent Fresh Fixture を作成する方法として以下がある。

  • In-line Fixuture Setup
  • Delegated Setup
  • Implicit Setup

In-line Fixture Setup

  • In-line Setup とは、以下のようにTest Method 内ですべてのフィクスチャーセットアップを行う方法。
public void testStatus_initial() {
  // In-line setup
  Airport departureAirport = new Airport("Calgary", "YYC");
  Airport destinationAirport = new Airport("Toronto", "YYZ");
  Flight flight = new Flisht(flightNumber, departureAirport, destinationairport);

  // Exercise SUT and verify outcome
  assertEquals(FlightState.PROPOSED, flight.getStatus());

  // tearDown:
   // Garbage-collected
}
  • 短所は、Test Code Duplication になりやすいこと。理由は、各 TEst Method で毎回SUTの生成が必要だから。その結果、Fragile Tests によって、High Test Maintenance Cost になりやすい。
  • また、フィクスチャの生成方法が複雑な場合、Obscure Tests になりやすい。関連する問題として、Hard-Coded Test Data となる。

Delegated Setup

  • Delegate Setup とは、In-line Setup の処理を抽出して Test Utility Method として切り出すフィクスチャーセットアップを行う方法。
  • 抽出されたメソッドはテストが依存するオブジェクトを生成するロジックを含むため Creation method と呼ばれる。
  • Creation method に何を生成するかという意図がわかる名前をつけることでテストの読み手はどのように生成するかを意識せずに理解できる。
public void testGetStatus_initial() {
  // Setup
  Flight flight = createAnonymousFlight();
  //Exercise SUT and verify outcome
  assertEquals(FlishtState.PROPOSED, glight.getStatus());
  // Teardown
  // Gabage-collected
}
  • テストが特定のオブジェクトについて生成される必要がない場合は、Anonymous Creation Method を使える。これは、Destinct Generated Vaue を使うことでオブジェクト生成時にユニークなキーを生成でき、同じオブジェクトを複数のテストで使い回すことによる Erratic Test(Unrepeatable Test, Interacting Tests, Test Run Wars)の発生を防ぐ効果がある。
  • テストが生成されるオブジェクトの属性を気にする必要がある場合は、Parameterized Anonymous Creation Mehod を使う。このメソッドは、テストがケアすべき何らかの属性を渡される。
  • 「テストメッソド内であらわれるべき何か重要なものがなければ、テストメソッド内でそれがあらわれないのが重要である。」という筆者のモットーがある。
  • One Bad Attributeパターンは、Creation Method を最初に呼び出し、その後にSUTによってリジェクトされるようなある特定の不正な値のみを置き換える方法である。これにより Test Code Duplication の多くを排除できる。

Implicit Setup

  • Implicit Fixuture Setup とは、多くの xUnit が提供している テストメソッド実行前に呼ばれるhookである。JUnitで言うところの @before アノテーションをつけたメソッド。

  • この方法は、Test Method だけを読んだだけではテストの事前条件がわからなくなるためテストを理解するのが難しくなる。また、Implicit Setup 内では、オブジェクトの参照を保持するのにローカル変数が使えないという問題がある。代わりにインスタンス変数を使った場合、その変数はグローバル変数のように振る舞いどのテスト絵ソッドがどの変数に依存するのかが不明確になるため Obscure Tests を引き起こす。

Tearing Down Transient Fresh Fixtures

  • 多くのプログラミング言語では garbsse collection をサポートしているので、Transient Fresh Fixutureを利用した場合は、特に Tear down として処理をする必要がないのが利点である。

//