限时Junit @Ignore

时间:2016-08-22 23:01:34

标签: junit

我们有多次测试,其中一些测试有时会因环境问题而失败。所以测试得到@Ignored。不幸的是,在环境问题消失后很长一段时间它仍会保留@Ignored。是否有一种很好的方法可以使@Ignore在一段时间内或直到特定日期有效?

我想我可以用日期检查包围罪魁祸首方法,如果它在那个日期之前就退出,但是想知道你们是否可以提出更优雅的解决方案。

由于

2 个答案:

答案 0 :(得分:1)

请允许我发布我完成的工作。使用https://github.com/junit-team/junit4/wiki/ruleshttp://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)

我想没有“好”的一般答案;我认为通过技术和非技术解决方案的组合可以实现最大化;煮沸到一套规则,如:

  1. 绝对最小化@Ignored测试的数量。一个片状测试是你的桶中最糟糕的事情!因此:而不是走简单的路径并将@Ignored放在一些测试上;您应该:A)删除该测试,因为它不会为您的测试桶增加实质价值B)花费时间使测试(和/或您的生产)代码稳定
  2. 使用其他工具跟踪@Ignored测试。例如:在跟踪系统中为每个和任何@Ignored测试创建一个缺陷。然后定义时间表,你会接受这些缺陷多长时间;以及处理它们的政策。
  3. 最后,这一切归结为我的第一个建议:避免“偶尔”失败的测试。

    测试的目的是在代码库中公开回归;它们的存在是为了向您提供价值。应尽快改进或删除不增值的内容。保持它们的原样,这就像是喜欢用鞋子里的石头走路,因为你太忙了,不能停下来从鞋子里拿出来。