我一直认为使用@Ignore停用测试是一个坏主意。 例外,这可能是一种将间歇性失败的测试放入隔离区以供以后处理的方法(如Martin Fowler 在此处所述 )。 随着越来越多的测试不断被忽略和遗忘,这带来了测试套件衰减的危险。 因此,您应该有一个政策来确保测试隔离的时间不会太长。 好吧,所以直到最近我才想到:
在我和Frank共同从事的项目中,我们遇到了此处描述的SWT问题。
在非Windows平台上,断言SWT小部件是否获得了输入焦点不适用于自动测试。
我们决定暂时在非Windows平台上忽略与焦点相关的测试。 尽管我们的构建服务器运行在Linux上,但是我们发现这两个开发环境都运行在Windows上,因此它足够安全。
在JUnit中, 假设是跳过在给定条件下没有意义的测试的方法。 这样表示,我们的测试将如下所示:
public void testFocus() {assumeTrue( isRunningOnWindows() );// ...
}
但是我们根本不希望测试代码与条件混为一谈。 决定是否忽略测试的代码应与测试代码本身分开。
这导致我们创建了ConditionalIgnore批注和相应的规则,以将其挂钩到JUnit运行时中。 事情很简单,最好用一个例子来解释:
public class SomeTest {@Rulepublic ConditionalIgnoreRule rule = new ConditionalIgnoreRule();@Test@ConditionalIgnore( condition = NotRunningOnWindows.class )public void testFocus() {// ...}
}public class NotRunningOnWindows implements IgnoreCondition {public boolean isSatisfied() {return !System.getProperty( "os.name" ).startsWith( "Windows" );}
}
ConditionalIgnore批注需要一个“ condition”属性,该属性指向实现IgnoreContition的类。 在运行时,将创建IgnoreCondition实现的实例,并通过其isSatisfied()方法确定是否忽略测试(返回true)(返回false)。 最后,有一个IgnoreConditionRule,它将注释链接到JUnit运行时中。
如果IgnoreCondition实现决定忽略测试用例,则抛出AssumptionViolatedException。 因此,ConditionalIgnore注释的效果与假定条件将返回false的效果相同。 略有不同,我们认为是一个优势:对于被忽略的测试,不会执行@Before和@After方法。
该规则及其相关类的源代码可以在这里找到。
假设的另一个问题是,它会影响测试统计信息。 如果发现“假定”条件为假,则即使未运行测试,也将其视为通过测试。 为了克服这个问题,您必须提供自己的运行程序,以所需的方式处理AssumptionViolatedException。
即使我只是写了一篇关于忽略测试长度的文章,但我仍然坚信最好不要忽略测试,只有在特殊情况下才应该忽略。
翻译自: https://www.javacodegeeks.com/2013/11/a-junit-rule-to-conditionally-ignore-tests.html