CentOS7编译WhereHows时wherehows-common测试报错:任务数量不符
解决WhereHows编译时JobsUtilTest.testGetEnabledJobs断言失败问题
我之前在CentOS7上编译WhereHows的时候,也碰到过类似的Gradle测试读取到额外配置的坑,咱们来一步步解决这个问题:
问题复盘
在执行wherehows-common:test任务时,JobsUtilTest.testGetEnabledJobs方法断言失败:预期读取到2个job配置,但实际读到了47个,其中包含大量重复的测试配置和无关的系统/其他测试配置。从你打印的输出能看出来,getEnabledJobs方法把临时目录里所有符合规则的配置文件都读进来了,包括其他测试生成的残留文件。
核心原因
测试代码里的createPropertiesFile默认使用了系统共享的临时目录,而getEnabledJobs方法没有限定读取范围——它会遍历目录下所有符合条件的配置文件,导致把其他测试生成的临时文件、甚至项目里的其他配置都扫进来了。
解决方案
1. 给测试创建专属临时目录
修改测试代码,让生成的测试配置文件放在独立的专属临时目录里,这样getEnabledJobs只会读取这个目录下的文件,不会和其他测试的文件混在一起。修改后的代码如下:
import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.Map; import java.util.Properties; import org.testng.Assert; public void testGetEnabledJobs() throws IOException, ConfigurationException { // 创建专属的测试临时目录,避免和其他测试共享目录 Path testTempDir = Files.createTempDirectory("wherehows-job-test-"); String propertyStr1 = "job.class=test\n" + "job.cron.expr=0 0 1 * * ? *\n" + "#job.disabled=1\n" + "job.type=TEST1"; String propertyStr2 = "job.class=test\n" + "#job.disabled=1\n"; // 在专属目录下生成测试文件 Path path1 = Files.createFile(testTempDir.resolve("test-job-1.properties")); Files.write(path1, propertyStr1.getBytes(StandardCharsets.UTF_8)); Path path2 = Files.createFile(testTempDir.resolve("test-job-2.properties")); Files.write(path2, propertyStr2.getBytes(StandardCharsets.UTF_8)); String filename1 = path1.getFileName().toString(); String filename2 = path2.getFileName().toString(); Map<String, Properties> jobs = getEnabledJobs(testTempDir.toString()); System.out.println("Displaying jobs map"); jobs.forEach((key, value) -> System.out.println(key + ":" + value)); // 执行断言 Assert.assertEquals(jobs.size(), 2); Assert.assertEquals(jobs.get(filename1).getProperty("job.class"), "test"); Assert.assertEquals(jobs.get(filename1).getProperty("job.disabled", ""), ""); Assert.assertEquals(jobs.get(filename2).getProperty("job.class"), "test"); // 清理测试资源 Files.deleteIfExists(path1); Files.deleteIfExists(path2); Files.deleteIfExists(testTempDir); }
2. 检查并修正getEnabledJobs方法的读取逻辑
如果修改测试后还是有问题,那就要去看getEnabledJobs的实现:
- 确认它是否递归读取子目录:如果是,改成只读取当前目录的文件;
- 确认它是否有文件过滤规则:比如是不是只读取以
.properties结尾的文件?有没有排除临时文件的前缀(比如temp开头的文件)? - 如果方法本身是用来读取所有job配置的,那测试时应该明确指定只读取测试生成的文件,而不是整个目录。
3. 临时跳过测试(应急方案)
如果赶时间编译,可以先跳过这个测试任务,继续后续步骤:
./gradlew build -x wherehows-common:test
注意:这只是临时方案,后续还是要修复测试保证代码质量。
验证
修改完成后,重新运行测试:
./gradlew wherehows-common:test --tests wherehows.common.utils.JobsUtilTest.testGetEnabledJobs
如果输出里只显示2个job,断言通过,就说明问题解决了。
内容的提问来源于stack exchange,提问作者lampShadesDrifter
相关产品推荐
相关产品推荐

