6

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

4

2 回答 2

7

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

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

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

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

于 2014-01-07T20:45:16.173 回答
0

Personally, I use maven/ant/Eclipse to run sets of tests.

If you're using maven, look at surefire. To run all junit tests for a module, add the following to the pom:

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

For Ant, look at the 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>

For Eclipse, right click on the package and select 'Run as JUnit'. This will run all of the tests it can find in those packages. There will be similar functionality in Intellij.

于 2012-01-30T22:16:44.070 回答