评估 OpenJDK 发行版时,需要考虑的因素有很多。最基本的一个因素是发行版是否通过了 TCK 测试。
TCK 测试是一种验证发行版是否符合 Java SE 规范的方法,该规范由 JCP (Java Community Process) 通过单独的 JSR(Java 规范提案)所定义。这篇博文探讨了 TCK 合规的含义及其重要性。
什么是 TCK 测试?
如上所述,TCK 这种方法可用于验证所使用的发行版是否符合 Java SE 规范。
TCK 包含超过 100,000 个单独测试,具体取决于所用的 Java 版本。例如,Java 8 包含 126,000 个测试,Java 11 则包含约 139,000 个测试。TCK 包含一组全面的测试用例,每个测试用例都涵盖 Java 规范的各个方面,包括 API、库、语言功能和其他重要组件。例如,TCK 会确保 OpenJDK 的二进制构建满足 Java SE 指定版本(例如 Java 17)的各个 JSR 的所有规范。
对于发行版提供商而言,TCK 合规性可以在合作伙伴和客户中建立技术信誉和生态系统支持。TCK 合规性能够让合作伙伴和客户保证互操作性、推进标准化、获得商业用途认证,并满足法律或业务要求。TCK 测试让提供商可以使某个实现成为“Java”实现或“符合 Java-SE 标准”。使用已通过 TCK 测试的 OpenJDK 发行版,就可以为最终用户提供第三方专利授权。
TCK 测试可以验证性能吗?
TCK 测试不执行性能测试(吞吐量、启动、预热、延迟、内存占用等情况)。但这并不代表对所有发行版的要求都是相同的。 就像黑盒应用程序测试一样,TCK 会测试功能(JDK 可执行的任务),但不会测试任务完成的方式。TCK 测试通过跨平台测试来确保产品质量,以符合发行版提供商支持的所有 Java 配置的 Java 标准(Java 语言、Java 虚拟机和 Java API)。
我们对 Azul Platform Prime 在多种背景下进行了 TCK 测试,而测试结果并未显示:与常规 OpenJDK 相比,该产品可提供更低的延迟和更高的吞吐量(事实上均可以)。应用程序在这两方面会表现出相同的功能行为,但执行方式却不同。TCK 测试结果不会显示性能上的差异。
通过 TCK 测试的门槛为何?
Azul 更新和发行的 1,100 多个二进制文件全部通过了 TCK 测试。如果某个二进制文件未通过 TCK,我们不会发布该文件或称其达到 GA(可供正式发布)质量。
发行版必须通过所有 TCK 测试才能证明它符合 Java SE 规范。因此,只有通过测试或不通过测试这两种结果。Java SE 规范不存在“部分”通过或合规的情况。
终端用户如何验证 JDK/JVM 发行版是否真的通过了 TCK 测试?
现在没有正式的方法来进行验证。各个提供商会对从 Oracle 获取的 TCK 测试套件授予许可,并在其发行版上运行 TCK 测试套件。请要求提供商确认他们已经运行(并通过)所有 TCK 测试。
注:Azul 可以为其发行的每个二进制文件提供证书,以确认其通过了与指定 Java SE 版本相关的所有 TCK 测试。
TCK 合规性的有效期是多久?
每个发行版在发布之前只需通过一次 TCK。若发行版更改了任何内容,都必须重新运行所有 TCK 测试来重新获得认证。对于包含 Azul 提供的 1100 多个二进制文件的指定季度版本,需要进行的 TCK 测试会非常多!
TCK 测试需要多长时间?
所需时间从几个小时到几天不等,不过平均需要一天左右才能完成完整的 TCK 测试周期。具体取决于发行版提供商运行测试所使用的硬件。
此外,还会有一些手动测试。例如,必须验证打印以及录制和播放声音等功能。不会进行代码分析,只会在发行版的二进制文件上运行测试,因为如前文所述,只需验证发行版通过还是不通过测试。
TCK 测试会进行更新,以反映变化并确保持续的合规性测试,因此,要遵守最新的 TCK 标准和规范会十分困难。请再三检查您正在使用的 JDK/JVM 发行版是否一直在使用且通过了最新的 TCK 测试。
每个发行版都要通过 TCK 测试吗?
Oracle 可根据 Oracle TCK 社区许可协议 (OCTLA) 免费提供 TCK。TCK 测试只能用于 OpenJDK 发行版或从 OpenJDK“实质”派生的发行版。并非每个 OpenJDK 发行版都会经过 TCK 测试,在选择发行版时务必要了解这一点。
Azul 在 TCK 合规性中主要发挥什么作用?
Azul 积极参与 Java Community Process (JCP) 活动。该组织负责开发和维护 Java 标准。我们使用 OpenJDK 社区 TCK 来验证每个 Azul JDK 二进制文件是否符合 Java SE 规范。这涉及到要在可控和可复制的测试环境中针对我们的 JDK 执行 TCK 测试套件。
TCK 测试有助于识别指定 JDK 中的任何偏差或不合规行为,以便我们可以进行必要的调整,从而确保兼容性。在自动化构建和部署过程中运行 TCK 测试有助于及早发现问题,并确保每个代码的更改都能得到正确验证。此验证过程还可以最大程度地降低兼容性问题的风险,提升软件质量并提高客户满意度。
结语
所有 Java 运行时 (JDK/JVM) 的行为方式必须相同,以便应用程序能产生相同的结果,无论您使用的是哪种 OpenJDK。为了实现这一点,每个发行版都必须符合 Java SE 规范,该规范由 Java Community Process (JCP) 的相关 Java 规范提案 (JSR) 定义。要验证是否符合规范,发行版必须通过 Java 技术兼容性工具包 (TCK) 的所有测试。
虽然大多数发行版都基于 OpenJDK,但这并不意味着所有发行版都是以相同的方式来实现。Azul 提供了两个符合 TCK 规范但又完全不同的发行版:
- Azul Zulu 版本的 OpenJDK(又名 Zulu)与原版 OpenJDK 几乎完全相同,是我们的 Azul Platform Core 产品的基础。
- Azul Zulu Prime 版本的 OpenJDK(又名 Prime)基于 OpenJDK,具有许多重要的增强功能,是 Azul Platform Prime 产品的基础
无论您是使用原版 OpenJDK 还是其他发行版,我们都强烈建议您只使用符合 TCK 标准的发行版,以确保 Java 应用程序和基础架构的稳定性和兼容性。
您可以在以下链接中了解更多信息:
https://openjdk.org/groups/conformance/JckAccess/
https://openjdk.org/groups/conformance/JckAccess/jck-access.html