并行执行测试时获取顺序日志

我们一直在使用testngjava来为我们的代码执行集成测试。 我们已经为测试执行实现了一个监听器 ,如下所示: -

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提供所需的输出。 但是很显然,与并行执行相比,更改后的执行消耗更多时间。

有没有办法同时运行这些测试,但依然得到这个输出?


如果您启用了并行操作,那么在日志中的beforeInvocationafterInvocation之间会有一段时间,因为您已经注意到,并且时间上的差异因测试而异,因此交错输出。

如果你想要的是起点和终点的信息彼此相邻,那么你基本上扔出去的时间因素,因此可以简单地添加你的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