繁体   English   中英

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

[英]How to get a collection of tests in a JUnit 4 test suite

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

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

但是,我在JUnit 4中找不到执行此操作的等效方法。类不再具有.suite()方法。 他们只是使用@Suite批注。 除了Suite类不再具有tests()方法之外,这将不是问题。 有一个children()方法,但是返回了Runners列表,这似乎与我要查找的原因有所不同。

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

执行任何形式的文件筛选的最简单方法是创建自己的JUnit Categories

有关更多详细信息,请参见此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();

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

如果最终想要过滤这些类,则dkatzel提供的类别解决方案也是一个不错的选择,但是如果您出于其他目的(例如代码分析)而需要套件中的类列表,这是最简单,最直接的方法去做吧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM