2013-12-09 4 views
7

負荷テストのためにいくつかの統合テストを再利用したいと思います。だから@Ruleでテスト実行を並列化する

@Override 
public void evaluate() throws Throwable { 
    ScheduledExecutorService exe = Executors.newScheduledThreadPool(invocations); 

    for (int i = 0; i < invocations; i++) { 
     ScheduledFuture<?> scheduledFuture = exe.schedule(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        invocated++; 

        // Request test = Request.method(description.getTestClass(), description.getMethodName()); 
        // new JUnitCore().run(test); 

        statement.evaluate(); 
       } catch (Throwable e) { 
        e.printStackTrace(); 
       } 
      } 
     }, i * rampUpTime, this.timeUnit); 
     futures.add(scheduledFuture); 
    } 
} 

:私のルールの実装では

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Parallel { 

    int invocations() default 1; 

    int rampUpTime() default 0; 
} 

注釈が評価され、文が設定されている、そのような評価方法があります。私は、アノテーションによってパラメータ化されたルールを実装しましたevaluateコールはRunnable()にラップされ、注釈で説明されているようにスケジュールされます。事は:私のルールでは、スケジューリングだけが行われます。ランナーは、テストスイート全体をセットアップするのに必要なすべてのrunablesについて知っていません。だから私はevalute()への呼び出しをテストランナーに追加しようとしています。最初に、JUnitCore.run(...)を使用して再帰的に終了しました。

次は、すべての先物を収集し、終了するのを待つことでした。これはテストごとにうまく動作しますが、テストスイート全体を並行して実行したいのです。また、私のテストレポートでは、テストは一度しか実行されません。

私はパラメータ(すべてのテストからすべての先物を収集するオブジェクト)を持つパラメータ付きスイートを使用すると考えましたが、このコンテキストオブジェクトをテストに昇格させる方法は見つけられませんでしたそれ自身のパラメータを持たなければならない。

私のルールから実行中のテストランナーに複数の実行を追加する方法を今質問しています。

+0

http://www.clarkware.com/software/JUnitPerf.htmlの「LoadTest」が役立つかもしれません –

+1

専用のストレスツールを使用しないのはなぜですか? jMeterやGatlingのようなもの? – Chiron

+0

単に既存の統合テストを再利用しないのはなぜですか?私はJMeterでJUnitテストを実行することは可能だが、それは苦痛だ。統合テストはEclipse Plugin単体テストであり、Eclipseテストフレームワークを組み込んだアプリケーションを構築し、これをJMeterで使用することが可能です。 – CodeSeavers

答えて

2

あなたが正しく理解している場合は、テストランナーの実行動作を制御しようとしています。 TestRuleは、その目標を達成するために限定されている可能性があります。しかし、単体テストの実行フローを制御する独自のRunnerを書くのはどうですか? ParentRunner of JUnitをご覧ください。そこから、基本的なスケジューリングがどのように機能しているか、かなり良い考えが得られるはずです。org.junit.experimental.ParallelComputerの独自のバージョンを実装することもできます。

+0

私はそれを行います。 – CodeSeavers

関連する問題