如何配置Pitest CrossModule实现跨模块变异测试?
要让pitest-maven插件针对civitas-ng-crypto模块的类执行变异测试,仅开启<crossModule>true</crossModule>是不够的,还需要明确指定目标类范围、确保依赖可访问,具体配置步骤如下:
指定目标变异类与测试类范围
在civitas-ng-cryptotest的pom.xml中,给pitest插件添加<targetClasses>和<targetTests>配置,明确指向civitas-ng-crypto的业务类包,以及当前测试模块的测试类包:<plugin> <groupId>org.pitest</groupId> <artifactId>pitest-maven</artifactId> <version>1.15.0</version> <!-- 使用最新稳定版,确保跨模块支持完善 --> <configuration> <crossModule>true</crossModule> <!-- 要进行变异测试的目标类:civitas-ng-crypto的包路径 --> <targetClasses> <param>com.yourgroup.civitas.ng.crypto.**</param> </targetClasses> <!-- 用于覆盖目标类的测试类:当前测试模块的包路径 --> <targetTests> <param>com.yourgroup.civitas.ng.cryptotest.**</param> </targetTests> <!-- 开启全依赖分析,确保Pitest能找到目标模块的类 --> <dependencyAnalysis>ALL</dependencyAnalysis> </configuration> <executions> <execution> <id>run-pitest</id> <goals> <goal>mutationCoverage</goal> </goals> </execution> </executions> </plugin>确保目标模块可本地访问
先执行mvn clean install构建并安装civitas-ng-crypto模块到本地仓库,Pitest需要读取该模块的字节码与调试信息,不能仅依赖远程仓库的依赖包(除非远程包包含完整调试信息)。检查排除规则
确认pitest配置中没有通过<excludedClasses>排除civitas-ng-crypto的类,避免意外过滤掉目标类。多模块项目优化(可选)
如果两个模块属于同一个Maven父项目,建议在父pom中统一管理pitest配置,同时在测试模块的<dependencies>中使用模块依赖而非普通依赖,让Pitest更高效地定位目标模块资源:<dependency> <groupId>com.yourgroup</groupId> <artifactId>civitas-ng-crypto</artifactId> <version>${project.version}</version> </dependency>
关键原因说明
默认情况下,Pitest仅处理当前模块的类,开启<crossModule>只是允许插件跨模块查找依赖,但不会自动将依赖模块的类纳入变异范围,必须通过<targetClasses>显式指定,插件才会对目标模块的类执行变异,并使用当前模块的测试类计算覆盖率。
内容的提问来源于stack exchange,提问作者Árpád Magosányi

