8

IDE(Intellij IDEA、またはEclipse)4000JUnitテストから手動で実行したいとします。最初の1000回のテストは非常にスムーズに実行されます(たとえば、1000回すべてで3分かかります)が、テスト1001は30分以上かかります。テスト1001(まだ実行中)をスキップして、テスト1002(およびその他)を続行させる方法はありますか?テスト1〜1000の答えはすでにあるので、テスト1001を@無視してスイートを再実行したくありません。また、時間がかかりすぎるため、テスト1001〜4000を選択したくありません。

テストの実行中に押すことができる、ある種のボタン(現在のテストをスキップ)を使用します。

そのような機能が存在しない場合、IDE開発者またはJUnit開発者がその機能を強化する必要がありますか?

4

5 に答える 5

15

これは、実際には、を使用するJUnit4では非常に簡単Assumeです。AssumeのようなヘルパークラスですAssert。違いは、テストをスキップAssertする一方で、テストが失敗することです。Assume

一般的な使用例はAssume.assumeTrue( isWindows() )、たとえばWindowsファイルシステムでのみ機能するテストです。

したがって、できることは、システムプロパティskipSlowTestsを定義して追加することです

Assume.assumeTrue( Boolean.getBoolean("skipSlowTests") )

通常スキップしたい遅いテストの開始時。プロパティを定義するEclipse起動構成を作成するtrueと、2つを切り替える便利な方法があります。

低速テストを実行する場合は、Eclipse(またはクラス全体)でメソッドを選択し、コンテキストメニューから[Run asJUnitTest]を使用します。プロパティはfalseデフォルトであるため、テストが実行されます。

于 2013-07-02T12:08:54.170 に答える
9

いいえ、テストがすでに実行されている場合はスキップできません。

私が提案するのはCategories、遅いテストを残りのテストから分離するために使用することです。

例えば:

public interface SlowTests {
}

public class MyTest {

     @Test
     public void test1{
     }

     @Category(SlowTests.class)
     @Test
     public void test1001{
         // this is a slow test
     }
}

高速テスト用のテストスイートを作成します。

@RunWith(Categories.class)
@ExcludeCategory(SlowTests.class)
@SuiteClasses(MyTest.class)
public class FastTestSuite {

}

FastTestSuite遅いテスト(例:test1001)を実行したくない場合は、ここでを実行します。MyTestすべてのテストを実行する場合は、通常どおりに実行します。

于 2012-05-02T08:44:06.797 に答える
4

あなたが求めているのは、テストの途中でコードの実行を停止することです。コードにフックを入れずに現在のテストの実行を停止することはできません。最善の解決策は、他の人が提案しているようにカテゴリを使用することです。

基本的に、JUnitはすべての@Beforeメソッド(@Rulesを含む)、次に@Testメソッド、次に@Afterメソッド(ここでも@Rulesを含む)を実行します。JUnitにコードの一部の実行を停止するメカニズムがあると仮定しても(そうではありません)、ほとんどの時間はコードに費やされます。したがって、すでに開始されているテストを「スキップ」するには、テストコード(および場合によってはテストしているコード)を変更して、テストを完全に停止できるようにする必要があります。実行中のスレッドをきれいに停止すること自体が問題です[*]。

それで、あなたの選択肢は何ですか?

  1. テストを並行して実行すると、テストが終了するまで待つ必要はありません。これは機能する可能性がありますが、テストの並列化は多くの作業になる可能性があります。

  2. テストの実行を停止し、作業中のテストを修正します。ほとんどのIDEには、テストが実行されているJVMを強制終了するオプションがあります。これは間違いなく最も簡単なオプションです。

  3. 別のスレッドでテストを実行する独自のテストランナーを実装します。次に、このテストランナーは、スレッドの実行が終了するのを待つか、スレッドが停止するためのシグナルとなるフラグをどこかでチェックします。スレッドを管理する必要があるだけでなく、実行中のjvmにフラグを設定する必要があるため、これは複雑に聞こえます。たぶんどこかにファイルを作成しますか?このランナーは現在実行中のテストに失敗し、次のテストに進むことができます。テストを途中で「停止」すると、一貫性のない状態のままになる可能性があります。または、並行して実行される可能性があることに注意してください。

そこには並列のJUnitランナーがあり、IDE開発者から(少なくとも短期的には)多くの助けを得るつもりはないと思います。また、TestNGも見てください。これにより、処理を並行して実行できます。

カテゴリを使用する場合、私が使用する1つの解決策は、IDEを介さずに、mavensurefireなどを使用して長時間実行されるテストを個別に実行することです。これには、私のマシンの別の場所でソースコードをチェックアウトし、そこでビルドすることが含まれます。

[*]:Java、スレッドの停止方法、スレッドの停止について

于 2012-05-02T09:41:48.130 に答える
1

より一般的な解決策は、2つのテストスイートを用意することだと思います。1つは高速テスト用で、もう1つは低速テスト用です。これは通常、単体テスト(高速)と統合テスト(低速)を分割する方法です。

このようなもののためにJUnitまたはIntelliJに変更が加えられる可能性はほとんどありません。それらの使用方法を変更することをお勧めします-それはあなたがより速く答えに到達するでしょう。

于 2012-05-02T09:22:52.970 に答える
-1

あなたはあなたのthestを変更して、次のようなことをすることができます

public void theTest(){
    if (System.getProperty("skipMyTest") == null){
         //execute the test
    }
}

テストをスキップする場合は、環境変数に合格します

于 2012-05-02T08:20:02.217 に答える