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:実行可能なメソッドがなくなります。これを機能させるにはどうすればよいですか?どこかに巨大なリストがなくてもテストを整理するためのより良い方法はありますか?

4

2 に答える 2

7

最初の問題は、Test3がを使用しているが@RunWith(Suite.class)、が含まれていないこと@Suite.SuiteClasses({Test3.class, .....})です。これにより、が生成されIntializationError: class 'Test3' must have a SuiteClasses annotationます。Test3の下にクラスがあることを意図していないので、このアノテーションを削除する必要があります。

の2番目の問題は、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を超えるテストクラス/スイートを備えたスイートはないと思います。もしそうなら、それは新しいサブスイートを作る時です。言い換えれば、「どこかに巨大なリスト」はなく、1つの大きなリストを効果的に作成するために、いくつかの小さなリストを組み合わせて別のリストにするだけです。

いくつかのツールを使用して、テストを含むすべてのJavaクラスを動的に見つけることができると思いますが、JUnit自体はこの動作をサポートしていません(個人的には、指示されたテストのみを実行します。これは良いことだと思います)。

于 2014-01-07T20:45:16.173 に答える
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タスクを見てください。

<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の場合は、パッケージを右クリックして「RunasJUnit」を選択します。これにより、それらのパッケージで検出できるすべてのテストが実行されます。Intellijにも同様の機能があります。

于 2012-01-30T22:16:44.070 に答える