12

JUnit テストをプログラムで実行するのにかかる時間を記録したいと思います。さまざまなテスト クラスに多数のテストがあり、個々のテスト メソッドの実行にかかる時間を調べたいと考えています。

継承構造を変更したり、メソッドに別の方法で注釈を付けたりすることはできますが、テスト メソッド自体や、テスト ビジネス ロジックのセットアップに使用される before/after メソッド内にコードを追加する必要は避けたいと考えています。

4

7 に答える 7

10

@Before と @After を使用してみてください。@Before または @After のアノテーションが付けられたメソッドは、テストの前または後に実行されます。

    @Before
    public void start() {
        start = System.currentTimeMillis();
    }

    @After
    public void end() {
        System.out.println(System.currentTimeMillis() - start);
    }
于 2013-07-09T16:00:52.383 に答える
2

@Rule を作成して TestWatcher クラスをインスタンス化することもできます。これが私のために働いたものです。これは、TestCase を拡張するクラスで定義されています。

public class CompositeWithTeardownDBUnitTest extends DBTestCase {

DBTestCase は TestCase を拡張します

CompositeWithTeardownDBUnitTest のコード スニペット

@Rule
public TestRule watcher = new TestWatcher() {

    protected void starting(Description description) {
        timeStart = System.currentTimeMillis();
        cal = Calendar.getInstance();
        System.out
                .println("===========================================================================");
        System.out.println("Test: " + description.getMethodName());
        System.out.println("Start Time: " + dateFormat.format(cal.getTime()));
        System.out
                .println("===========================================================================");
    }

    protected void finished(Description description) {
        timeEnd = System.currentTimeMillis();
        double seconds = (timeEnd-timeStart)/1000.0;
        System.out
        .println("\n===========================================================================");
        System.out
        .println("Test completed - ran in: "+new DecimalFormat("0.000").format(seconds)+" sec");
        System.out
        .println("===========================================================================\n");

    }
};

JUnit テスト クラスは、このクラス CompositeWithTeardownDBUnitTest を拡張するだけです。

于 2014-07-02T18:10:33.390 に答える
1

既存の回答に加えて、テスト名BeforeAfterメソッドのルールを使用して、ログにメソッド名を表示できます。このような:

public class ImageSavingTest {
    @Rule
    public TestName name = new TestName();

    private long start;

    @Before
    public void start() {
        start = System.currentTimeMillis();
    }

    @After
    public void end() {
        System.out.println("Test " + name.getMethodName() + " took " + (System.currentTimeMillis() - start) + " ms");
    }

    @Test
    public void foobar() {
        // test code here
    }
}

出力します:

foob​​ar のテストに 1828 ミリ秒かかりました

于 2015-09-08T13:18:48.213 に答える
0

前後の呼び出し間の時間を記録するJUnit ルールを作成できます。このルールは、インスタンスおよび/またはクラス ルールとして使用して、個々のテスト メソッドおよび各テスト クラスの時間を取得できます。

于 2013-07-09T15:58:55.560 に答える
0

@Before および @After アノテーションを使用し、junit テストケースの開始時刻と終了時刻に注意する場合。次に、2 つのタイムスタンプの差を見つけると、テストケースの実行時間が得られます。このようなもの:

 public class Example {

    long startTime;
    long endTime;

    @Before public void recordStartTime() {
        startTime = System.currentTimeMillis();
    }
    @Test public void testSomething() {
          //test method
    }
    @After public void recordEndAndExecutionTime() {
        endTime = System.currentTimeMillis();
        System.out.println("Last testcase exection time in millisecond : " + (endTime - startTime));
    }
 }
于 2013-07-09T15:59:05.920 に答える