JUnit测试套件是否支持自定义注释?

时间:2013-09-12 19:52:07

标签: java reflection junit annotations test-suite

在JUnit中,您可以像这样创建测试套件:

public class SecurityTest1 {
    @Test
    public void testSecurity1() {
        // ...
    }
}

public class LoadTest1 {
    @Test
    public void testLoad1() {
        // ...
    }
}

public class SecurityTest2 {
    @Test
    public void testSecurity2() {
        // ...
    }
}

@RunWith(Suite.class)
@SuiteClasses({SecurityTest1.class, SecurityTest2.class})
public class SecurityTestSuite {}

但这看起来相当麻烦。定义一个简单的类级注释会非常好:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface SecurityTest {} 

然后像这样定义你的套件:

@SecurityTest
public class SecurityTest1 {
    @Test
    public void testSecurity1() {
        // ...
    }
}

public class LoadTest1 {
    @Test
    public void testLoad1() {
        // ...
    }
}

@SecurityTest
public class SecurityTest2 {
    @Test
    public void testSecurity2() {
        // ...
    }
}

@RunWith(Suite.class)
@SuiteClasses({SecurityTest.class})
public class SecurityTestSuite {}

这可能吗?如果是这样的话? 注意:如果JUnit不支持,请不要切换到TestNG或任何其他测试框架...提前感谢!

1 个答案:

答案 0 :(得分:1)

您可以通过实施与Test Runner跑步者类似的Suite来实现此目的。

此跑步者应该从@SuiteClasses注释的值中提取标记注释类(您应该用自己的注释替换@SuiteClasses)。请查看getAnnotatedClasses类的org.junit.runners.Suite方法 在具有标记注释类之后,您应该扫描类路径以查找使用此注释标记的测试类(使用诸如Reflections之类的库)并将它们的数组传递给相应的Runner构造函数。
您可以在Suite构造函数中找到类似的行为:

public Suite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
   this(builder, klass, getAnnotatedClasses(klass));
}