基于 Polyglot API 的测试兼容性工具包

测试兼容性工具包 (TCK) 是一系列测试,用于验证 TruffleLanguage 的互操作性和检测能力。TCK 基于 org.graalvm.polyglot API。

添加语言 #

要测试您的语言,请实现 LanguageProviderLanguageProviders 使用 java.util.ServiceLoader 加载,因此您需要将您的实现注册到 META-INF/services/org.graalvm.polyglot.tck.LanguageProvider 文件中。LanguageProvider 应该提供语言数据类型、语言表达式(运算符)和语言控制流语句,这些都表示为返回数据类型或执行运算符(语句)的函数。为了允许组合返回的函数,必须使用 Snippet.Builder 为它们分配参数和返回类型。LanguageProvider 还应提供简单但具有代表性的脚本,TCK 可以使用这些脚本来测试检测。

使用 mx 运行 TCK 测试 #

这些测试使用 mx unittest 执行。运行测试时,将使用主套件和依赖套件中的所有 LanguageProvidertruffle 套件提供了 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 numberbig 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 工件中的测试。这可以通过在以下代码片段中实现项目的 pom.xml 文件部分

<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

联系我们