我已经基于BlockJUnit4ClassRunner
实现了自定义TestRunner。
我的假设是,任何失败的断言(表示产品/要求问题)都会通过addFailedAssumption()
报告给通知人,而其他例外将通过addFailure()
报告,表明单位测试本身存在错误。< / p>
查看结果,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
抓住SELECT Bio FROM Users
WHERE CONTAINS (Bio,'promoter')
SELECT Bio FROM Users
WHERE CONTAINS (Bio,'#promoter')
还是我有误会?
答案 0 :(得分:0)
阅读有关此主题的更多信息,这似乎是我身上的语言/翻译问题,因为我不是母语人士。
找到班级Assume帮助我做到了(我希望)并且我将用一个例子解释它:
测试可以是在不同的环境中运行,让我们说不同的操作系统。也许产品在不同的操作系统上表现或需要略微不同,例如因为它可以在较新版本的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
标有蓝色图标,而Exception
标有红色图标。
对我来说,这意味着我必须在fireTestFailure()
:
public void fireTestFailure(Failure failure) {
originalNotifier.fireTestFailure(failure);
if (failure.getException().getClass() == AssertionError.class) {
// Requirement issue
} else {
// Unit test issue
}
}