- 適用於 JDK 23 的 GraalVM (最新版)
- 適用於 JDK 24 的 GraalVM (搶先體驗版)
- 適用於 JDK 21 的 GraalVM
- 適用於 JDK 17 的 GraalVM
- 封存
- 開發版本
- Truffle 語言實作框架
- Truffle 分支檢測
- 動態物件模型
- 靜態物件模型
- 用於直譯器程式碼的主機最佳化
- Truffle 的函式內嵌方法
- 分析 Truffle 直譯器
- Truffle Interop 2.0
- 語言實作
- 使用 Truffle 實作新語言
- Truffle 語言和工具遷移至 Java 模組
- Truffle 原生函式介面
- 最佳化 Truffle 直譯器
- 選項
- 堆疊上替換 (On-Stack Replacement)
- Truffle 字串指南
- 特殊化直方圖
- 測試 DSL 特殊化
- 基於多語言 API 的 TCK
- Truffle 的編譯佇列方法
- Truffle 函式庫指南
- Truffle AOT 概觀
- Truffle AOT 編譯
- 輔助引擎快取
- Truffle 語言安全點教學
- 單態化 (Monomorphization)
- 分割演算法
- 單態化使用案例
- 將多型特殊化回報給執行階段
基於多語言 API 的測試相容性套件
測試相容性套件 (TCK) 是一組測試,用於驗證 TruffleLanguage 的互通性和檢測。TCK 基於 org.graalvm.polyglot
API。
新增語言 #
若要測試您的語言,請實作 LanguageProvider。 LanguageProvider
會使用 java.util.ServiceLoader
載入,因此您需要在 META-INF/services/org.graalvm.polyglot.tck.LanguageProvider
檔案中註冊您的實作。 LanguageProvider
應提供以函式形式表示的語言資料類型、語言運算式 (運算子) 和語言控制流程陳述式,這些函式會傳回資料類型或執行運算子 (陳述式)。為了允許組合傳回的函式,必須使用 Snippet.Builder 將參數和傳回類型指派給它們。 LanguageProvider
也應該提供簡單但具代表性的腳本,TCK 可以使用這些腳本來測試檢測。
使用 mx
執行 TCK 測試 #
這些測試是使用 mx unitest
執行的。執行測試時,會使用主要套件和相依套件中的所有 LanguageProvider
。 truffle
套件提供 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 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