【发布时间】:2018-10-04 20:18:30
【问题描述】:
我正在尝试构建一个自定义注释以与 JUnit 测试类一起使用。目标是定期运行测试。
要运行的示例类:TempTest.java:
@Periodic(period = 2)
public class TempTest {
@Test
@ExtendWith(PeriodicEnabling.class)
public void testTrue() {
assertTrue(true);
}
@Test
@ExtendWith(PeriodicEnabling.class)
public void testZero() {
int val = 0; assertEquals(0, val);
}
@Test
@ExtendWith(PeriodicEnabling.class)
public void testZero2() {
assertEquals(0, "".length());
}
@Test
@ExtendWith(PeriodicEnabling.class)
public void testFalse() {
assertTrue(!false);
}
}
所以对于period = 2,我们只想运行每隔一个(或每个第二个)测试。自定义注解如下所示:
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(PeriodicEnabling.class)
@Target(ElementType.TYPE)
public @interface Periodic {
int period() default 1;
}
最后是 PeriodicEnabling 辅助类:
public class PeriodicEnabling implements ExecutionCondition {
private int period, currCount;
private static final ConditionEvaluationResult ENABLED = ConditionEvaluationResult.enabled("Count looks good!");
private static final ConditionEvaluationResult DISABLED = ConditionEvaluationResult.disabled("Disabled due to periodic disabling!");
public PeriodicEnabling() {
System.out.println("Constructor!!");
Class<TempTest> cls = TempTest.class;
if(cls.isAnnotationPresent(Periodic.class)) {
Annotation annotation = cls.getAnnotation(Periodic.class);
this.period = ((Periodic) annotation).period();
} else {
this.period = 1;
}
currCount = 0;
}
@Override
public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext extensionContext) {
System.out.println("before::currCount = " + currCount);
currCount++;
int result = this.currCount % this.period;
if (result == 0) {
System.out.println("after::enabled::currCount = " + currCount);
return ENABLED;
}
System.out.println("after::disabled::currCount = " + currCount + ", result=" + result);
return DISABLED;
}
}
问题:
问题是在第一个测试函数的evaluateExecutionCondition 返回EvaluationCondition.Disabled 之后,其余函数不再为它们执行evaluateExecutionCondition 函数。其余的测试用例根本不运行。
这是我在运行示例测试文件时看到的输出:
Constructor!!
before::currCount = 0
after::disabled::currCount = 1, result=1
Disabled due to periodic disabling!
Disabled due to periodic disabling!
Disabled due to periodic disabling!
Disabled due to periodic disabling!
我看到了一些解决方案,其中解决方案是使用 assumeThat 函数,其中包含一些动态条件。但是我需要一些不同的东西,我需要一个自定义注解类来处理注解类中每个测试函数的执行。
任何帮助表示赞赏:)!
【问题讨论】:
-
我建议查看 JUint RunListener 以处理是否应执行测试方法/类和 BlockJUnit4ClassRunner 以便您可以将侦听器应用于被测类。可能还有其他方法,但我认为这是一个好的开始。