基於多語言 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 資料類型和 Proxy 來測試 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

與我們聯絡