(落ち着いた)Webサービスでいくつかの機能テストを行いたいのですが。テストスイートには多数のテストケースが含まれており、それぞれがWebサービスでいくつかのHTTPリクエストを実行します。
当然、Webサービスを実行する必要があります。そうしないと、テストが失敗します。 :-)
Webサービスの開始には数分かかるため(データを大量に持ち上げる)、できる限り頻繁に開始しないようにします(少なくとも、サービスからのGETリソースのみが1つのサービスを共有できるテストケースはすべて)。
テストケースの@BeforeClassメソッドのようにテストを実行する前に、テストスイートに爆弾をセットアップする方法はありますか?
答えは、スイート内に@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 );
}
}
jUnitはそのようなことはできません-TestNGには@BeforeSuite
および@AfterSuite
アノテーション。通常は、ビルドシステムにそれを実行させます。 Mavenには、「統合前テスト」と「統合後テスト」のフェーズがあります。 ANTでは、タスクにステップを追加するだけです。
あなたの質問はかなり jUnit 4.xのビフォーとアフタースイート実行フック の重複です。そこで、私はそこにある提案を見ていきます。
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ターゲットを使用して独自のテストを定義する)に移行することがはるかに簡単になります。