并行执行测试时获取顺序日志
我们一直在使用testng
和java
来为我们的代码执行集成测试。 我们已经为测试执行实现了一个监听器 ,如下所示: -
public class TestExecutionListener implements IInvokedMethodListener {
@Override
public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
System.out.println("Testing : " + iInvokedMethod.getTestMethod().getMethodName());
}
@Override
public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
System.out.println("Successfully Tested : " + iInvokedMethod.getTestMethod().getMethodName());
}
}
我们的testng.xml被定义为: -
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="TestSuite" verbose="1" parallel="classes" thread-count="10">
<listeners>
<listener class-name="core.TestExecutionListener"/>
</listeners>
<test name="IntegrationTests">
<classes>
<class name="test.SomeTest1"/>
<class name="test.SomeTest2"/>
<class name="test.SomeTest3"/>
<class name="test.SomeTest4"/>
... There are more than 20 classes
</classes>
</test>
</suite>
在我们执行测试时,我们得到的输出如下所示:
Testing : SomeTest1Method1
Testing : SomeTest2Method2
Testing : SomeTest4Method5
Successfully Tested : SomeTest2Method2
Successfully Tested : SomeTest4Method5
而我们期望的结果是: -
Testing : SomeTest1Method1
Successfully Tested : SomeTest1Method1
Testing : SomeTest2Method2
Successfully Tested : SomeTest2Method2
Testing : SomeTest4Method5
Successfully Tested : SomeTest4Method5
猜测这是因为xml中的parallel="classes"
属性,因为将其更改为false
提供所需的输出。 但是很显然,与并行执行相比,更改后的执行消耗更多时间。
有没有办法同时运行这些测试,但依然得到这个输出?
如果您启用了并行操作,那么在日志中的beforeInvocation
和afterInvocation
之间会有一段时间,因为您已经注意到,并且时间上的差异因测试而异,因此交错输出。
如果你想要的是起点和终点的信息彼此相邻,那么你基本上扔出去的时间因素,因此可以简单地添加你的beforeInvocation
消息给afterInvocation
方法如下:
public class TestExecutionListener implements IInvokedMethodListener {
@Override
public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
}
@Override
public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
System.out.println("Testing : " + iInvokedMethod.getTestMethod().getMethodName());
System.out.println("Successfully Tested : " + iInvokedMethod.getTestMethod().getMethodName());
}
}
国际海事组织这是唯一的方式来按照你的规范去做。 但是,如果在测试期间必须收集其他信息,那么也许可以在TestExecutionListener
缓冲一些日志,例如:
public class TestExecutionListener implements IInvokedMethodListener {
private Map<Integer, Deque<String>> logsMap = new HashMap<Integer, Deque<String>>();
public void log(IInvokedMethod iInvokedMethod, String log) {
if(!logsMap.containsKey(iInvokedMethod.getId())) {
logsMap.put(iInvokedMethod.getId(), new ArrayDeque<String>());
}
logsMap.get(iInvokedMethod.getId()).add(log);
}
@Override
public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
log(iInvokedMethod, "Testing : " + iInvokedMethod.getTestMethod().getMethodName());
}
@Override
public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
log(iInvokedMethod, "Successfully Tested : " + iInvokedMethod.getTestMethod().getMethodName());
Deque<String> logs = logsMap.get(iInvokedMethod.getId());
while(!logs.isEmpty()) {
System.out.println(logs.poll());
}
}
}
首先,我会建议你使用log4j或类似的记录器工具,这是优雅的,模块化的,并提供了很多灵活的选项。 这也奠定了以多种方式设计和处理日志机制的途径。
如果您有业务需求,需要您分别跟踪每个线程的日志,则应考虑将此日志流式传输到不同的文件。 Log4j类工具确实支持写入多个文件的要求。 你可以做谷歌搜索,你会得到很多信息。
链接地址: http://www.djcxy.com/p/35743.html上一篇: Getting sequential logs while executing tests in parallel
下一篇: PHP multidimensional array: replace all keys with concatenation of two values