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用例可能会在最后
- 通过:被testing的函数成功执行并按预期返回数据
- 未通过:被testing的函数成功执行,但返回的数据不符合预期
- 失败:该function没有成功执行,这不是
意图(与期望发生exception的负面testing案例不同)。
如果你使用的是eclipse,那么三个状态分别用绿色,蓝色和红色标记来表示。
我使用第三种scheme的失败操作。
例如:public Integer add(integer a,Integer b){return new Integer(a.intValue()+ b.intValue())}
- 通过的情况:a =新的Interger(1),b =新的整数(2),函数返回3
- 未通过的情况:a =新的Interger(1),b =新的整数(2),并且函数返回soem值而不是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失败,直到你可以完成实施它听起来也是合理的。