JUnit测试中的假设(Assume)和断言(Assert)区别

32

我了解到,如果假设失败,assume不会运行测试,但我不确定何时应该使用 assertassume 的逻辑。

例如:任何资源加载检查都应该使用assume吗?

我应该在什么情况下使用assume而不是assert

(注:我正在寻找正确的设计,以便在两者之间进行选择)


4个回答

39
如你所知,当出现问题时,你可以使用assert来使测试失败。
如果有一些情况下测试不应该运行,你可以使用assume。"不运行"意味着它无法失败,因为它根本没有运行。
所以,在一个假设的场景中:
- 你为不同的客户构建了不同的版本,并且 - 你有一些只适用于特定客户的资源,并且 - 这个资源是可测试的,
那么你会编写一个测试:
- 假设这个资源存在(所以测试将不会在没有这个资源的客户上运行),然后 - 断言关于这个资源的一切都是正常的(所以在实际拥有这个资源的客户上,测试确保资源是正确的)。
从技术上讲,assertassume都会抛出异常。区别在于:
  • assert抛出的异常类型会导致测试失败,而
  • assume抛出的异常类型会导致测试被跳过。

12

断言(Assert)类是JUnit的工作马和JUnit测试人员最熟悉的类。大多数JUnit断言的签名都具有相似的特点。它们由一个可选的消息、一个期望的实例或变量以及要进行比较的实际实例或变量组成。对于像True、False或Null之类的布尔测试,只需要测试实际实例即可。

带有消息的签名只需要一个带有消息字符串的初始参数,该字符串将在断言失败时显示:

assert<something>(“Failure Message String”, <condition to be tested>);

假设: 您可能已经听说过最好不要基于假设工作,这里是 JUnit 提供给您的测试工具,以确保您的测试不依赖于假设。

Asserts 和 Assumes 都会在测试失败时停止并继续进行下一个测试。区别在于,失败的 Assert 会将其注册为一项失败的测试,而 Assume 只会移动到下一个测试。这使得测试人员可以确保在运行测试之前,存在所需的条件,其中某些条件可能是外部且不在测试人员的控制范围内。

Assumes 有四种变体:用于检查布尔条件的变体、用于检查未发生异常的变体、用于检查空对象的变体,以及可以接受 Hamcrest 匹配器的变体。如上面 Assert 部分所示,接受 Hamcrest 匹配器的能力是实现测试灵活性的关键。

您可以在此处阅读更多信息 https://objectcomputing.com/resources/publications/sett/march-2014-junit-not-just-another-pretty-assert/

简而言之,Assume 用于禁用测试,例如以下代码会禁用 Linux 上的测试:Assume.assumeFalse(System.getProperty("os.name").contains("Linux"));
Assert 用于测试功能。


5
Assert 和 Assume 最简单的区别是:
Assume 只有在前提为真时才会运行,如果为假则会被跳过。
assumeTrue(boolean assumption, String message)

Assert(断言) 在条件为真时运行正常。如果条件为假,则会给出预定义的错误消息。

assertTrue(boolean condition, String message)

3

只需查看javadoc,即可了解Assume:

一组有用的方法,用于说明测试具有意义的条件。失败的假设并不意味着代码有问题,而是测试提供的信息没有用处。

换句话说:当assert触发时,您知道测试用例失败了。您的生产代码并未按预期执行。

假设的意思是...您不确定发生了什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接