【问题标题】:Is there a way to start and stop logging multiple lines of statements and time to execute?有没有办法开始和停止记录多行语句和执行时间?
【发布时间】:2018-02-22 08:33:52
【问题描述】:

假设我有一个这样的单元测试:

@Test
public void testSomething(){
    Car car = new Car();
    car.setColor("blue");
    car.setSize("big");
}

我想看看执行语句需要多少时间,是否有像下面这样的“带计时器的日志”功能来记录它执行的每条语句(以及它所花费的时间)?

@Test
public void testSomething(){
    logWithTimer.start();
    Car car = new Car();
    car.setColor("blue");
    car.setSize("big");
    logWithTimer.finish();
}

所以当我运行上面的单元测试时,输出会是这样的:

15:23:456 Car car = new Car();
15:23:470 car.setColor("blue");
15:23:500 car.setSize("big");

【问题讨论】:

    标签: java unit-testing logging


    【解决方案1】:

    我认为你可以做到。

    但它可能不适用于您的想法 logWithTimer.start();logWithTimer.finish();

    您需要考虑面向方面的编程 (AOP)。

    @Pointcut("withincode(* aspects.trace.demo.*.*(..))")
    public void traceMethodsInDemoPackage() {}
    

    withincode - 演示中方法内的所有语句 包。

    注意 - Spring AOP 不支持 withincode ,不完全支持 实现 AspectJ,这样您实际上就不会使用 @Pointcut 注释,而是使用 .aj 文件的切入点

    在您的情况下,您可以组合包切入点或只是将其更改为具有通配符,以便类以 *Test 结尾。

    或者甚至创建一个注解,以便在测试文件中的类之上,它还必须包含您的自定义注解,或者只是已经存在的@Test 注解。

    • 在通知中,您可以打印出当前系统时间或经过的时间
    long startTime = System.currentTimeMillis();
    // ... do something ...
    long estimatedTime = System.currentTimeMillis() - startTime;
    
    • 要获取当前行编号,可以使用this little helper .可以使用特殊形式 thisJoinPointStaticPart 在通知中访问。
    String sourceName = thisJoinPointStaticPart.getSourceLocation().getWithinType().getCanonicalName();
    String line =""+thisJoinPointStaticPart.getSourceLocation().getLine();
    

    source with output examples

    • 此时您需要源代码行。 您需要根据 sourceName 分别读取 .java 文件,然后转到行号。不要以为你会在运行时知道这个名字,所以你会构建其他东西来读取你在这里生成的输出文件。

    【讨论】:

    【解决方案2】:

    这样做的目的是什么?

    我认为理论上可以仅作为源工具来实现。

    比如说,一个将每一行包装成一个日志语句的maven插件。
    (或带有字节码检测的 java 代理,但不能保证与源代码 100% 匹配)。

    不过,它看起来很奇怪(并且会影响时间)。

    我猜你必须优化一些东西。
    VisualVM CPU 分析对你有用吗?

    Understanding CPU time in visualvm profiler

    【讨论】:

      【解决方案3】:

      看看有时序扩展的 JUnit 5,它可能是你需要的:http://junit.org/junit5/docs/current/user-guide/#extensions-lifecycle-callbacks-timing-extension

      您可以使用注释使 JUnit 显示有关该类中测试方法的计时数据。

      【讨论】:

      • 但不是关于陈述。
      • 如果不使用实际的分析器,我想不出任何可以做到这一点的方法。 OP 要求的是像单元测试中的行为分析器,这不是你可以扔一个开关让它工作的东西。他们应该检查 visualVm 或 YourKit 或其他分析器。
      • 我想了一个办法,提出了一些通用的指导方针。如果他费心去解决这个问题,他就能做到。很难获得实际的行名,但可行。
      猜你喜欢
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多