今天,我看到了一个带有Java断言而不是JUnit断言的JUnit测试用例-相对于另一个而言,优先选择一个优点还是缺点?
Answers:
在JUnit4中,JUnit断言引发的异常(实际上是Error)与javaassert
关键字(AssertionError)引发的错误相同,因此它assertTrue
与堆栈跟踪完全相同,而您无法分辨出堆栈跟踪。
话虽这么说,断言必须在JVM中使用特殊标志运行,导致许多测试似乎通过了,仅仅是因为有人在运行JUnit测试时忘记使用该标志配置系统-不好。
通常,由于这个原因,我认为使用JUnitassertTrue
是更好的做法,因为它可以保证测试运行,确保一致性(有时使用assertThat
或不是Java关键字的其他断言),以及JUnit的行为是否断言应该在将来进行更改(例如,加入某种过滤器或其他将来的JUnit功能),您的代码将能够利用这一点。
Java中assert关键字的真正目的是能够将其关闭而不会影响运行时。这不适用于单元测试。
如果测试失败,您将获得更多信息。
assertEquals(1, 2);
结果是 java.lang.AssertionError: expected:<1> but was:<2>
与
assert(1 == 2);
结果是 java.lang.AssertionError
如果将message参数添加到,则可以获得更多信息 assertEquals
assert 1==2: "1 is not 2";
。
assert
可能是Java的首选-用于正确性检查,这会影响性能,因此最好在默认情况下禁用。但是我的经验是,大多数断言都应该始终存在。
我会说在测试用例中使用JUnit断言,并在代码中使用Java的断言。换句话说,很明显,真实的代码永远不会有JUnit依赖关系,并且如果它是一个测试,它应该使用它的JUnit变体,而不能使用断言。
我会说,如果您使用的是JUnit,则应使用JUnit断言。assertTrue()
基本上与相同assert
,否则为什么还要使用JUnit?
Assert
将需要更多样板。assert
没有JUnit,将需要您编写整个框架。