JUnit @AfterClass время выполнения добавляется в плохой тестовый случай :( - PullRequest
2 голосов
/ 07 сентября 2011

Я столкнулся с небольшим неудобством JUnit в отношении времени выполнения каждого теста для запуска.

У меня есть аннотация @AfterClass, и при последнем запуске теста к нему добавляется время выполнения.

Таким образом, в отчете будет неправильно отображаться длительное время выполнения неудовлетворительного теста, который выполняется последним.

Есть ли способ исключить его время выполнения из последнего теста?

Ответы [ 2 ]

3 голосов
/ 15 сентября 2011

Это проблема 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). Тем не менее, бегун junit в Eclipse не использует информацию, которую ему дает 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
0 голосов
/ 07 сентября 2011

Как вы включаете / учитываете время выполнения в последнем тесте?

Если вы измеряете производительность, используйте микро-эталон.Проверьте junit-benchmark , я думаю, что это одна из самых простых библиотек микро-бенчмаркинга.

...