FitNesse结合JUnit并行执行测试套件问题咨询
问题分析与解决
你猜的完全没错——你的FitNesse测试套件大概率没有启动两个独立的Slim服务器实例,所以就算用JUnit的ParallelComputer让测试类并行执行,本质上两个套件还是在同一个Slim服务器上串行跑,耗时自然和之前差不多。
为什么会这样?
JUnit的ParallelComputer.classes()只是让JUnit层面并行调度测试类的执行,但FitNesseRunner的默认行为是复用全局的Slim服务器实例(或者说不同测试类共享了同一个服务器资源),并没有为每个测试套件单独启动服务器。这种情况下,两个互斥的套件还是会排队使用同一个Slim服务器,完全没发挥并行的作用。
解决办法:让每个套件启动独立的Slim服务器
要实现真正的并行执行,核心是让每个FitNesse测试套件拥有自己的Slim服务器实例,具体可以这么做:
- 为每个套件指定独立的Slim端口
通过@FitNesseRunner.SlimPort注解给两个套件分配不同的端口,避免端口冲突,同时强制每个套件启动自己的Slim服务器:
@RunWith(FitNesseRunner.class) @FitNesseRunner.Suite("Suite1") @FitNesseRunner.FitnesseDir(".") @FitNesseRunner.OutputDir("/tmp/fitnesse/") @FitNesseRunner.SlimPort(9001) // 为Suite1指定专属端口 public static class Suite1{ } @RunWith(FitNesseRunner.class) @FitNesseRunner.Suite("Suite2") @FitNesseRunner.FitnesseDir(".") @FitNesseRunner.OutputDir("/tmp/fitnesse/") @FitNesseRunner.SlimPort(9002) // 为Suite2指定另一个端口 public static class Suite2{ }
- 确保JUnit并行资源充足
除了代码里的ParallelComputer.classes(),还可以通过JVM参数调整并行线程数,比如启动测试时加上:
-Djava.util.concurrent.ForkJoinPool.common.parallelism=2
这个参数会设置JUnit并行执行的线程池大小,确保有足够的线程同时运行两个套件(数值可以根据你的CPU核心数调整)。
- 验证并行效果
修改后可以通过两个方式验证是否真的并行:
- 在套件的测试用例中打印当前线程ID,看两个套件的日志是否来自不同线程
- 查看
/tmp/fitnesse/下的输出日志,看两个套件的日志是否交叉生成,而不是先写完一个套件的日志再写另一个
另外还要注意:既然两个套件是互斥的,要确保它们不会共享测试资源(比如数据库连接、文件系统等),否则就算服务器并行,资源竞争也会导致耗时和串行差不多。
内容的提问来源于stack exchange,提问作者Darshan Mehta
相关产品推荐
相关产品推荐

