[英]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.