Java 如何在JUnit4测试套件中获取测试集合

Java 如何在JUnit4测试套件中获取测试集合,java,junit,test-suite,Java,Junit,Test Suite,在JUnit 3中,我可以使用以下代码获得测试套件中的所有测试: TestSuite allTestsSuite = (TestSuite) AllTests.suite() Enumeration enumeration = allTestsSuite.tests(); ArrayList listOfTests = Collection.list(enumeration); 然而,我在JUnit4中找不到类似的方法。类不再具有.suite()方法;他们只需使用@Suite注释。这不会是一个

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

TestSuite allTestsSuite = (TestSuite) AllTests.suite()
Enumeration enumeration = allTestsSuite.tests();
ArrayList listOfTests = Collection.list(enumeration);
然而,我在JUnit4中找不到类似的方法。类不再具有
.suite()
方法;他们只需使用
@Suite
注释。这不会是一个问题,除非不再有
tests()
方法。有一个
children()
方法,但它返回一个跑步者列表,这似乎与我要查找的原因有所不同


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

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

更多细节请参见本文,但基本上,您可以创建自己的类别,命名为您想要的名称

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{}
使用类别比必须根据特定的命名约定手动筛选测试要好得多,因为这样做很难记住(并确保组中的每个人都遵守命名约定),而且类别是类,您可以使用IDE搜索/重构/编译时检查类别名称


我所看到的唯一缺点是,至少在我的IDE中,测试运行的时间稍长,因为在运行之前需要做额外的反射工作,以确保测试符合您的类别筛选条件。

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

SuiteClasses suiteClassesAnnotation = AllTests.class.getAnnotation(SuiteClasses.class);
if (suiteClassesAnnotation == null)
    throw new NullPointerException("This class isn't annotated with @SuiteClasses");
Class<?>[] classesInSuite = suiteClassesAnnotation.value();
SuiteClasses suiteClassesAnnotation=AllTests.class.getAnnotation(SuiteClasses.class);
如果(SuiteClassAnotation==null)
抛出新的NullPointerException(“这个类没有用@SuiteClasses注释”);
类[]classesInSuite=SuiteClassenSanNotation.value();
基本上,它获取类的方式与JUnit本身获取类的方式相同:查看注释并确定其中包含哪些值


如果您最终想要筛选这些类,dkatzel提供的类别解决方案也是一个不错的选择,但如果您需要套件中的类列表用于其他目的,如代码分析,这是最简单、最直接的方法。

也许您可以[扫描带注释的类][1]。[1] :你为什么想要这些测试?对于不同的用例有不同的解决方案。不同的运行程序还可以动态生成新的测试,因此在实际运行Junit 4测试之前,可能很难获得完整的Junit 4测试列表。@Dkatzel我正在编写一些旧代码,这些代码分析Junit套件的组成,并检查正确的测试是否在正确的套件中(例如,确保没有人在数据库套件中进行GUI测试)。也许这是不必要的迂腐,但不幸的是,我现在对此没有发言权,所以我正在尝试找到一个与现有代码相当的JUnit4。