【问题标题】:Exclude @Before method duration from JUnit test time从 JUnit 测试时间中排除 @Before 方法持续时间
【发布时间】:2017-07-21 00:39:33
【问题描述】:

JUnit 报告我的测试时间时,它看起来包括执行 @BeforeClass @Before 所花费的时间。

我正在使用 JUnit 4.12

在这种情况下,它显示 23.863 秒与测试相比,总共 25.649 秒。 当我手动检测所有方法时,这是故障:

10:11:20.074 [INFO] [mainId] beforeClass completed in 12516ms
10:11:40.083 [INFO] [mainId] beforeTest completed in 20009ms
10:11:44.171 [INFO] [mainId] start_test completed in 4076ms 

因此,如果我添加 beforeTest 和 start_test 时间,我会接近 UI 中报告的时间。

  • 有没有办法告诉 JUnit 只显示 start_test 时间?

现在我只是像这篇文章一样手动输出时间:https://stackoverflow.com/a/180191/1165140

2017 年 7 月 27 日更新 实际上问题在于之前的测试方法(@Before)而不是我之前认为的@BeforeClass - 我的日志记录错误。仍然在我看来,是否包括这个时间应该是可配置的。我在每次测试前使用@beforetest 设置数据。

我已经确认在 UI 中输出了膨胀的时间,以及从命令行输出的 maven surefire XML。

【问题讨论】:

  • 根据javadoc junit.sourceforge.net/javadoc/org/junit/runner/notification/‌​... testStarted() 在每个@Test 即将被调用并且testFinished() 被调用时被调用在每个 @Test 完成时调用,无论它是通过还是失败。这个怎么样?
  • 感谢@ansh 的这个建议。我会试试看。
  • 我尝试使用 RunListener,但时间仍然包括 beforeTest 时间。在 beforeTest 开始时,它必须在内部调用 testStarted。

标签: java junit timing


【解决方案1】:
public static class StopwatchTest {
     private static final Logger logger = Logger.getLogger("");

     private static void logInfo(Description description, String status, long nanos) {
         String testName = description.getMethodName();
         logger.info(String.format("Test %s %s, spent %d microseconds",
                                   testName, status, TimeUnit.NANOSECONDS.toMicros(nanos)));
     }

     @Rule
     public Stopwatch stopwatch = new Stopwatch() {
         @Override
         protected void succeeded(long nanos, Description description) {
             logInfo(description, "succeeded", nanos);
         }

         @Override
         protected void failed(long nanos, Throwable e, Description description) {
             logInfo(description, "failed", nanos);
         }

         @Override
         protected void skipped(long nanos, AssumptionViolatedException e, Description description) {
             logInfo(description, "skipped", nanos);
         }

         @Override
         protected void finished(long nanos, Description description) {
             logInfo(description, "finished", nanos);
         }
     };

     @Test
     public void succeeds() {
     }

     @Test
     public void fails() {
         fail();
     }

     @Test
     public void skips() {
         assumeTrue(false);
     }
 }

取自Stopwatch

【讨论】:

  • 谢谢,但据我所知,这会输出到一个记录器,我已经拥有了(虽然这更整洁)。除非它也在 UI 中显示这些时间?
  • @avvi 谁在乎 UI 中显示的内容?当经理要求提供测试报告时,您会将您的计算机发送给他们吗?
  • 实际上,当我在本地进行单元测试时,我关心 UI 中显示的内容。这就引出了第二个问题,Junit.xml 报告会显示什么时间?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2015-10-23
  • 2017-11-29
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多