54

JUnit 4 を使用して、含まれるテスト クラスの名前がテスト スイートが実行されるまで不明な junit テスト スイートを作成したいと考えています。

JUnit 3では、これを行うことができました:

public final class MasterTester extends TestCase
{
  /**
   * Used by junit to specify what TestCases to run.
   * 
   * @return a suite containing what TestCases to run
   */
  public static TestSuite suite() {
    TestSuite suite = new TestSuite();

    for(Class<?> klass : gatherTestClasses()) {
      suite.addTestSuite(klass);
    }

    return suite;
  }
}

そして、gatherTestClasses()どのテスト クラスを実行するかをメソッドに判断させます。

JUnit 4 では、ドキュメントには注釈を使用するように記載されています:@SuiteClasses({TestClass1.class, TestClass2.class...})テスト スイートを構築します。これを行う方法を示すSOの回答は多数あります。残念ながら、私が見た例では、動的に生成された TestClasses のリストを渡すことができないようです。

This SO answerBlockJUnit4ClassRunnerは、私がやりたくないサブクラス化を行う必要があることを示唆しています。

動的に指定されたテスト スイートは、JUnit 4 のどこかにある必要があるように思えます。誰もどこか知っていますか?

4

6 に答える 6

38

@RunWith動的テスト スイートを作成するには、アノテーションを使用する必要があります。2 つの一般的な使用方法があります。

@RunWith(Suite.class)

これにより、対象のテスト スイートを構成するクラスを指定できます。これは JUnit 3 スタイルと同等です。

import junit.framework.TestSuite;
import junit.framework.TestCase;

public final class MasterTester extends TestCase {

  public static TestSuite suite() {
    TestSuite suite = new TestSuite();
    suite.addTestSuite(TestClass1.class);        
    suite.addTestSuite(TestClass2.class);
    // etc...
    return suite;
  }
}

同等の JUnit 4 クラスは次のようになります。

import org.junit.runners.Suite;

@RunWith(Suite.class)
@SuiteClasses({TestClass1.class, TestClass2.class})
public final class MasterTester {

}

@RunWith(AllTests.class)

これにより、テスト スイートを構成するテストを動的に指定できます。テストが実行時までわからない場合は、注釈で指定できません。代わりにこの構造を使用できます。したがって、JUnit 3 コードが次の場合:

import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.framework.Test;

public final class MasterTester extends TestCase {

  public static TestSuite suite() {
    TestSuite suite = new TestSuite();
    for (Test test : findAllTestCasesRuntime()) {
      suite.addTest(test);
    }
    return suite;
  }
}

同等の JUnit 4 コードは次のようになります。

import org.junit.runners.AllTests;
import junit.framework.TestSuite;
import junit.framework.Test;

@RunWith(AllTests.class)
public final class MasterTester {

  public static TestSuite suite() {
    TestSuite suite = new TestSuite();
    for (Test test : findAllTestCasesRuntime()) {
      suite.addTest(test);
    }
    return suite;
  }
}
于 2011-09-13T15:47:16.687 に答える
35

JUnit 4.8を使用してこれを試しましたが、機能します。

@RunWith(AllTests.class)
public class SomeTests
{
    public static TestSuite suite()
    {
        TestSuite suite = new TestSuite();

        suite.addTest(new JUnit4TestAdapter(Test1.class));
        suite.addTest(new JUnit4TestAdapter(Test2.class));

        return suite;
     }
}
于 2012-08-13T10:08:13.870 に答える
26

クラスパス スイートは、テスト クラスの命名規則と共に使用すると非常に便利であることがわかりました。

https://github.com/takari/takari-csuite

次に例を示します。

import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.runner.RunWith;

@RunWith(ClasspathSuite.class)
@ClassnameFilters({".*UnitTest"})
public class MySuite {
}
于 2010-07-20T12:18:57.687 に答える
6

gatherTestClasses() が何をするのかはわかりませんが、OS が Linux の場合はいくつかのテストを返し、OS が Windows の場合は別のテストを返すとしましょう。JUnit 4.4 では、仮定を使用してそれを複製できます。

@Test
public void onlyOnLinux() {
    assumeThat(getOS(), is(OperatingSystem.LINUX));
    // rest of test
}

@Test
public void onlyOnWindows() {
    assumeThat(getOS(), is(OperatingSystem.WINDOWS));
    // rest of test
}

@Test
public void anyOperatingSystem() {
    // just don't call assumeThat(..)
}

カスタムコードの実装getOS()となる。OperatingSystem

于 2010-07-15T16:35:15.153 に答える