web-dev-qa-db-ja.com

JUnit 4:テストを実行する前にテストスイートに設定する(テストスイートの@BeforeClassメソッドと同様)

(落ち着いた)Webサービスでいくつかの機能テストを行いたいのですが。テストスイートには多数のテストケースが含まれており、それぞれがWebサービスでいくつかのHTTPリクエストを実行します。

当然、Webサービスを実行する必要があります。そうしないと、テストが失敗します。 :-)

Webサービスの開始には数分かかるため(データを大量に持ち上げる)、できる限り頻繁に開始しないようにします(少なくとも、サービスからのGETリソースのみが1つのサービスを共有できるテストケースはすべて)。

テストケースの@BeforeClassメソッドのようにテストを実行する前に、テストスイートに爆弾をセットアップする方法はありますか?

24
Jens Mander

答えは、スイート内に@ClassRuleを作成することです。ルールは、(テストの実装方法に応じて)各テストクラスが実行される前または後に呼び出されます。拡張/実装できるいくつかの異なる基本クラスがあります。クラスルールの良い点は、それらを匿名クラスとして実装しない場合、コードを再利用できることです。

ここにそれらについての記事があります: http://Java.dzone.com/articles/junit-49-class-and-suite-level-rules

以下は、それらの使用法を説明するためのサンプルコードです。はい、それは些細なことですが、それはあなたが始めるために十分に十分にライフサイクルを説明するはずです。

最初にスイートの定義:

import org.junit.*;
import org.junit.rules.ExternalResource;
import org.junit.runners.Suite;
import org.junit.runner.RunWith;


@RunWith( Suite.class )
@Suite.SuiteClasses( { 
    RuleTest.class,
} )
public class RuleSuite{

    private static int bCount = 0;
    private static int aCount = 0;

    @ClassRule
    public static ExternalResource testRule = new ExternalResource(){
            @Override
            protected void before() throws Throwable{
                System.err.println( "before test class: " + ++bCount );
                sss = "asdf";
            };

            @Override
            protected void after(){
                System.err.println( "after test class: " + ++aCount );
            };
        };


    public static String sss;
}

そして今テストクラスの定義:

import static org.junit.Assert.*;

import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExternalResource;

public class RuleTest {

    @Test
    public void asdf1(){
        assertNotNull( "A value should've been set by a rule.", RuleSuite.sss );
    }

    @Test
    public void asdf2(){
        assertEquals( "This value should be set by the rule.", "asdf", RuleSuite.sss );
    }
}
25
Sled

jUnitはそのようなことはできません-TestNGには@BeforeSuiteおよび@AfterSuiteアノテーション。通常は、ビルドシステムにそれを実行させます。 Mavenには、「統合前テスト」と「統合後テスト」のフェーズがあります。 ANTでは、タスクにステップを追加するだけです。

あなたの質問はかなり jUnit 4.xのビフォーとアフタースイート実行フック の重複です。そこで、私はそこにある提案を見ていきます。

1
sblundy

1つのオプションは、Apache Antなどを使用して単体テストスイートを起動することです。次に、junitターゲットの前後にターゲット呼び出しを配置し​​て、Webサービスを開始および停止できます。

<target name="start.webservice"><!-- starts the webservice... --></target>
<target name="stop.webservice"><!-- stops the webservice... --></target>
<target name="unit.test"><!-- just runs the tests... --></target>

<target name="run.test.suite" 
        depends="start.webservice, unit.test, stop.webservice"/>

次に、ant(または選択した統合ツール)を使用してスイートを実行します。ほとんどのIDEにはAntがサポートされており、テストを継続的な統合環境(多くの場合、Antターゲットを使用して独自のテストを定義する)に移行することがはるかに簡単になります。

0
Dan Vinton