2

私は、さまざまな方法でエンティティを作成して操作するサービスのJUnitテストを作成しています。テストでさまざまなアクティビティの組み合わせを試してもらいたいです。私はこのようなものを持っています:

test1() {
/** create entity **/
/** assert **/
}

test2() {
/** do X to entity **/
/** assert **/
}

test3() {
/** do X again to entity, expect failure **/
/** assert **/
}

test4() {
/** do Y to entity, expect success **/
/** assert **/
}

ただし、私の理解では、JUnitが正しい順序でテストを実行することは期待できず、各テストは完全に自己完結型である必要があります。

しかし、すべてのテストを自己完結型にすると、重複するコードがたくさんあり、実行時間がかなり長くなり、維持するのがより困難になります...たとえば、次のようになります。

test1() {
/** create entity **/
/** assert **/
}

test2() {
/** create entity **/
/** do X to entity **/
/** assert **/
}

test3() {
/** create entity **/
/** do X to entity **/
/** do X again to entity, expect failure **/
/** assert **/
}

test4() {
/** create entity **/
/** do X to entity **/
/** do X again to entity, expect failure **/
/** do Y to entity, expect success **/
/** assert **/
}

...あなたが私に従うなら。

だから私の質問は、コードがクリーンでエレガントになるようにこれらのテストを書くための「正しい」方法は何ですか?

ありがとう、ロブ

4

3 に答える 3

4

@Before注釈付きメソッドを使用して、テストで使用するエンティティを初期化できます。次に、@After注釈付きのメソッドを使用して、テストで使用されているリソースをクリア/解放します。

あなたが持つことができます:

private Entity entity;

@Before
public void init() {
  entity = ...
}

@Test
public void test1() {
  // do things to entity
  ...
}
于 2012-06-25T18:22:38.307 に答える
2

重複したコードを処理するために、各テストメソッドでセットアップメソッドを呼び出すことができます。

すなわち

test1() {
setup();
/** create entity **/
/** assert **/
}

test2() {
setup();
/** create entity **/
/** do X to entity **/
/** assert **/
}

setup(){
/**perform setup here*/
}
于 2012-06-25T18:30:46.257 に答える
1

どちらが読みやすいですか?

@OrderRunner
public class EntityTest {
  Entity e;

  shouldBeCreatedInValidState() {
    e = new Entity();
    assert(e.isValid());
  }

  shouldBeWigglable() {
    e.wiggle();
    assert(e.hasBeenWiggled());
  }

  shouldNotBeWigglableTwice() {
    try {
       e.wiggle();
       fail("Wiggled too many times")
    } catch(OverWiggledException e) {}
  }
}

また

public class EnttityTest {
  shouldBeCreatedInValidState() {
    Entity e = new Entity();
    assert(e.isValid());
  }

  shouldBeWigglable() {
    Entity e = new Entity();
    e.wiggle();
    assert(e.hasBeenWiggled());
  }

  shouldNotBeWigglableTwice() {
    Entity e = new Entity();
    e.wiggle();
    try {
       e.wiggle();
       fail("Wiggled too many times")
    } catch(OverWiggledException e) {}
  }
}

私の好みは後者です。この属性は見逃しやすいため、2番目の「小刻みに動く」は、テスト全体の因果関係を一目見ただけで1つの小刻みに動くように見えます。

また、セットアップ/テストメソッドがより複雑な場合は、メソッドを作成します。

  shouldNotBeWigglableTwice() {
    givenAnEntity();
    andIWiggleIt();
    try {
       whenIWiggleIt();
       thenItShouldThrowAnException();
    } catch(OverWiggledException e) {}
  }
于 2012-07-03T09:13:53.300 に答える