在JUnit测试中假设vs断言

时间:2017-06-19 10:45:40

标签: java unit-testing junit

我已经读过如果假设失败,assume将无法运行测试, 但我不确定何时放置assert vs assume的逻辑。

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

我应该何时使用assume而不是assert

(注意:我正在寻找何时使用其中一个的正确设计)

4 个答案:

答案 0 :(得分:18)

如果您遇到某些测试根本无法运行的情况,您可以使用assume。 "没有运行"意味着它不会失败,因为它没有运行。

如果出现问题,您可以使用assert来验证测试失败。

所以,在假设情景中:

  • 您为不同的客户提供了不同的构建,
  • 您有一些资源仅适用于特定客户,
  • 关于该资源有一些可测试的东西,然后

你会写一个测试:

  • 假设资源存在,(因此测试不会在没有该资源的客户上运行),然后
  • 断言关于资源的一切都是可以的(所以对于实际拥有资源的客户,测试确保资源是应该的。)

答案 1 :(得分:7)

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/

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

答案 2 :(得分:2)

只需查看javadoc的假设:

  

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

换句话说:当断言触发时,您知道您的测试用例失败。您的生产代码没有按照您的预期执行。

假设意味着......你不确切知道发生了什么。

答案 3 :(得分:1)

Assert和Assume之间最简单的区别是:

假设仅在假设为真时运行。如果为假,将被跳过。

AndroidMenifest.xml
如果为true,

声明将正常运行。 在断言为假的情况下,它会提供预定义的错误消息。

<application
            android:label=""
            android:theme="@style/AppTheme">
            <activity
             .
             .
             .
             .
            </activity>
    </application>