【问题标题】:How do you create nested TestSuites in JUnit 4.x?如何在 JUnit 4.x 中创建嵌套的 TestSuite?
【发布时间】:2012-02-22 15:17:51
【问题描述】:

我正在尝试将 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: No runnable methods。我怎样才能让它工作?有没有更好的方法来组织测试而无需在某个地方没有大量列表?

【问题讨论】:

  • 删除所有 Test3 上的 @RunWith(Suite.class) 并添加一个丢失的注释,其中一个 Test2 解决了所有问题。然而,这似乎不是最好的方法。有没有更好的方法在特定目录下运行所有​​测试?

标签: java junit junit4 test-suite


【解决方案1】:

第一个问题是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 本身不支持这种行为(它只运行你告诉它的测试,我个人认为这是一件好事) .

【讨论】:

    【解决方案2】:

    就我个人而言,我使用 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 中也会有类似的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-22
      • 2012-03-05
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2020-10-23
      • 2018-05-08
      • 1970-01-01
      相关资源
      最近更新 更多