16

スイートごとの初期化 (Web サーバーの起動) を行う必要があります。プロジェクトですべてのテストをEclipseで実行すると、テストが2回実行されることを除いて、正常に動作しています。私のテスト スイートは次のようになります。

@RunWith(Suite.class)
@Suite.SuiteClasses({
   SubtestOne.class,
   SubtestTwo.class
})
public class TestSuite
{
   [...]
}

public class SubtestOne
{
   @Test public void testOne() { [...] }
}

public class SubtestTwo
{
   @Test public void testTwo() { [...] }
}

Eclipse でプロジェクトのすべてのテストを実行すると、junit プラグインは次のようにテストを 2 回実行します。

  • サブテストワン
  • サブテスト2
  • テストスイート
    • サブテストワン
    • サブテスト2

「プロジェクト内のすべてのテストを実行」でサブテストを 2 回実行しないようにすることはできますか? サブテストをスイートの一部としてのみ実行したい。

4

5 に答える 5

4

いいえ、テストクラスは常に直接開始され、スイートの「リンク」を介して開始されます。これは予想通りです。

回避策の1つは、スイートを含むパッケージからのみテストを実行するように実行構成を設定することです。実行構成を開き、パッケージを選択してRun all tests in the selected project, package or source folderからクリックして選択します。Search...

于 2012-06-07T12:29:04.410 に答える
2

これは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 の元の動作とセマンティクスに厳密に従う独自のランナーを実装する他のすべての環境で機能します。

于 2017-07-26T07:51:36.217 に答える
1

私はあなたのためのアイデアを持っています。実際には、これらのテスト ケースをスタンドアロンのテスト ケースとして実行する必要はありません。次のことができます。

テスト ケースに注釈を付ける@RunWith(DoNothingRunner.class)

次のように DoNothingRunner を実装します。

public class DoNothingRunner extends Runner {
    public Description getDescription() {
              return "do nothing";
        }
    public void run(RunNotifier notifier) {
            // indeed do nothing
        }
}

私はこれを個人的に試していませんが、うまくいくことを願っています。

于 2012-06-07T12:35:58.260 に答える