繁体   English   中英

JUnit ParentRunner是否应该捕获AssertionError?

[英]Should JUnit ParentRunner catch AssertionError?

我已经实现了一个基于BlockJUnit4ClassRunner的自定义TestRunner。

我的假设是,任何失败的断言(表示产品/需求问题)将通过addFailedAssumption()报告给通知者,而其他异常将通过addFailure()报告,表明单元测试本身存在错误。

查看结果,从未调用过addFailedAssumption() ParentRunner .runLeaf()的源代码中,我看到了

try {
    statement.evaluate();
} catch (AssumptionViolatedException e) {
    eachNotifier.addFailedAssumption(e);
} catch (Throwable e) {
    eachNotifier.addFailure(e);
} finally {
    eachNotifier.fireTestFinished();
}

我得到的异常都是java.lang.AssertionError类型。

ParentRunner应该捕获AssertionError还是我这边有误会?

阅读有关此主题的更多信息,这似乎是我方面的语言/翻译问题,因为我不是母语人士。

找到Assume类可以帮助我正确理解(希望如此),我将通过一个示例进行说明:

AssumtionViolatedException的用法

测试可以例如在不同的环境中运行,比如说不同的操作系统。 该产品在不同操作系统上的行为或需求可能会略有不同,例如,因为它可以在较新版本的OS中使用API​​调用,而较新版本的OS中不存在该API。 这可能会导致代码如下

if(isApiPresent())
    SimpleAPICall();
else
    // Do some crazy stuff here, potentially slower than the API call

根据操作系统的不同, isApiPresent()调用将返回不同的结果,因此您编写了2个单元测试并添加了有关环境的假设:

@Test
public void isApiPresent_returns_true_on_Win8()
{
    assumeTrue(System.getProperty("os.version").equals("6.2"));
    assertTrue(isApiPresent());
}
@Test
public void isApiPresent_returns_false_on_Win7()
{
    assumeTrue(System.getProperty("os.version").equals("6.1"));
    assertFalse(isApiPresent());
}

如果未给出有关操作系统的假设,则由于@Test批注,该测试仍将执行,但实际上应将其忽略。 assume...()语句可以解决这一问题:它们引发了一个AssumptionViolatedException ,可用于忽略测试。

Eclipse用一个忽略的图标标记了一个违反假设的测试(尝试assumeFalse(true); ):

在Eclipse中忽略测试

AssertionError的用法

我想要通过TestRunner的自定义实现实现的目标有些不同。 我想找出哪些单元测试由于需求问题而失败,以及哪些测试由于其他异常而失败,这些异常可能表明该单元测试本身存在错误,并在Eclipse中重构了这些图标。 Eclipse已经区分了这两种类型的问题: AssertionError s用蓝色图标标记,而Exception用红色图标标记。

Eclipse中的红色和蓝色单元测试

对我来说,这意味着我必须在fireTestFailure()实施该决定:

public void fireTestFailure(Failure failure) {
    originalNotifier.fireTestFailure(failure);

    if (failure.getException().getClass() == AssertionError.class) {
        // Requirement issue
    } else {
        // Unit test issue
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM