JUnit @AfterClass运行时添加到一个糟糕的测试用例:(

时间:2011-09-07 17:41:01

标签: java eclipse unit-testing junit junit4

我对每个测试的运行时间都有轻微的JUnit不便。

我有一个@AfterClass注释,最后一个运行的测试会将它的运行时添加到它中。

因此,报告将错误地显示最后一次运行的不良测试的长时间运行。

有没有办法从上次测试中排除其运行时间?

2 个答案:

答案 0 :(得分:3)

Eclipse是一个问题,而不是junit。如果我们以此为例:

public class TimingTest {
    @Test public void test1() {
        System.out.println("test1");
        sleep(1000);
    }

    @Test public void test2() {
        System.out.println("test2");
        sleep(2000);
    }

    @After public void after() {
        System.out.println("after");
        sleep(3000);
    }

    @AfterClass public static void afterClass() {
        System.out.println("afterClass");
        sleep(5000);
    }

    private static void sleep(int i) {
        try {
            Thread.sleep(i);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

然后我们得到test1 = 4s,test2 = 10s(在Eclipse中)。但是,Eclipse中的junit runner没有使用junit提供的信息。 RunListener接口定义了testStarted,testFinished,testRunStarted,testRunFinished方法。如果我们看一下调用这些方法的时间,请使用:

public class RunJunitTestRunListener {
    private static class MyListener extends RunListener {
        private long runStart = 0L;
        private long testStart = 0L;

        @Override
        public void testRunStarted(Description description) throws Exception {
            System.out.println("runStarted");
            runStart = System.currentTimeMillis();
            super.testRunStarted(description);
        }

        @Override
        public void testRunFinished(Result result) throws Exception {
            System.out.println("runFinished " + (System.currentTimeMillis() - runStart) + "ms");
            super.testRunFinished(result);
        }

        @Override
        public void testStarted(Description description) throws Exception {
            System.out.println("testStarted");
            testStart = System.currentTimeMillis();
            super.testStarted(description);
        }

        @Override
        public void testFinished(Description description) throws Exception {
            System.out.println("testFinished " + (System.currentTimeMillis() - testStart) + "ms");
            super.testFinished(description);
        }
    }

    public static void main(String[] args) {
        JUnitCore core= new JUnitCore();
        core.addListener(new MyListener());
        core.run(TimingTest.class);
    }
}

我们得到输出:

testFinished 4004ms
testFinished 5002ms
runFinished 14012ms

这是你所期望的。 Eclipse正在将@afterClass添加到时代。因此,如果您关心方法的时间安排,则需要

  1. 运行上面的代码,创建自己的监听器。没有简单的方法将侦听器附加到特定测试。
  2. 使用基准套件(junit-benchmark作为DaveBall建议或JunitPerf
  3. 在@AfterClass
  4. 中不要做任何事情

答案 1 :(得分:0)

如何在上次测试中包含/考虑运行时?

如果您正在测量性能,请使用微基准测试。查看junit-benchmark,我认为它是最简单的微基准测试库之一。