[英]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类可以帮助我正确理解(希望如此),我将通过一个示例进行说明:
测试可以例如在不同的环境中运行,比如说不同的操作系统。 该产品在不同操作系统上的行为或需求可能会略有不同,例如,因为它可以在较新版本的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);
):
我想要通过TestRunner的自定义实现实现的目标有些不同。 我想找出哪些单元测试由于需求问题而失败,以及哪些测试由于其他异常而失败,这些异常可能表明该单元测试本身存在错误,并在Eclipse中重构了这些图标。 Eclipse已经区分了这两种类型的问题: AssertionError
s用蓝色图标标记,而Exception
用红色图标标记。
对我来说,这意味着我必须在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.