ChatGPT解决这个技术问题 Extra ChatGPT

断言与 JUnit 断言

今天我看到一个使用 java 断言而不是 JUnit 断言的 JUnit 测试用例——偏爱一个比另一个有明显的优点或缺点吗?

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

S
Sinc

在 JUnit4 中,JUnit 断言抛出的异常(实际上是错误)与 java assert 关键字(AssertionError)抛出的错误相同,因此它与 assertTrue 完全相同,但堆栈跟踪除外。 t 区分。

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

一般来说,正因为如此,我认为使用 JUnit assertTrue 是更好的做法,因为它保证测试运行,确保一致性(您有时使用 assertThat 或其他不是 java 关键字的断言)和如果 JUnit 断言的行为将来会发生变化(例如挂钩某种过滤器或其他未来的 JUnit 功能),您的代码将能够利用它。

在 java 中 assert 关键字的真正目的是能够在没有运行时损失的情况下将其关闭。这不适用于单元测试。


A
Adamski

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


-ea 始终在 mvn test 中启用,不需要 -ea。更丰富的api,很好的捕获。有时我认为 API 在测试中被误用,因为它不是应用程序的一部分(API 中的一个),我更喜欢称它为更丰富的方法。
s
starmer

当测试失败时,您将获得更多信息。

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

对比

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

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


试试 assert 1==2: "1 is not 2";
@PeterRader 在未启用 -ea 时尝试使用 assert 关键字。或者更好的是,使用始终有效的 JUnit 断言。
@ThomasW 当 -ea 未启用时,它不是测试。 JUnit 断言并不总是有效,它们仅在您决定使用 JUnit 框架时才有效,并且在 maven 的情况下,maven 依赖项必须仅在测试范围内。我们在这里有两个方面:你更喜欢什么?第一方面:使用框架,仅作为测试范围中的依赖项,必须下载,eclipse 允许您在不在 src/main-folder 中但不会在那里编译的类中使用,因为 maven 仅在测试中具有 junit-范围或第二面:使用内置的东西。
@PeterRader 这个问题是关于 JUnit 测试用例的。在这种情况下,应该使用 JUnit 或类似的断言类,因为这些总是启用的。我个人曾被过去未启用 Java 'assert' 关键字所困扰,并且不相信不可靠的断言在测试代码中占有一席之地。
在功能代码中断言的单独上下文中——对于健壮的编程实践很重要,尽管实际上不是问题的主题——Spring 和 Google Guava 都有断言类,它们总是被启用的。我建议大量使用这些作为参数 &陈述前提条件以确保正确性。除此之外,在性能关键区域中,可能有一小块区域更适合使用 Java assert —— 用于影响性能的正确性检查,因此最好默认禁用。然而,我的经验是,大多数断言应该永远在线。
B
Bruno D. Rodrigues

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


C
CheesePls

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


您将使用 JUnit 作为测试运行框架。断言实际上只是 JUnit 为您提供的价值的一小部分。没有 Assert 的 JUnit 需要更多样板文件。 assert 如果没有 JUnit,您将需要编写一个完整的框架。
我更想说的是,如果您要使用该工具,请使用该工具。在 JUnit 测试用例中,常规的旧断言语句似乎有点愚蠢。在我看来,它们属于实际代码。
@CheesePls“常规旧断言语句”实际上比 JUnit 断言更新。
D
Dan Coates

如果您专门使用闪亮和新的东西,这可能不适用,但直到 1.4SE 才将断言引入 Java。因此,如果您必须在使用旧技术的环境中工作,出于兼容性原因,您可能会倾向于使用 JUnit。