20190626-surefire并行化运行问题的一二

官方文档说的已经很明确了,一种是多线程式运行,一种是fork JVM来多进程运行
https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html
我们的实践表明,设置为类、classes级别的多线程运行后,参数化测试,作为一个测试类,其中的各种参数化测试也会变成多线程,也就是说,参数化测试在methods级别并行了,这不是我们想要的,不过接下来的文档中,https://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html#Running_tests_in_parallel 文档中说明了,可以使用@net.jcip.annotations.NotThreadSafe来注解一些测试类,此时,我们注解参数化测试类就可以解决这个问题;也可以给参数化测试sychronized类的成员变量
@NotThreadSafe新引入的问题
注意所有标记了NotThreadSafe的测试将在一个固定线程数量为1的线程池中运行,其他未标记的在另一个线程池运行;但是这两个线程池中的测试是可以同时运行的NotThreadSafe的意思只是标记了这个注解的测试类之间是不能并行运行,不代表和其他可并行的测试类不能同时运行,我是这样解决这个问题的:公共控制Rule里增加一个策略:非线程安全的测试运行前先要询问当前自己是否能运行;”顾问“通过监听类采集的数据(surefire预留有listener)来更新当前最后一个线程安全的测试运行的结束时间。假设一个测试用例最长运行20s,当前时间距离线程安全测试运行完超过20s,则非线程安全的测试可以运行,通过延迟执行进行完全隔离。
问题二,SuiteA包含Suite1,Suite1注解了@NotThreadSafe,Suite1包含测试类Test1,Test1也注解了@NotThreadSafe,此时使用mvn test -Dtest=SuiteA时,你会发现程序卡住了,但是CPU使用率不高,jconsole和jstack也没有检测死锁,那到底怎么了?我也不知道;正在查看解决中,需要说明的是,这是surefire插件的作用。
当前我已经知道此问题的原因,给Suite分配线程数过小导致出现死锁,在分配线程数即分配设置并行数量的时候,配置的数字是一个比例分配,而不是数量;并且更倾向分配给叶子;具体原理稍后分析。
再啰嗦一句,JUnit官网中介绍了大量第三方加速测试的开源工具,包含像SpringTestRunne等的第三方TestRunner,等其他一些快捷注解,是非常适合引入学习的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值