如何在JUnit 4测试套件中获取测试集合

时间:2014-01-07 15:55:11

标签: java junit test-suite

在JUnit 3中,我可以使用以下代码获取测试套件中的所有测试:

TestSuite allTestsSuite = (TestSuite) AllTests.suite()
Enumeration enumeration = allTestsSuite.tests();
ArrayList listOfTests = Collection.list(enumeration);

但是,我找不到在JUnit 4中执行此操作的等效方法。类不再具有.suite()方法;他们只使用@Suite注释。除了Suite class不再具有tests()方法之外,这不是问题。有一个children()方法,但它会返回一个Runners列表,它似乎与我正在寻找的东西不同。

那么如何在JUnit 4的测试套件中获得测试,就像我在JUnit 3中一样?

2 个答案:

答案 0 :(得分:1)

执行任何类型文件的最简单方法是创建自己的JUnit Categories

有关详细信息,请参阅此Junit Category tutorial,但基本上,您可以根据需要创建自己的类别

public interface GuiTest{ }

public interface DbTest {  }

现在,您可以使用该类别注释整个测试类或单个测试:

@Category(GuiTest.class)
public void myJPanelTest{


    @Test
    public void testFoo(){
        ...
    }

    //look we can have other categories too
    @Test
    @Category(DbTest.class)
    public void accidentalDbTest(){

    }
}

然后在您的测试套件中,您可以指定包含或排除与给定类别匹配的测试

@RunWith(Categories.class)
@IncludeCategory(GuiTest.class)
@ExcludeCategory(DbTest.class)  //not sure if we need both but can't hurt
@SuiteClasses( {
     ...
 })
public class GuiTestsOnlySuite{}

使用Categories比基于ad-hoc命名约定手动过滤测试更好,因为它很难记住(并确保组中的每个人都遵守命名约定)并且因为类别是类,您可以使用IDE来搜索/重构/编译时检查您的类别名称。

我见过的唯一缺点是至少在我的IDE中,测试需要更长时间才能运行,因为需要进行额外的反射工作以确保测试在运行之前符合类别过滤条件。

答案 1 :(得分:1)

经过一些实验,我发现了以下解决方案:

SuiteClasses suiteClassesAnnotation = AllTests.class.getAnnotation(SuiteClasses.class);
if (suiteClassesAnnotation == null)
    throw new NullPointerException("This class isn't annotated with @SuiteClasses");
Class<?>[] classesInSuite = suiteClassesAnnotation.value();

基本上,它以与JUnit本身相同的方式获取类:通过查看注释并确定其中包含哪些值。

如果您最终希望过滤这些类,那么dkatzel提供的类别解决方案也是一个不错的选择,但如果您需要套件中的类列表以用于其他目的(例如代码分析),这是最简单的最直接的方式。