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

您可以在每个测试方法中调用 setup 方法来处理重复代码。

IE

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) {}
  }
}

我的偏好是后者。该属性很容易被遗漏,因此第二个“摆动”看起来像是对测试进行因果扫描时的一次摆动。

如果设置/测试方法更复杂,那么创建方法。

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