gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:15:13 27 4
gpt4 key购买 nike

关于每个测试运行的运行时间,我面临着轻微的 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 运行器没有使用 junit 提供的信息。 RunListener接口(interface)定义了方法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 添加到时代。所以,如果你关心你的方法的时间,你需要要么
  • 运行上面的代码,创建自己的监听器。没有简单的方法可以将监听器附加到特定测试。
  • 使用基准测试套件(junit-benchmark 如 DaveBall 建议或 JunitPerf
  • 不要在@AfterClass
  • 中做任何缓慢的事情

    关于java - JUnit @AfterClass 运行时被添加到一个糟糕的测试用例 :(,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7338153/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com