我们说我有这样的单元测试:
@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");
答案 0 :(得分:0)
这是为了什么目的?
我认为理论上可以仅将其作为源仪器实现。
比如说,一个maven插件将每条行包装到一个日志声明中 (或带有字节码检测的java代理,但不保证与源代码100%匹配)。
虽然,它看起来很奇怪(并影响时间)。
我猜你必须优化一些东西 VisualVM CPU分析是否适合您?
答案 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;
String sourceName = thisJoinPointStaticPart.getSourceLocation().getWithinType().getCanonicalName(); String line =""+thisJoinPointStaticPart.getSourceLocation().getLine();