- 适用于 JDK 24 的 GraalVM(最新)
- 适用于 JDK 25 的 GraalVM(早期访问)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发构建
- Truffle 语言实现框架
- Truffle 分支插桩
- 动态对象模型
- 静态对象模型
- 解释器代码的主机优化
- Truffle 函数内联方法
- 分析 Truffle 解释器
- Truffle 互操作 2.0
- 语言实现
- 使用 Truffle 实现新语言
- Truffle 语言和工具迁移到 Java 模块
- Truffle 原生函数接口
- 优化 Truffle 解释器
- 选项
- 栈上替换
- Truffle 字符串指南
- 特化直方图
- 测试 DSL 特化
- 基于多语言 API 的 TCK
- Truffle 编译队列方法
- Truffle 库指南
- Truffle AOT 概述
- Truffle AOT 编译
- 辅助引擎缓存
- Truffle 语言安全点教程
- 单态化
- 拆分算法
- 单态化用例
- 向运行时报告多态特化
基于 Polyglot API 的测试兼容性工具包
测试兼容性工具包 (TCK) 是一系列测试,用于验证 TruffleLanguage 的互操作性和检测能力。TCK 基于 org.graalvm.polyglot API。
添加语言 #
要测试您的语言,请实现 LanguageProvider。LanguageProviders 使用 java.util.ServiceLoader 加载,因此您需要将您的实现注册到 META-INF/services/org.graalvm.polyglot.tck.LanguageProvider 文件中。LanguageProvider 应该提供语言数据类型、语言表达式(运算符)和语言控制流语句,这些都表示为返回数据类型或执行运算符(语句)的函数。为了允许组合返回的函数,必须使用 Snippet.Builder 为它们分配参数和返回类型。LanguageProvider 还应提供简单但具有代表性的脚本,TCK 可以使用这些脚本来测试检测。
使用 mx 运行 TCK 测试 #
这些测试使用 mx unittest 执行。运行测试时,将使用主套件和依赖套件中的所有 LanguageProvider。truffle 套件提供了 java-host LanguageProvider,它创建 Java 数据类型和 代理 (Proxies) 以测试 Java 互操作性。
要仅运行 TCK 测试,请使用
mx unittest com.oracle.truffle.tck.tests
或者,直接使用
mx tck
要将 TCK 测试限制为测试特定语言,请使用 tck.language 属性。以下示例使用所有可用语言的数据类型测试 JavaScript
mx tck -Dtck.language=js
要将数据类型限制为特定语言,请使用 tck.values 属性。以下示例使用 Java 类型测试 JavaScript
mx tck -Dtck.values=java-host -Dtck.language=js
要运行单个测试,请指定完整的测试名称。例如,要使用 SimpleLanguage number 和 big number 运行 SimpleLanguage + 运算符的测试,请使用
mx tck 'ExpressionTest#testExpression[sl::+(sl::number, sl::number)]'
要在 GraalVM 上运行 TCK 测试,只需将 mx --java-home 指向 GraalVM 即可
mx --java-home=<path_to_graalvm> tck
要禁用输出和错误输出,请使用 tck.verbose 属性
mx tck -Dtck.verbose=false
要仅禁用特定测试的输出和错误输出,请使用 tck.{TestSimpleName}.verbose 属性
mx tck -Dtck.ErrorTypeTest.verbose=false
您还可以禁用除一个测试之外的所有测试的输出和错误输出
mx tck -Dtck.verbose=false -Dtck.ErrorTypeTest.verbose=true
使用 Apache Maven 运行 TCK 测试 #
Apache Maven 可用于执行 Truffle TCK 测试。首先,创建一个包含语言 TCK 提供程序的 Maven 模块(项目)。确保此模块对被测语言和 TCK 测试 org.graalvm.truffle:truffle-tck-tests 具有测试依赖项。配置 maven-surefire-plugin 以识别 org.graalvm.truffle:truffle-tck-tests 工件中的测试。这可以通过在以下代码片段中实现
<build>
    <plugins>
        [...]
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.1.2</version>
            <configuration>
                <dependenciesToScan>
                    <dependency>org.graalvm.truffle:truffle-tck-tests</dependency>
                </dependenciesToScan>
            </configuration>
        </plugin>
        [...]
    </plugins>
</build>
要在 TCK 执行中包含其他语言,请将其 TCK 提供程序添加为测试依赖项。例如,添加 org.graalvm.js:js-truffle-tck 将在测试过程中包含 JavaScript。您可以利用 SimpleLanguage TCK 提供程序的 pom.xml 作为入门模板。要测试运行时优化,请在运行 mvn package 之前将 JAVA_HOME 环境变量设置为 GraalVM 位置。
自定义 TCK 测试 #
要将 TCK 测试限制为测试特定语言,请使用 tck.language 属性。以下示例使用所有可用语言的数据类型测试 JavaScript。
<build>
    <plugins>
        [...]
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.1.2</version>
            <configuration>
                <argLine>
                    -Dtck.language=js
                </argLine>
                [...]
            </configuration>
        </plugin>
        [...]
    </plugins>
</build>
要将数据类型限制为特定语言,请使用 tck.values 属性。以下示例使用 Java 类型测试 JavaScript。
<build>
    <plugins>
        [...]
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.1.2</version>
            <configuration>
                <argLine>
                    -Dtck.values=java-host
                    -Dtck.language=js
                </argLine>
                [...]
            </configuration>
        </plugin>
        [...]
    </plugins>
</build>
要执行特定的 TCK 测试,您可以将测试参数与 -Dtest 选项一起使用。例如:mvn test -Dtest=ScriptTest