断言与JUnit断言


85

今天,我看到了一个带有Java断言而不是JUnit断言的JUnit测试用例-相对于另一个而言,优先选择一个优点还是缺点?


JUnit断言和Java'assert'关键字之间绝对存在事实差异。这根本不是一个基于观点的问题。
Thomas W

Answers:


95

在JUnit4中,JUnit断言引发的异常(实际上是Error)与javaassert关键字(AssertionError)引发的错误相同,因此它assertTrue与堆栈跟踪完全相同,而您无法分辨出堆栈跟踪。

话虽这么说,断言必须在JVM中使用特殊标志运行,导致许多测试似乎通过了,仅仅是因为有人在运行JUnit测试时忘记使用该标志配置系统-不好。

通常,由于这个原因,我认为使用JUnitassertTrue是更好的做法,因为它可以保证测试运行,确保一致性(有时使用assertThat或不是Java关键字的其他断言),以及JUnit的行为是否断言应该在将来进行更改(例如,加入某种过滤器或其他将来的JUnit功能),您的代码将能够利用这一点。

Java中assert关键字的真正目的是能够将其关闭而不会影响运行时。这不适用于单元测试。


26

我更喜欢JUnit断言,因为它们提供了比内置assert语句更丰富的API,并且更重要的是assert,与-eaJVM参数不同,不需要显式启用JUnit断言。


1
-ea始终处于启用状态mvn test,无需-ea。丰富的api,很好的捕获。有时我认为API在测试中被滥用,因为它不是应用程序的一部分(api中的a),我更喜欢将其称为更丰富的方法。
Grim

19

如果测试失败,您将获得更多信息。

assertEquals(1, 2); 结果是 java.lang.AssertionError: expected:<1> but was:<2>

assert(1 == 2); 结果是 java.lang.AssertionError

如果将message参数添加到,则可以获得更多信息 assertEquals


9
尝试一下assert 1==2: "1 is not 2";
格林(Grim)2015年

@PeterRader如果未启用-ea,请尝试使用assert关键字。或者更好的是,使用始终有效的JUnit断言。
Thomas W

1
如果未启用-ea,则@ThomasW不是测试。JUnit联合并不总是有效,仅当您决定使用JUnit是什么框架时,它们才有效。如果是maven,则为maven依赖关系,而maven依赖关系必须仅在测试范围内。这里有两个方面:您更喜欢什么?第一面:使用仅作为测试范围内的依赖项必须下载的框架,该eclipse可让您在src / main-folder以外的类中使用,但不会在其中编译,因为maven仅在test-中具有junit范围或第二面:使用内置的东西。
Grim

1
@PeterRader这个问题是关于JUnit测试用例的。在这种情况下,应该使用JUnit或类似的断言类,因为它们始终处于启用状态。我个人曾经因为过去没有启用Java'assert'关键字而感到困惑,并且不相信不可靠的断言会在测试代码中占有一席之地。
Thomas W

在功能代码断言的单独上下文中-对健壮的编程实践很重要,尽管实际上不是问题的主题-Spring和Google Guava都具有始终启用的断言类。我建议大量使用它们作为参数和状态的前提条件,以确保正确性。除此之外,在性能至关重要的区域中,可能会有一个较小的区域assert可能是Java的首选-用于正确性检查,这影响性能,因此最好在默认情况下禁用。但是我的经验是,大多数断言都应该始终存在。
Thomas W

8

我会说在测试用例中使用JUnit断言,并在代码中使用Java的断言。换句话说,很明显,真实的代码永远不会有JUnit依赖关系,并且如果它是一个测试,它应该使用它的JUnit变体,而不能使用断言。


0

我会说,如果您使用的是JUnit,则应使用JUnit断言。assertTrue()基本上与相同assert,否则为什么还要使用JUnit?


4
您可以将JUnit用于测试运行框架。断言实际上只是JUnit给您带来的价值的一小部分。没有JUnit的Assert将需要更多样板。assert没有JUnit,将需要您编写整个框架。
Yishai 2010年

1
我要说的是如果您要使用该工具,请使用工具。常规的旧断言语句在JUnit测试用例中似乎有点愚蠢。在我看来,它们属于实际的代码。
CheesePls 2010年

1
@CheesePls“常规旧断言语句”实际上比JUnit断言更新。
2012年

0

如果您仅使用有光泽的新东西,但是断言直到1.4SE才引入Java,这可能不适用。因此,如果必须在使用较旧技术的环境中工作,出于兼容性原因,您可能倾向于使用JUnit。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.