如何对我们自己编译的 JDK 运行回归测试?

说到编译 JDK,大家应该都不会陌生,而且网上在编译 JDK 方面的文章不可胜数。不过,在我看过的相关文章里,都是编译完 JDK,可以跑 javac、java 和 hello, world 等操作就算完事了。编译一个 JDK 不难,只要依赖齐全基本都能完成编译。但是,自行编译的 JDK 可靠性如何,不经过可靠的测试很难说明。
本文不介绍如何编译 JDK,而是介绍编译 JDK 之后,如何对编译产物进行回归测试,验证我们自行构建的 JDK 的可靠性。

获取 jtreg

jtreg 是 OpenJDK 的回归测试工具。

方式一:自行构建

能够编译 JDK 的环境,一般可以直接编译 jtreg。

git clone https://github.com/openjdk/jtreg.git
cd jtreg
bash make/build.sh

执行脚本,最后看到打包 jtreg.zip 步骤,就是构建成功了。

[build.sh][INFO] CYGWIN_OR_MSYS=0
[build.sh][INFO] JAVA_HOME: /Users/wuweijie/Library/Java/JavaVirtualMachines/temurin-17.0.7/Contents/Home
[build.sh][INFO] Downloading https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.8-bin.zip to /Users/wuweijie/projects/jtreg/make/../build/deps/apache-ant-1.10.8-bin.zip
[build.sh][INFO] Unpacking /Users/wuweijie/projects/jtreg/make/../build/deps/apache-ant-1.10.8-bin.zip in /Users/wuweijie/projects/jtreg/make/../build/deps/ant
[build.sh][INFO] ANT: /Users/wuweijie/projects/jtreg/make/../build/deps/ant/apache-ant-1.10.8/bin/ant
# 省略过程日志
cd /Users/wuweijie/projects/jtreg/build/images; /usr/bin/zip -rq /Users/wuweijie/projects/jtreg/build/images/jtreg.zip jtreg

构建好的 jtreg 在目录 build/images/jtreg 中。

方式二:下载第三方构建

Adoptium 提供了构建好的 jtreg

获取并构建 GoogleTest

自行克隆编译,可以使用 cmake:

git clone https://github.com/google/googletest.git -b v1.13.0
cd googletest
cmake .
make

日志输出如下:

wuweijie at wuweijies-MacBook-Air in ~/projects/googletest on v1.13.0
 ± cmake .
-- The C compiler identification is AppleClang 14.0.3.14030022
-- The CXX compiler identification is AppleClang 14.0.3.14030022
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Python: /opt/homebrew/Frameworks/Python.framework/Versions/3.11/bin/python3.11 (found version "3.11.3") found components: Interpreter 
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE  
-- Configuring done (1.2s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/wuweijie/projects/googletest
wuweijie at wuweijies-MacBook-Air in ~/projects/googletest on v1.13.0!
 ± make
[ 12%] Building CXX object googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
[ 25%] Linking CXX static library ../lib/libgtest.a
[ 25%] Built target gtest
[ 37%] Building CXX object googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.o
[ 50%] Linking CXX static library ../lib/libgmock.a
[ 50%] Built target gmock
[ 62%] Building CXX object googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.o
[ 75%] Linking CXX static library ../lib/libgmock_main.a
[ 75%] Built target gmock_main
[ 87%] Building CXX object googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
[100%] Linking CXX static library ../lib/libgtest_main.a
[100%] Built target gtest_main

编译产物在 lib 目录下。

OpenJDK configure 指定 jtreg 与 gtest

  • jtreg 可以通过 --with-jtreg 指定路径,路径为 jtreg 构建产物的目录。
  • GoogleTest 可以通过 --with-gtest 指定路径,路径为 GoogleTest 仓库跟目录。

例如:

bash configure --with-jtreg=/Users/wuweijie/projects/jtreg/build/images/jtreg --with-gtest=/Users/wuweijie/projects/googletest

执行 configure 的时候,日志中出现以下内容即代表 jtreg / googletest 已经被识别到。

checking for jtreg test harness... /Users/wuweijie/projects/jtreg/build/images/jtreg
checking jtreg version number... 7.4-dev
checking for gtest... /Users/wuweijie/projects/googletest

构建 OpenJDK

环境准备好了,就执行编译。

make images

编译结束后,就可以执行测试了。

运行测试

JDK 的测试分了 4 个层次:

  • tier1:最基本的测试层次。tier1 中的测试都经过精心挑选和优化,快速、稳定。 第一层中的测试失败通常会快速跟进,要么修复,要么将相关测试添加到问题列表中。GitHub Actions 中跑的就是 tier1 的测试
  • tier2:这个测试层次涵盖了更多的领域。 除其他外,这些测试包含运行时间太长而无法在第 1 层运行的测试,或者可能需要特殊配置的测试,或者不太稳定的测试,或者涵盖更广泛的非核心 JVM 和 JDK 功能/组件(例如 XML)。
  • tier3:此测试组包括压力更大的测试、先前层未涵盖的极端情况的测试,以及需要 GUI 的测试。
  • tier4:此测试组包括之前各层未涵盖的所有其他测试。 例如,它包括适用于 Hotspot 的 vmTestbase 套件,即使在超多核高性能环境上也可能需要运行多个小时。

对于 JDK 核心功能的验证,我们运行 tier1 就足够了。tier1 也是开发人员日常运行最多的测试。

make run-test-tier1

虽然是最低的测试层次,但在我的 Apple M1 环境也运行了好久,可能有一个半小时左右。测试运行完毕后,会输出统计信息。详细的测试记录在 build/macosx-aarch64-server-fastdebug/test-results 目录内。

Report written to /Users/wuweijie/projects/jdk/build/macosx-aarch64-server-fastdebug/test-results/jtreg_test_lib_test_tier1/html/report.html
Results written to /Users/wuweijie/projects/jdk/build/macosx-aarch64-server-fastdebug/test-support/jtreg_test_lib_test_tier1
Finished running test 'jtreg:test/lib-test:tier1'
Test report is stored in build/macosx-aarch64-server-fastdebug/test-results/jtreg_test_lib_test_tier1

==============================
Test summary
==============================
   TEST                                              TOTAL  PASS  FAIL ERROR   
   jtreg:test/hotspot/jtreg:tier1                     2376  2376     0     0   
   jtreg:test/jdk:tier1                               2380  2380     0     0   
   jtreg:test/langtools:tier1                         4407  4407     0     0   
   jtreg:test/jaxp:tier1                                 0     0     0     0   
   jtreg:test/lib-test:tier1                            30    30     0     0   
==============================
TEST SUCCESS

Finished building target 'run-test-tier1' in configuration 'macosx-aarch64-server-fastdebug'

以上就是对 OpenJDK 运行回归测试的简要介绍。

猜你喜欢

转载自blog.csdn.net/wu_weijie/article/details/132008877