2

如何查看assumeThatJUnit4 中的错误消息?

该测试通过但不打印任何内容。原因是要对 进行测试read1,我b需要true。由于bfalse,因此该测试不适用。

boolean b = false;
byte[] read1 = null;
assumeThat("b shold be true to continue testing", b, is(true));
assertThat("read1 should not be null", read1, is(notNullValue()));

我没有找到任何类型的assumeThat消息日志。我的问题是我想知道哪些测试通过但没有完成,因为假设 X 失败。如果仍然为假设打印一条消息(例如类似于断言失败时),那就太好了。

奇怪的是,我无法找到关于这个问题的评论(包括在 JUnit 页面中)。所以有可能我只是做错了什么或在错误的地方寻找消息。我正在使用 Eclipe。

4

3 回答 3

0

如果我理解正确,

assertThat("read1 should not be null", read1, is(notNullValue()));

应该只在 if 中执行b == true,但如果b == false?

那你为什么不干脆做:

if(b) {
    assertThat("read1 should not be null", read1, is(notNullValue()));
} else {
    log.warn("b == false, Test on read1 skipped");
}

? 或者如果发生这种情况,您是否希望有一个特殊的测试结果状态(“成功但可疑”)?

更新:我刚刚重新阅读了 Assume 上的文档。它指出,如果假设失败,则整个测试被认为“没有意义”并标记为“忽略”。通过小型、有针对性的测试,通常可以为您提供所需的所有信息。

更新 2:刚刚在 Eclipse 4.2 中使用 JUnit 4.8 进行了尝试,我手头在这里。这只是标志着测试成功。所以我猜 Eclipse 中的 JUnit runner 可能无法正确支持该功能。

于 2013-03-22T13:13:08.090 回答
0

同意之前的答案(由 NamshubWriter 提供)。
但是,如果您真的希望(有理由)清楚地表明由于某些假设失败而忽略了测试,您可以执行以下操作:

@Before
public void before() {
    final String mandatoryPropKey = "system.mandatory-property-for-this-test";
    final String mandatoryPropExpectedVal = "true";
    try { // try/catch because the Assume failure won't print any message (by design)
        Assume.assumeTrue("Assumed that the \"" + mandatoryPropKey + "\" system property is \"" + mandatoryPropExpectedVal + "\".", Boolean.valueOf(System.getProperty(mandatoryPropKey, mandatoryPropExpectedVal)));
    } catch (AssumptionViolatedException ave) {
        logger.warn("Not executing this test because this assumption failed: {}", ave.getMessage());
        throw ave;
    }
}
于 2018-02-13T11:13:48.620 回答
0

不会打印错误,因为假设失败不是错误。这些assume方法用于短路由于值或状态一个或多个对象(或原语)而不应运行的测试。假设是为 Theories 跑步者设计的,但它们也可以用于其他跑步者。

假设的一种常见用法是,当您有多个测试方法需要执行一组操作以使对象进入特定状态之前,才能执行实际的测试用例逻辑。

在假设之前,每个测试都会使对象进入所需的状态,断言它处于该状态,然后继续。例如,对于堆栈的测试,许多测试需要一个非空堆栈,因此您将创建一个堆栈,推送一个项目,断言堆栈不为空,然后执行其余的测试(弹出一个项目,推送另一个项目等)。

如果您在多个测试中执行此模式,然后引入了一个导致所有这些测试失败的错误(例如,isEmpty()始终返回 true),就会出现问题。当您运行测试时,您会遇到很多失败,以至于您不知道从哪里开始。

因此,您有一个测试来验证如果您将一个项目推入一个空堆栈,则isEmpy()返回 false。然后任何需要非空堆栈的测试都会这样做:

Stack<Object> stack = new Stack<>();
stack.push(new Object());
assumeFalse(stack.isEmpty());
// Continue with the test methods

如果您想要一条错误消息,您可能想要使用断言。

于 2016-12-02T09:20:38.027 回答