JEP 233:自动生成运行时编译器测试
概括
开发一个工具,通过自动生成测试用例来测试运行时编译器。
目标
-
生成的测试应该
jtreg
兼容 -
该工具应该在最终结果的语言(Java 源代码、Java 字节码)、语言结构的使用、控制流和表达式复杂性等方面是可配置的。
-
测试应该随机但可重复地生成
动机
随着我们添加新平台、利用新 CPU 指令、引入新优化以及对运行时编译器进行其他增强,通过直接、有针对性的测试来有效测试编译器变得越来越不可行。
描述
该工具将随机生成语法和语义正确的 Java 源代码或字节代码,必要时对其进行编译,以解释 ( -Xint
) 和编译 ( -Xcomp
) 模式运行它,并验证结果。
该工具将自动工作,无需人工干预。生成的测试将在合理的时间内覆盖尽可能多的组合。
Java 源代码编译器javac
并不使用所有 Java 字节码,因此仅生成 Java 源代码会留下一些字节码未被覆盖。为所有类型的测试仅生成字节代码将是一项更加复杂的任务,因此我们将 采用同时生成 Java 源代码和字节代码的混合方法。
对于嵌入式平台来说,在测试执行期间编译源代码是有问题的,因为完整的 JDK 可能不可用,因此该工具将提供一种预编译源代码测试的方法。
生成的测试用例将包括复杂的表达式和控制流图,并将利用内在函数、浮点运算、try-catch-finally
构造等。将有一种方法来调整工具的配置。
该工具将随机生成测试,但为了可重复性,它将报告其随机化种子并接受此类种子,以便重播生成的测试的完全相同的序列。
该工具的源代码将放置在该hotspot/test/testlibrary/jit-tester
目录中。可以通过工具的 makefile 中提供的目标生成测试。测试生成的结果是一个完整的jtreg
测试套件,可以从相同的 makefile 或jtreg
直接通过运行。工具 makefile 将不会集成到 HotSpot/JDK 构建基础架构中。
鉴于测试生成过程需要大量时间,生成和运行这些测试预计不会成为预集成测试的一部分。然而,定期运行预生成的测试(用于可靠性测试)和新生成的测试以获得更好的代码覆盖率是有意义的。生成的发现错误的测试应作为常规回归测试集成到适当的测试套件中,并以与其他回归测试相同的方式运行。
备择方案
在编译模式下运行现有测试可以被视为该工具的可行替代方案。这种方法有几个缺点:
-
它不保证覆盖所有语言结构和不同优化的组合
-
测试失败并不总是意味着运行时编译器存在缺陷,需要额外的工程师时间进行调查/重现
-
由于某些测试可以是运行时编译器特定的测试,因此它们可能会强制运行时编译本身和/或需要特定的运行时编译器状态。因此显式编译模式可能会改变测试行为并导致误报结果
-
为测试失败创建回归测试相对困难
由于这些缺点,这种方法不能完全取代所提出的工具。