How make JUnit to print asserts and results
我有一些像这样的测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Test
public void test01 ()
{
Position p = getPositionAt ('a', 1);
assertNotNull ("a1 exists", p );
assertNotNull ("figure exists a1", p. getFigure());
p = getPositionAt ('a', 2);
assertNotNull ("exists a2", p );
assertNull ("figure exists a2", p. getFigure());
p = getPositionAt ('b', 1);
assertNotNull ("exists b1", p );
assertNull ("figure exists b1", p. getFigure());
} |
运行测试时,我需要将每个断言消息打印到stdout,然后再输出断言的结果。
这是来自测试类的要求格式:
1 2 3 4 5 6
| a1 exists -success
figure exists a1 -success
exists a2 -success
figure exists a2 -succcess
exists b1 -succcess
figure exists b1 -failed |
但是该怎么做呢? 我是使用JUnit的新手,却一无所知。 是否可以使用runners和suites? 还是存在任何assertSuccess(),assertFailed()方法? 感谢您的提示。
-
顺便说一下,message参数仅在断言失败时适用,因此您的assertNotNull消息实际上应为" a1不存在"等。
-
您为什么要这样做有任何特殊原因?
-
您的两种需求都可以视为单元测试领域的反模式。 您的测试应该只断言一件事,因此应该没有理由要一个不失败的断言。 您的测试应该是自动化的,所有检查都由断言完成,因此应该不需要打印输出以进行手动检查。 在实践中,有充分的理由想要第一个,例如运行表驱动的测试以及需要多个assert调用来检查一个逻辑事实。 但是要警惕第二个。 自动化是单元测试和回归测试中前进的唯一途径。
首先,您有两个问题,而不是一个。断言失败时,将引发AssertionError异常。这样可以防止检查超过此点的任何断言。为了解决这个问题,您需要使用ErrorCollector。
其次,我不相信JUnit内置任何方法可以做到这一点。但是,您可以实现包装断言的自己的方法:
1 2 3 4 5 6 7 8 9 10
| public static void assertNotNull (String description, Object object ){
try{
Assert. assertNotNull(description, object );
System. out. println(description +" - passed");
}catch(AssertionError e ){
System. out. println(description +" - failed");
throw e ;
}
} |
-
不应该在函数TestCase.assertNotNull中使用assertNotNull吗?
所有assertXXX方法的格式都允许在出错时显示String:
assertNotNull("exists a2", p); // prints"exists a2" if p is null
成功打印消息没有特殊价值。
编辑
Junit通常提供两种断言形式。要遵循上面的示例,您可以使用以下2种方法之一来测试空值:
assertNotNull(p)
要么
assertNotNull("my message on failure", p)
框架将无需您的其他任何努力就打印错误消息(由框架提供)。
要测试异常,可以使用以下模式:
1 2 3 4 5
| try{
someCall ();
catch(Exception e ){
fail (): // exception shouldn't happen, use assertTrue(true) if it should
} |
同样,这些消息的添加方法有多种版本
检查API
-
好的,所以我可以将消息移到断言的前面,但是如何确定断言通过还是打印结果消息失败?
-
捕获异常,如我的答案所示,但如果这样做,请确保重新抛出异常(或将其捕获到错误收集器中),否则您将得到误报
-
我确实使用assertTrue(" some message",assertion);并且消息仍然不打印。
-
请不要忽略测试中的异常。只需扔掉它们或重新扔出更多信息即可。异常子句中的fail()调用有问题。只是传播异常...不要写自己的仅因测试失败而存在的catch块
-
@ AlikElzin-kilaka感谢您的评论,我很惊讶这个答案仍然受到关注!我不同意您的评论,但会补充说,针对预期异常的测试是通过测试的一部分,因此是有效的。另外,在某些情况下,调用fail()的用例也是如此。我同意我的榜样会更好。
最后一种选择是将每个断言与对应的System.out.println配对,尽管显然这不理想。尽管如此,如果其他所有方法都失败了,它将解决问题。