2014-01-07 32 views
1

在JUnit 3中,我可以测试套件下面的代码中获得所有的测试:如何获得测试集合在一个JUnit 4测试套件

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?

+0

也许你可以[扫描注释类新] [1]。 [1]:http://stackoverflow.com/questions/4107498/how-to-build-a-list-of-classes-annotated-with-my-custom-annotation – aalku

+0

为什么你想测试?针对不同的用例有不同的解决方案。不同的跑步者也可以动态地生成新的测试,因此可能很难获得完整的Junit 4测试列表,直到您真正运行它们。 – dkatzel

+0

@Dkatzel我正在研究一些遗留代码,用于分析JUnit套件的构成并检查正确的测试是否在正确的套件中(例如,确保有人没有在数据库套件中加入GUI测试)。也许是不必要的迂腐,但unfortuantely我没有在任何权现在说,所以我试图找到相当于现有代码的JUnit 4。 – Thunderforge

回答

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提供的类别解决方案也是一个不错的选择,但是如果您需要套件中的类的列表以用于代码分析等其他目的,那么这是最简单的和最直接的方式来做到这一点。

0

执行任何种类的filering的最简单的方法是创建你自己的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{} 

使用分类比不得不拿出基于点对点的命名约定手工筛选测试,因为这是很难记得做(并确保每个人都在你的团队坚持的命名规则)要好得多,因为类别是类别,您可以使用您的IDE搜索/重构/编译时间检查您的类别名称。

我见过至少在我的IDE,测试需要较长的时间来运行,因为有多余的反射的工作要做,以确保测试运行之前符合您的类别过滤标准的唯一缺点。