我想知道,按照惯例,当一个测试失败,是适当的:JUnit的失败()约定
- 说为什么会失败(业务逻辑)
- 说为什么看到这个消息(例外应该被抛出,它不是)
例如,
fail("Accessed the element which does not exist");
或
fail("ArrayIndexOutOfBoundException was expected but something bad happened");
哪一个通常被首选/接受?
我想知道,按照惯例,当一个测试失败,是适当的:JUnit的失败()约定
例如,
fail("Accessed the element which does not exist");
或
fail("ArrayIndexOutOfBoundException was expected but something bad happened");
哪一个通常被首选/接受?
鉴于这是测试代码,不应该进入最终版本,我会说越冗长越好。因此,我会选择第一个 - 问题的根本原因是什么更清晰,这使得更容易纠正。
在任何情况下,我都会避免使用第二个,因为它对测试人员来说并不是很有帮助,而且如果它以某种方式使其进入最终构建,那么它比第一个到最终用户更加神秘 - 它根本就不是帮助测试人员或用户。
我会考虑的另一个选择是,而不是指示发生异常,而是提供实际异常的详细信息 - 这就是栈迹线被发明的原因。这将传达比列出的任何方法更多的细节。
如果有是关于这个约定我会忽略它。你应该说任何能够最好地传达给看到这个信息的人的问题的本质,以便尽可能容易地解决问题。在这方面往往遵守一项公约就失败了。
但是如果有一个约定有人期望被忽略,它可能会导致混淆。当你写一个测试时,你不知道谁可能会在10年内看到它。然后呢......再过10年,也许这个惯例已经改变了。 – dantiston 2015-01-07 00:11:12
首先,如果你希望你测试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()
,要详细解释失败的原因,而不是“不应该来到这里”或“失败了这里”,因为这并不能帮助人们谁阅读测试用例。当然,这些只是一些简单的例子......但我想我可以得到我的观点。 :)
以前在注解语法中没有看到预期的异常。整齐。 – dantiston 2015-01-31 22:56:19
我喜欢你的用户名:) – JAM 2011-02-06 03:21:53