如何在JUnit 4.x中创建嵌套的TestSuite?

时间:2012-01-30 20:41:43

标签: java junit junit4 test-suite

我正在尝试将JUnit添加到一个大型项目中,并且在嵌套测试套件时遇到了困难。例如:

@RunWith(Suite.class)
@Suite.SuiteClasses({Test2.class, .....})
public class Test1{
}

@RunWith(Suite.class)
@Suite.SuiteClasses({Test3.class, .....})
public class Test2{
  //might have tests
}

@RunWith(Suite.class)
public class Test3{
  //tests here
}

每个类在其自己的包中运行测试,以及所有子包TestSuites

运行Test1导致 java.lang.Exception:没有可运行的方法。我如何让它工作?有没有更好的方法来组织测试,而没有一个没有巨大的列表?

2 个答案:

答案 0 :(得分:6)

第一个问题是Test3使用@RunWith(Suite.class),但不包含@Suite.SuiteClasses({Test3.class, .....})。这会产生IntializationError: class 'Test3' must have a SuiteClasses annotation。由于您不打算在Test3下面有任何类,因此应删除此注释。

Exception: No runnable methods的第二个问题几乎总是由于忘记将@Test添加到测试中。你没有把测试放在你的样本中,所以我不知道是否真的如此,但这是最可能的原因。

以下是您的代码的工作版本,允许从任何类运行测试:

Test1.java

import org.junit.runner.*;
import org.junit.runners.*;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({Test2.class})
public class Test1 {

}

Test2.java

import org.junit.runner.*;
import org.junit.runners.*;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({Test3.class})
public class Test2 {

}

Test3.java

import static org.junit.Assert.*;

import org.junit.*;

public class Test3 {

    @Test
    public void testTrue(){
        assertTrue(true);
    }
}

至于是否有比组织事物更好的方法,我想这只取决于你决定如何创建类。由于您可以向套件添加套件,如此演示,您可以创建较小的套件,这些套件依赖于所有内容,例如树。例如,我通常做的是:

AllTestSuite
    TextParsingSuite
    GuiSuite
        SwingSuite
        JavaFXSuite
    FileIOSuite

测试被添加到最相关的套件中。最后,我认为我没有任何超过10个测试类/套件的套件。如果我这样做,是时候制作一个新的子套件了。换句话说,没有“某个地方的巨大列表”,只有很多较小的列表被组合到另一个列表中,以便有效地制作一个大列表。

我想你可以使用一些工具来动态查找包含测试的所有Java类,但是JUnit本身不支持这种行为(它只运行你告诉它的测试,我个人认为这是一件好事)

答案 1 :(得分:0)

就个人而言,我使用maven / ant / Eclipse来运行多组测试。

如果您正在使用maven,请查看surefire。要运行模块的所有junit测试,请将以下内容添加到pom:

<build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.11</version>
        </plugin>
      </plugins>
    </pluginManagement>
</build>

对于Ant,请查看JUnit task

<junit printsummary="yes" haltonfailure="yes">
  <classpath>
    <pathelement location="${build.tests}"/>
    <pathelement path="${java.class.path}"/>
  </classpath>

  <formatter type="plain"/>

  <test name="my.test.TestCase" haltonfailure="no" outfile="result">
    <formatter type="xml"/>
  </test>

  <batchtest fork="yes" todir="${reports.tests}">
    <fileset dir="${src.tests}">
      <include name="**/*Test*.java"/>
      <exclude name="**/AllTests.java"/>
    </fileset>
  </batchtest>
</junit>

对于Eclipse,右键单击该包并选择“Run as JUnit”。这将运行它可以在这些包中找到的所有测试。 Intellij中将有类似的功能。