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

测试兼容性工具包(TCK)是一组测试,用于验证 TruffleLanguage 的互操作性和仪表。TCK 基于 org.graalvm.polyglot API。

添加语言 #

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

使用 mx 运行 TCK 测试 #

测试使用 mx unitest 执行。运行测试时,将使用主要套件和依赖套件中的所有 LanguageProvidertruffle 套件提供 java-host LanguageProvider,创建 Java 数据类型和 代理 来测试 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 + 运算符与 SimpleLanguage numberbig number 的测试,请使用

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

联系我们