JUnittesting用例中“失败”的实际用法是什么?

JUnittesting用例中“失败”的实际用法是什么?

有些情况下,我发现它很有用:

  • 标记一个不完整的testing,所以它会失败,并警告你,直到你能完成它
  • 确保引发exception:
try{ // do stuff... fail("Exception not thrown"); }catch(Exception e){ assertTrue(e.hasSomeFlag()); } 

注意:

由于JUnit4,有一个更优雅的方法来testing抛出exception:使用注释@Test(expected=IndexOutOfBoundsException.class)

但是,如果您还想检查exception,那么这将不起作用,那么您仍然需要fail()

可以说你正在编写一个testing用例来testing被测代码应该引发exception

 try{ bizMethod(badData); fail(); // FAIL when no exception is thrown } catch (BizException e) { assert(e.errorCode == THE_ERROR_CODE_U_R_LOOKING_FOR) } 

我认为通常的用例是在负面testing中没有exception时调用它。

像下面的伪代码:

 test_addNilThrowsNullPointerException() { try { foo.add(NIL); // we expect a NullPointerException here fail("No NullPointerException"); // cause the test to fail if we reach this } catch (NullNullPointerException e) { // OK got the expected exception } } 

我在@Before方法中可能出现错误的情况下使用了它。

 public Object obj; @Before public void setUp() { // Do some set up obj = new Object(); } @Test public void testObjectManipulation() { if(obj == null) { fail("obj should not be null"); } // Do some other valuable testing } 

只需使用:

 org.junit.Assert.fail("Exception expected"); 

这是我如何使用Fail方法。

有三个状态,你的testing用例可能会在最后

  1. 通过:被testing的函数成功执行并按预期返回数据
  2. 未通过:被testing的函数成功执行,但返回的数据不符合预期
  3. 失败:该function没有成功执行,这不是

意图(与期望发生exception的负面testing案例不同)。

如果你使用的是eclipse,那么三个状态分别用绿色,蓝色和红色标记来表示。

我使用第三种scheme的失败操作。

例如:public Integer add(integer a,Integer b){return new Integer(a.intValue()+ b.intValue())}

  1. 通过的情况:a =新的Interger(1),b =新的整数(2),函数返回3
  2. 未通过的情况:a =新的Interger(1),b =新的整数(2),并且函数返回soem值而不是3
  3. 失败案例:a = null,b = null,该函数抛出一个NullPointerExceptionexception

例如,我使用fail()来指示尚未完成的testing(发生)。 否则,他们会显示成功。 这可能是由于我不了解NUnit中存在的某种不完整()function。

最重要的用例可能是exception检查。

虽然junit4包含用于检查是否发生exception的预期元素 ,但它似乎不属于较新的junit5的一部分。 在expected中使用fail()另一个优点是可以将它与finally允许testing用例清理结合起来。

 dao.insert(obj); try { dao.insert(obj); fail("No DuplicateKeyException thrown."); } catch (DuplicateKeyException e) { assertEquals("Error code doesn't match", 123, e.getErrorCode()); } finally { //cleanup dao.delete(obj); } 

正如另一个评论所指出的。 有一个testing失败,直到你可以完成实施它听起来也是合理的。