放置成功和失败测试案例的方法相同

时间:2012-11-02 17:00:59

标签: java unit-testing testing junit

假设我有一个名为foo的方法,对于某些输入值集合,预期成功完成并返回结果,对于其他一些值,预计会抛出某个异常。这种方法需要先设置一些东西才能进行测试。

鉴于这些条件,在一次测试中成功和失败测试是否更好,或者我应该在单独的测试方法中维护这些情况?

换句话说,以下哪两种方法更可取?

方法1:

@Test
public void testFoo() {
  setUpThings();
  // testing success case
  assertEquals(foo(s), y);
  // testing failure case
  try {
    foo(f);
    fail("Expected an exception.")
  } catch (FooException ex) {
  }
}

方法2:

@Test
public void testFooSuccess() {
  setUpThings();
  assertEquals(foo(s), y);
}

@Test
public void testFooFailure() {
  setUpThings();
  try {
    foo(f);
    fail("Expected an exception.")
  } catch (FooException ex) {
  }
}

5 个答案:

答案 0 :(得分:4)

最好采取方法#2。

为什么:

当一个断言失败时,该方法的其余部分不会被评估... 所以通过将测试放在两个单独的方法中,你肯定至少可以执行两个测试..失败与否。

单元测试不仅要关注一个特定的单元,还应该关注该单元的一个特定行为。一次测试多种行为只会弄脏水。 花点时间将每个行为分成自己的单元测试。

答案 1 :(得分:3)

方法3 (2的延伸)

@Before
public void setUpThings() {
  ...
}

@Test
public void testFooSuccess() {
  assertEquals(foo(s), y);
}

@Test(expected=FooException.class)
public void testFooFailure() {
  foo(f);
}

我很高兴有一次只运行一个条件的重点测试,因此失败的测试只能意味着一件事(方法2)。如果它们都使用相同的设置,您可以将其移动到常用的设置方法(@Before)。如果没有,也许最好考虑将相关案例分成不同的类,这样你不仅可以有更多专注的案例(方法),还可以有更多专注的装置(类)。

答案 2 :(得分:2)

我喜欢方法#2。单独的测试更好。

我不喜欢你如何测试2.这就是我要做的事情:

@Test(expected = FooException.class)
public void testFooFailure() {
  setUpThings();
  foo(f);
}

答案 3 :(得分:1)

对我来说,方法2是优选的。因为你首先测试快乐路径然后失败条件。 如果有人需要测试快乐的场景,那么你就会拥有它。

答案 4 :(得分:1)

将测试用例分开更好有两个原因:

  1. 你的测试用例应该是原子的
  2. 如果第一个断言条件失败,则不会评估第二个。
相关问题