29

eclipse->junit-view に表示されるテスト実行時間は、以下を含むテスト ケース全体の実行に依存します。

  • テストデータの準備
  • ビジネスロジックの実行
  • 結果を主張する

ビジネス ロジックとビジネス ロジックのみの実行時間について、より詳細なステートメントが必要です。それが私のテストケース内で行ったことです:

Date lNow = new Date();
List<Geo> lAllBasisGeo = mGeoEvaluator.evaluateAllGeo(lGeoFixture.getGeo(), lAllGeo);
Date lStop = new Date();
System.out.println("Time of execution in seconds:"+((lStop.getTime()-lNow.getTime())/1000));

うーん…私は本当にぎこちない方法で時間を決定していると思います。さらに、2 つの Date 変数を宣言する必要があるとは思いません。

そのコードをより効率的に書くためのアドバイスが必要です...

4

4 に答える 4

35

単体テストでは、JUnit 4 アノテーションを使用してテストにタイムアウトを追加し、テストが (十分に速く) 成功するかどうかを判断します。

@Test(timeout=100)//let the test fail after 100 MilliSeconds
public void infinity() {
  while(true);
}

ビジネスロジックの正確なランタイムを決定するには、あなたのように重要なコードパスの直前と直後に Time ステートメントを追加し、それを数回繰り返して学問的に正しい結果を取得し、ステートメントを再度削除して、コードをスリムにします。

long start = System.currentTimeMillis();
//execute logic in between
long end = System.currentTimeMillis();
System.out.println("DEBUG: Logic A took " + (end - start) + " MilliSeconds");
于 2013-02-15T11:54:40.853 に答える
31

JUnit 4.12 で導入されたStopwatch @Rule. これは非常に簡単に使用でき、テスト中に費やされた時間を検証するための事実上の方法になるはずです。以下は、その機能を紹介するサンプル クラスです。

public static class StopwatchTest {
     private static final Logger logger = Logger.getLogger("");

     private static void logInfo(Description description, String status, long nanos) {
         String testName = description.getMethodName();
         logger.info(String.format("Test %s %s, spent %d microseconds",
                                   testName, status, TimeUnit.NANOSECONDS.toMicros(nanos)));
     }

     @Rule
     public Stopwatch stopwatch = new Stopwatch() {
         @Override
         protected void succeeded(long nanos, Description description) {
             logInfo(description, "succeeded", nanos);
         }

         @Override
         protected void failed(long nanos, Throwable e, Description description) {
             logInfo(description, "failed", nanos);
         }

         @Override
         protected void skipped(long nanos, AssumptionViolatedException e, Description description) {
             logInfo(description, "skipped", nanos);
         }

         @Override
         protected void finished(long nanos, Description description) {
             logInfo(description, "finished", nanos);
         }
     };

     @Test
     public void succeeds() {
     }

     @Test
     public void fails() {
         fail();
     }

     @Test
     public void skips() {
         assumeTrue(false);
     }

     @Test
     public void performanceTest() throws InterruptedException {
         // An example to assert runtime:
         long delta = 30;
         Thread.sleep(300L);
         assertEquals(300d, stopwatch.runtime(MILLISECONDS), delta);
         Thread.sleep(500L);
         assertEquals(800d, stopwatch.runtime(MILLISECONDS), delta);
     }
}
于 2015-01-09T20:45:32.060 に答える
12

これには、Guava ライブラリー Stopwatch に非常に便利なユーティリティがあります
これにより、次のように書くことができます

import com.google.common.base.Stopwatch;

final Stopwatch stopwatch = Stopwatch.createStarted();
//dostuff
System.out.println("Time of execution in seconds:" + stopwatch.stop().elapsed(TimeUnit.SECONDS));
于 2013-02-15T10:30:19.517 に答える