有没有办法启动和停止记录多行语句和执行时间?

时间:2017-09-13 14:57:23

标签: java unit-testing logging

我们说我有这样的单元测试:

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

我想知道执行语句需要多长时间,是否有#34; Log with timer"像下面这样的功能来记录它已执行的每个语句(及其所用的时间)?

@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");

3 个答案:

答案 0 :(得分:0)

这是为了什么目的?

我认为理论上可以仅将其作为源仪器实现。

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

虽然,它看起来很奇怪(并影响时间)。

我猜你必须优化一些东西 VisualVM CPU分析是否适合您?

Understanding CPU time in visualvm profiler

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我认为你可以做到。

但它可能无法解决您的想法logWithTimer.start();logWithTimer.finish();

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

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

内部代码 - 演示中方法内的所有语句   封装

注意 - Spring AOP不支持内部代码,不完全支持    实现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文件,然后转到行号。不要以为你会在运行时知道这个名字,所以你要构建别的东西只是为了阅读你在这里产生的输出文件。