これは5年以上前に尋ねられたことに気づきましたが、かなりの数の人々が質問に賛成票を投じたので、私はまだ解決策を考えていると思いました. 解決策だけが必要な場合は、最後までスキップしてください。理解したい場合は、テキスト全体を読んでください;-)
まず第一に、特定の JUnit テスト クラスがテスト スイート内でのみ実行されるようにすることは実際に可能です。また、そのテスト スイートを Eclipse 内で実行するか (ここで質問されているように)、または他のツールや環境で実行するかは関係ありません。これは、ほとんどの場合、純粋な JUnit の問題です。
解決策を大まかに描く前に、正確な問題が何であるかを再検討することをお勧めします。すべての JUnit テストは、JUnit フレームワークとそのさまざまなランナーによって取得されるように、表示およびインスタンス化可能である必要があります。これは、テスト スイートおよびテスト スイートの一部である個々のテストにも適用されます。結果として、JUnit がテスト スイートを選択すると、個々のテストも選択され、スイート内のすべてのテストは、個別に 1 回、スイートの一部として 1 回、合計 2 回実行されます。
したがって、トリックは、必要に応じて、JUnit が個々のテストを取得しないようにする一方で、スイートの一部としてそれらをインスタンス化して実行できるようにすることです。
頭に浮かぶことの 1 つは、テスト クラスをテスト スイート内にネストされた静的内部クラスにすることです。ただし、ネストされたクラスは引き続きパブリックである必要があり (そうしないと、スイートで実行することもできません)、それらがパブリック クラスである場合は、スイートのパブリック クラス内にネストされているにもかかわらず、個別に取得されます。ただし、JUnit は可視と見なされないテスト クラスを実行しようとしません。したがって、テスト クラスを非パブリック クラス内にネストすることはおそらくそれらを非表示にするのに十分ですが、JUnit が実行しないため、スイート クラスを非パブリックにすることはできません。ただし、できることは、個々のテストを、テスト スイート内にネストされた別の非パブリック クラス内にネストすることです。これにより、この難問の解決策が得られます。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({AllTests.InSuiteOnly.Test1.class, AllTests.InSuiteOnly.Test2.class})
public class AllTests
{
static class InSuiteOnly
{
public static class Test1
{
@Test
public void test1()
{
//...
}
}
public static class Test2
{
@Test
public void test2()
{
//...
}
}
}
}
多くの人は、すべてのテストを 1 つのソース ファイル内に含める必要があることに反対するでしょう。それ自体では実行されないが、テスト スイート内で実行される別の JUnit テスト クラスを維持したい場合はどうすればよいですか? 簡単な解決策は、個々のテスト クラスを抽象化し (公開/非公開は関係ありません)、JUnit がそれらを実行しないようにすることです。テスト スイート内では、元の抽象テスト クラスの具体的なサブクラスを使用するだけです。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({AllTests.InSuiteOnly.SuiteTest1.class, AllTests.InSuiteOnly.SuiteTest2.class})
public class AllTests
{
static class InSuiteOnly
{
public static class SuiteTest1 extends Test1 {}
public static class SuiteTest2 extends Test2 {}
}
}
abstract class Test1
{
@Test
public void test1()
{
//...
}
}
abstract class Test2
{
@Test
public void test2()
{
//...
}
}
このスキームは、Maven、Eclipse、および JUnit のランナーを直接活用するか、JUnit の元の動作とセマンティクスに厳密に従う独自のランナーを実装する他のすべての環境で機能します。