jUnit fail()约定

时间:2011-02-06 03:12:01

标签: unit-testing junit conventions

我想知道,按照惯例,当测试失败时,是否适合:

  • 说出它失败的原因(业务逻辑)
  • 说明为什么会看到该消息(异常应该被抛出而不是)

例如,

fail("Accessed the element which does not exist");

fail("ArrayIndexOutOfBoundException was expected but something bad happened");

通常首选/接受哪一个?

3 个答案:

答案 0 :(得分:14)

首先,如果您希望测试的API抛出异常,而不是使用try-catch进行fail() ...

@Test
public void testMe() {
   try {
      api.testThis();
      fail("should not reach here");
   }
   catch(MyException e) {}
}

......你应该这样做: -

@Test(expected=MyException.class)
public void testMe() {
   api.testThis();
}

那就是说,我很少使用fail()。如果我需要执行某些验证并且条件失败,我很可能会使用断言而不是使用fail() ...例如: -

......而不是......

@Test
public void testMe() {
   boolean bool = api.testThis();
   if (!bool) {
      fail("should be true because bla bla bla");
   }
}

......这样做: -

@Test
public void testMe() {
   boolean bool = api.testThis();
   assertTrue("bla bla bla",bool);
}

但是,如果你真的需要使用fail(),请详细说明为什么它失败而不是“不应该到达这里”或“应该在这里失败”,因为这对读取测试用例的人没有帮助。

当然,这些只是简单的例子....但我想我得到了我的观点。 :)

答案 1 :(得分:9)

鉴于这是测试代码并且不应该进入最终构建,我会说越详细越好。因此,我会选择第一个 - 问题的根本原因更清楚,这使得更容易纠正。

我在任何情况下都会避免使用第二个,因为它对测试人员来说并不是很有帮助,如果它确实以某种方式使它进入最终构建,它比第一个用户更加神秘 - 它根本没有帮助对于测试人员或用户而言。

我要考虑的另一个选项是指出发生了异常,而不是提供实际异常的详细信息 - 这就是发明堆栈跟踪的原因。这将传达比列出的任何方法更多的细节。

答案 2 :(得分:4)

如果关于此的约定,我会忽略它。你应该说最好的方式是与看到这条消息的人沟通问题的本质,以便尽可能轻松地解决问题。在这方面,往往不遵守公约。