我们有多次测试,其中一些测试有时会因环境问题而失败。所以测试得到@Ignored。不幸的是,在环境问题消失后很长一段时间它仍会保留@Ignored。是否有一种很好的方法可以使@Ignore在一段时间内或直到特定日期有效?
我想我可以用日期检查包围罪魁祸首方法,如果它在那个日期之前就退出,但是想知道你们是否可以提出更优雅的解决方案。
由于
答案 0 :(得分:1)
请允许我发布我完成的工作。使用https://github.com/junit-team/junit4/wiki/rules和http://blog.jiffle.net/post/41125006846/extending-junit-functionality-with-additional中的信息,我已经使用自定义注释实现了自定义规则。
注释:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention (value = RetentionPolicy.RUNTIME)
@Target( value = { ElementType.METHOD} )
public @interface IgnoreUntilAfter
{
public String value() default "";
}
CustomRule:
import org.joda.time.LocalDateTime;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
public class IgnoreForTime
implements TestRule
{
private IgnoreUntilAfter ignoreUntilAfter;
public String getIgnoreLtdValue()
{
return ignoreUntilAfter.value();
}
@Override
public Statement apply(final Statement base, final Description description)
{
return new Statement()
{
@Override
public void evaluate() throws Throwable
{
ignoreUntilAfter = description.getAnnotation(IgnoreUntilAfter.class);
if (ignoreUntilAfter != null)
{
LocalDateTime currentTime = new LocalDateTime(System.currentTimeMillis());
if (!currentTime.isAfter(checkAndSetTimeLimit(getIgnoreLtdValue())))
{
return;
}
}
base.evaluate();
}
};
}
private LocalDateTime checkAndSetTimeLimit(String timeLimit)
{
if (timeLimit.isEmpty())
{
throw new RuntimeException("Please specify the date you want this Ignore to be active until. Ex: 2016-08-24T14:40:19.208 or 2016-08-24");
}
return LocalDateTime.parse(timeLimit);
}
}
TESTFILE:
import org.junit.Rule;
import org.junit.Test;
public class TestIgnoreForTime
{
@Rule
public IgnoreForTime timer = new IgnoreForTime();
@Test
@IgnoreUntilAfter("2016-08-24T14:40:19.208")
public void doSomething()
{
System.out.println("doSomething");
}
@Test
public void doSomething2()
{
System.out.println("doSomething2");
}
@Test
@IgnoreUntilAfter
public void doSomething3()
{
System.out.println("doSomething3");
}
}
希望这也有助于其他人。
答案 1 :(得分:0)
我想没有“好”的一般答案;我认为通过技术和非技术解决方案的组合可以实现最大化;煮沸到一套规则,如:
最后,这一切归结为我的第一个建议:避免“偶尔”失败的测试。
测试的目的是在代码库中公开回归;它们的存在是为了向您提供价值。应尽快改进或删除不增值的内容。保持它们的原样,这就像是喜欢用鞋子里的石头走路,因为你太忙了,不能停下来从鞋子里拿出来。