缘由

因为业务中是以任务流的方式交互的,而某些任务同时产生的,没有先后顺序的依赖关系,
这就要求在测试时,去关注不同的任务,先后提交是否有影响?
如果要并发执行一条以上的用例,又该怎么做呢?

问题点

  1. 这里主要讨论的是接口,因之前的接口自动化是基于 testNG 框架的,所以主要问题是查看 testNG 对用例执行顺序的支持
  2. 另一个问题点是,原来的用例执行器只支持一条一条的执行,testNG 的并发执行怎么玩的

原执行逻辑

for (Map.Entry<Integer, APITestCase> oneTC : JsonTestUtils.getAllTestCaseMap().entrySet()) {
    log.debug(oneTC.getValue().getName() + " : " + oneTC.getValue().getDescription());
    TestNG testNG = new TestNG(false);
    testNG.setSuiteThreadPoolSize(1);
    testNG.setThreadCount(1);
    testNG.setTestClasses(new Class[]{TestExecutor.class});
    JsonTestUtils.getTestCase();
    testNG.run();
}

这里是一条一条按顺序执行的,如果想要不按顺序执行,怎么搞?

方法一

将用例解析出来后,自己再写一个随机调用的方法,随机调用用例执行

方法二

TestNG testNG = new TestNG(false);
//        testNG.setSuiteThreadPoolSize(5);
testNG.setPreserveOrder(false);
testNG.setParallel(XmlSuite.ParallelMode.CLASSES);
testNG.setTestClasses(new Class[]{calzz1, clazz});
testNG.run();

在 testNG 中是可以指定测试类的执行顺序的,
如上代码所示,preserveOrder 是指定执行顺序的,默认是 true,按字母顺序排列
此外,设计线程池的数量在一定程度上,也能达到类似的效果,因为是并发执行的,执行的顺序并不固定
另外这里的 clazz 和 clazz1 是在用例执行前动态生成的,参考:使用 java 动态加载机制模拟脚本语言的效果

扩展

把这里的顺序执行与并发支持做成参数,开放给用户在 web 页面上勾选,以提高用例执行的灵活度

参考

JAVA 测试新技术-TestNG 和高级概念


↙↙↙阅读原文可查看相关链接,并与作者交流