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

关于每个测试运行的运行时间,我面临轻微的JUnit不便。

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

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

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

这是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. 使用基准测试套件(如DaveBall建议的junit-benchmark或JunitPerf
  3. 在@AfterClass中不要做任何慢的事情

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

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