JDK 的 make test 测试摘要怎么读?FAIL 与 ERROR 标记和 test-results 结果目录在哪
【免费下载链接】jdkJDK main-line development https://openjdk.org/projects/jdk项目地址: https://gitcode.com/GitHub_Trending/jd/jdk
本地构建过 JDK 之后,用make test跑完一轮测试,终端会打印一份固定的 Test summary。新手最常卡住的两个问题:看到>> jtreg:jdk/test:tier1 ... <<这种行不知道该不该管、FAIL和ERROR两列到底有什么区别,以及测试失败的详细日志到底存在哪个目录里。本文基于 JDK 仓库自带的 doc/testing.md 与 doc/building.md,说明这份摘要的读法、两种非 PASS 标记的含义,以及test-results结果目录的定位方式。
前提:已经本地构建过 JDK
make test的前提是“已在本地完成 JDK 构建”(doc/testing.md 原文:“Assuming you've built the JDK locally”)。默认主目标test以构建出的 jdk-image 作为被测对象。如果你的工作流是反复修改源码、需要加快重建速度,文档给出了替代目标exploded-test,它使用 exploded image 而不是 jdk-image;注意并非所有测试都能在 exploded image 上成功运行,这是可选分支,不是默认路径。
另外,JTReg 是 JDK 的主力测试框架,configure必须能找到 JTReg。如果没有被自动识别,用--with-jtreg=<path to jtreg home>指向 JTReg home(即包含lib/jtreg.jar的顶层目录),或者在运行configure前设置JT_HOME环境变量。
运行测试并等待摘要输出
最简单的启动方式:
make test这会对 JDK 运行一组默认测试,并在结束后打印统一格式的摘要。也可以只跑某个分组,例如:
make test-tier1 make test TEST="jdk_lang"make test-tier1等价于make test TEST="tier1",后者更利于 shell 补全。如果源码没改动、只想重跑测试,可以用test-only代替test,它不依赖源码与 test image 的重建。
逐列读取 Test summary
测试跑完后会输出类似下面的摘要(以下为源文档中的示例结果,具体数字以你自己运行的输出为准):
============================== Test summary ============================== TEST TOTAL PASS FAIL ERROR >> jtreg:jdk/test:tier1 1867 1865 2 0 << jtreg:langtools/test:tier1 4711 4711 0 0 jtreg:nashorn/test:tier1 133 133 0 0 ============================== TEST FAILURE判断规则在文档里只有一条:
- TOTAL 不等于 PASS 的行就是失败行,会被
>> ... <<标记出来以便快速定位。摘要下方还会打印TEST FAILURE段。 - 只要存在测试失败,
make test会以非零退出码结束——脚本或 CI 里可以直接用退出码判断这一轮是否通过。
摘要中的 TEST 列是全限定测试描述符(例如jtreg:jdk/test:tier1),能看出结果来自哪个测试框架、哪个测试根、哪个分组。
FAIL 与 ERROR 有什么区别
文档的原文解释是:非 PASS 测试的分类在各测试框架之间略有差异,ERROR是一个兜底分类,用于“既没有 PASS、也没有被框架归类为 FAIL”的测试。出现 ERROR 可能意味着测试框架本身的错误、超时或其他问题。
也就是说,读到摘要时:
FAIL > 0:框架明确判定该测试失败,去结果目录看该测试的输出即可。ERROR > 0:不一定是测试逻辑本身失败,框架错误、超时也会归到这一列,需要结合结果目录里的日志进一步看。文档到此为止,没有对 ERROR 给出更细的判别表,不要按经验自行扩展成固定结论。
FAIL与ERROR合计等于TOTAL - PASS,所以“哪一行需要跟进”只看>> ... <<标记就够了。
test-results 结果目录在哪
每个测试的结果都存放在构建输出目录下的test-results中。doc/testing.md 的写法是:
build/$BUILD/test-results/$TEST_ID其中$BUILD在 doc/building.md 中被定义为该配置的构建输出目录build/<configuration name>(<configuration name>是configure时生成或指定的配置名,如linux-x64-server-release)。两点提醒:
TEST_ID是全限定测试描述符的“path-safe”转换,即把:和/换成_。文档给出的例子:jtreg:jdk/test:tier1对应TEST_ID为jtreg_jdk_test_tier1。- 最省事的定位方式:每个测试结果目录的完整路径会在测试结束时的日志里直接打印,直接从结尾日志里复制即可,不必手工拼接。
除了test-results,文档还指出额外的工作数据存放在test-support/$TEST_ID下(同样位于构建输出目录内)。对于某些测试框架,该目录可能包含有助于判断失败原因的信息,排查失败时两个目录都值得一看。
顺带一个相关细节:JTReg 的RETAIN关键字默认值为fail,error,即默认只保留失败和 ERROR 测试的数据,所以上面两个目录里能稳定找到的正是需要跟进的那部分测试。
一个可照做的排查顺序
- 跑
make test(或make test-tier1缩小范围),等 Test summary 打印完。 - 只看带
>> ... <<的行,确认是FAIL列还是ERROR列非零:FAIL 按测试失败处理;ERROR 注意可能是框架错误或超时。 - 到测试结束日志中复制对应
TEST_ID的结果目录路径(test-results/$TEST_ID),查看该测试的详细输出;需要时再看同名的test-support/$TEST_ID工作数据目录。 - 用
make test的退出码作为这一轮是否整体通过的机器判据。
边界与限制
- 本文只覆盖摘要本身与结果目录的定位。文档没有给出“ERROR 具体怎么逐类区分”的判定表,遇到 ERROR 时以结果目录里的实际日志为准,不要预设固定结论。
- 默认
make test使用 jdk-image 作为被测对象;换成exploded-test时部分测试可能无法成功运行,两者结果不能直接互换比较。 - 摘要中各列的数字来自你本次实际运行的输出;本文给出的摘要只是 doc/testing.md 中的示例,不代表任何固定的预期值。
【免费下载链接】jdkJDK main-line development https://openjdk.org/projects/jdk项目地址: https://gitcode.com/GitHub_Trending/jd/jdk
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考