【问题标题】:How to get a collection of tests in a JUnit 4 test suite如何在 JUnit 4 测试套件中获取测试集合
【发布时间】:2014-01-08 22:54:42
【问题描述】:

在 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 一样?

【问题讨论】:

  • 也许你可以[扫描带注释的类][1]。 [1]:stackoverflow.com/questions/4107498/…
  • 您为什么要进行测试?针对不同的用例有不同的解决方案。不同的运行程序也可以动态生成新的测试,因此在实际运行之前可能很难获得完整的 Junit 4 测试列表。
  • @Dkatzel 我正在处理一些遗留代码,用于分析 JUnit 套件的构成并检查正确的测试是否在正确的套件中(例如,确保有人没有进行 GUI 测试在数据库套件中)。也许这是不必要的迂腐,但不幸的是我现在对此没有任何发言权,所以我试图找到一个与现有代码等效的 JUnit 4。

标签: java junit test-suite


【解决方案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{}

使用类别比必须根据临时命名约定手动过滤测试要好得多,因为这很难记住(并确保您组中的每个人都遵守命名约定)并且因为类别是类,您可以使用 IDE 搜索/重构/编译时检查您的类别名称。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 2013-11-04
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      相关资源
      最近更新 更多