テスト

本プラグインは、Jest または Vitest を使用する ReScript プロジェクト向けに統合テスト実行機能を提供します。テストはコンパイル済みの JavaScript 出力に対して実行され、結果は IntelliJ の標準テストランナー UI に表示されます。ファイルパスは元の .res ソースファイルにマッピングされます。

サポートされるテストフレームワーク

Native

フレームワーク

検出方法

デフォルトコマンド

Jest

package.json の dependencies に jest が存在

npx jest

Vitest

package.json の dependencies に vitest が存在

npx vitest run

Custom

手動設定

ユーザー定義

プラグインはプロジェクトが使用しているフレームワークを自動的に検出します。両方が存在する場合は、Vitest が優先されます。

組み込みのフレームワーク検出により、プラグインの手動設定なしですぐにテストを実行できます — お好みのテストフレームワークをインストールするだけで、残りはプラグインが処理します。

Jest の設定

ReScript で Jest を使用するには、以下のセットアップが必要です:

1. 依存関係のインストール:

{
  "devDependencies": {
    "jest": "^29.0.0",
    "jest-teamcity": "^1.9.0",
    "@glennsl/rescript-jest": "^0.11.0"
  }
}

jest-teamcity レポーターは、プラグインがテスト結果を解析してテストツリー UI に表示するために必要です。これがない場合、テスト出力は構造化されないプレーンなコンソールテキストとして表示されます。

2. ReScript 向けの Jest 設定:

コンパイル済み JavaScript 出力を参照する jest.config.js(または jest.config.ts)を作成します:

{
  "testMatch": ["**/lib/js/test/**/*_test.bs.js", "**/lib/js/test/**/*Test.bs.js"],
  "moduleDirectories": ["node_modules"],
  "transform": {}
}

Jest 設定のポイント:

  • testMatch -- .res ソースファイルではなく、lib/js/ ディレクトリ内のコンパイル済み .bs.js ファイルを指定します。Jest は JavaScript を実行するため、コンパイル済みの出力が必要です。

  • transform -- {} (空のオブジェクト) に設定して、すべてのトランスフォームを無効にします。ReScript はすでに JavaScript にコンパイルされているため、追加のトランスパイルは不要です。

  • moduleDirectories -- 依存関係の解決のために node_modules が含まれていることを確認してください。

lib/ 配下の正確なパスは rescript.json の設定に依存します。一般的なパターンは以下の通りです:

rescript.json の suffix 設定

コンパイル出力パス

".bs.js" (デフォルト)

lib/js/src/MyModule.bs.js

".mjs"

lib/js/src/MyModule.mjs

".js"

lib/js/src/MyModule.js

Vitest の設定

ReScript で Vitest を使用するには、以下のセットアップが必要です:

1. 依存関係のインストール:

{
  "devDependencies": {
    "vitest": "^1.0.0"
  }
}

Vitest には TeamCity レポーターが組み込まれているため、追加のレポーターパッケージは不要です。

2. ReScript 向けの Vitest 設定:

vitest.config.ts(または vitest.config.js)を作成します:

{
  "test": {
    "include": ["lib/js/test/**/*_test.bs.js", "lib/js/test/**/*Test.bs.js"],
    "passWithNoTests": true
  }
}

Vitest 設定のポイント:

  • include -- Jest と同様に、lib/js/ 内のコンパイル済み JavaScript ファイルを指定します。

  • passWithNoTests -- テストが一致しない場合(例: 初期セットアップ時)に失敗を回避するために推奨されます。

  • Vitest は run フラグ付き(npx vitest run)で実行され、ウォッチモードに入らずにテストを一度実行して終了します。

テストの実行

Native

エディタからの実行

  1. ReScript テストファイル(.res)を開きます

  2. テスト関数を右クリックします

  3. Run を選択してテストを実行します

実行構成からの実行

  1. RunEdit Configurations+ReScript Test

  2. テストフレームワーク(Jest、Vitest、または Custom)を選択します

  3. 必要に応じてテストファイルパスとテスト名フィルターを設定します

  4. 作業ディレクトリを設定します(デフォルトはプロジェクトルート)

  5. Run をクリックします

設定オプション

オプション

説明

Framework

Jest、Vitest、または Custom

Working directory

package.json が配置されているプロジェクトルート

Test file path

特定のテストファイルへのパス(空にするとすべてのテストを実行)

Test name

名前でテストをフィルタリング(-t フラグを使用)

Additional arguments

テストランナーに渡す追加の CLI フラグ

コンテキストメニューからの実行

Project パネルでテストファイルを右クリックし、Run を選択します。ファイル名がテスト命名規則に一致する場合、実行構成が自動的に作成されます。

テストを実行する複数の方法 — エディタ、Project パネル、Run 構成から — により、単一テストでもスイート全体でも、ワークフローに合ったアプローチを選択できます。

テストの自動検出

Native

プラグインはテストファイルとフレームワークの検出に 2 つのメカニズムを使用します:

フレームワークの検出

RescriptTestFrameworkDetector は以下を調べることで、プロジェクトが使用しているテストフレームワークを特定します:

  1. package.json の dependencies -- dependenciesdevDependencies の両方で vitest または jest を確認します。vitest が見つかった場合、jest より優先されます。

  2. 設定ファイル -- package.json での検出に失敗した場合、プロジェクトルートでフレームワーク固有の設定ファイルを探します:

設定ファイル

フレームワーク

vitest.config.ts

Vitest

vitest.config.js

Vitest

vitest.config.mts

Vitest

jest.config.js

Jest

jest.config.ts

Jest

jest.config.mjs

Jest

テストファイルの検出

プラグインは命名規則に基づいてファイルをテストファイルとして自動的に認識します。.res または .resi ファイルは、ファイル名(拡張子を除く)が以下のいずれかのサフィックスで終わる場合にテストファイルとして扱われます:

  • _test (例: Math_test.res)

  • Test (例: MathTest.res)

  • _spec (例: Math_spec.res)

  • Spec (例: MathSpec.res)

このパターンに一致するファイルを右クリックすると、プラグインは検出されたフレームワークとファイルパスが事前入力された ReScript Test 実行構成を自動的に作成することを提案します。

テストフレームワークとテストファイルの自動検出により手動設定が不要になります — プラグインはテストセットアップを認識し、すぐに適切な実行オプションを提供します。

参考

実行とビルド では、ReScript プロジェクトのビルド用実行構成について説明しています。

テスト結果

Native

テスト結果は IntelliJ の標準テストランナー UI(SMTestRunner)に表示されます。

テストツリー構造

テスト結果パネルには階層的なツリーが表示されます:

  • Root -- テスト実行全体

    • Test Suite -- describe ブロック(またはテストファイル)に対応

      • Test Case -- 個別のテスト(test または it ブロック)

各ノードには以下が表示されます:

  • 合否インジケーター -- 成功したテストには緑のチェックマーク、失敗には赤のバツ印

  • テスト名 -- test() または it() の呼び出しで指定した名前文字列

  • 実行時間 -- 各テストの実行時間

  • 出力 -- テスト中にキャプチャされた標準出力/標準エラー出力

TeamCity レポーターの統合

プラグインは TeamCity 形式のレポーターを使用してテスト結果を構造化されたツリー UI に解析します:

  • Jest: jest-teamcity レポーターを使用します。プラグインは Jest のコマンドラインに --reporters=default --reporters=jest-teamcity を自動的に追加します。

  • Vitest: 組み込みの teamcity レポーターを使用します。プラグインは Vitest のコマンドラインに --reporter=default --reporter=teamcity を自動的に追加します。

default レポーターは TeamCity レポーターと併せて含まれており、人間が読みやすい出力がコンソールに引き続き表示されるようにしています。

ソースファイルへのナビゲーション

結果ツリーでテストをクリックすると、プラグインは対応するソースファイルにナビゲートします。RescriptTestLocator は以下の 3 つの戦略を使用してテストファイルの場所を解決します:

  1. 直接相対パス -- プロジェクトルートからの相対パスでファイルを検索します

  2. コンパイル済み JS パス変換 -- lib/js/src/MyTest.bs.js のようなパスを lib/js/(または lib/es6/lib/bs/)プレフィックスを除去し、.bs.js 拡張子を .res に置換することで src/MyTest.res に変換します

  3. 絶対パス -- ファイルシステムの絶対パスを直接解決します

このパスマッピングにより、テスト結果をクリックするとコンパイル済みの JavaScript ファイルではなく、元の .res ソースファイルが開かれます。

パス/フェイルインジケーターとソースファイルナビゲーションを備えた構造化テストツリーにより、ReScript テストがコンパイル済み JavaScript を通じて実行されても、ネイティブ JetBrains 言語プラグインと同じリッチなテスト体験を得られます。

動作の仕組み

  1. テストフレームワークのバインディング(例: @glennsl/rescript-jest)を使用して .res ファイルにテストを記述します

  2. ReScript コンパイラがテスト .res ファイルを lib/ フォルダ内の JavaScript にコンパイルします

  3. プラグインが TeamCity レポーターを含めて、コンパイル済みの .js ファイルを Jest または Vitest で実行します

  4. テスト出力が IntelliJ の SMTestRunner によって構造化されたテストツリーに解析されます

  5. テスト結果のファイルパスが元の .res ソースファイルにマッピングされます

// src/test/Math_test.res
open Jest

describe("Math utilities", () => {
  test("addition", () => {
    expect(MathUtils.add(1, 2))->toBe(3)
  })

  test("multiplication", () => {
    expect(MathUtils.multiply(3, 4))->toBe(12)
  })
})

プラグインは ReScript ソースファイルとコンパイル済み JavaScript テスト実行のギャップを埋め、テストインフラがコンパイルとパスマッピングを透過的に処理する間、完全に .res ファイルで作業できます。

トラブルシューティング

"Module not found" でテストが失敗する

原因: テストランナーの実行前に ReScript コンパイラがテストファイルをコンパイルしていません。

解決方法: テスト実行前に ReScript の Build を実行するか、Build (Watch) が実行中であることを確認してください。テストランナーはコンパイル済みの JavaScript を実行するため、.bs.js ファイルが lib/ ディレクトリに存在する必要があります。

# Compile first, then run tests
npx rescript build
npx jest

Tip

開発中は Build (Watch) 実行構成を常に実行しておきましょう。これにより、テスト実行時にコンパイル出力が常に最新の状態に保たれます。

テストツリーに構造化された結果ではなくプレーンテキストが表示される

原因: TeamCity レポーターがインストールされていないか、設定されていません。

解決方法:

  • Jest の場合: jest-teamcity を開発依存としてインストールします(npm install --save-dev jest-teamcity

  • Vitest の場合: 組み込みの TeamCity レポーターを含む Vitest 1.0 以降を使用していることを確認してください

プラグインはレポーターフラグを自動的に追加しますが、レポーターパッケージがプロジェクトにインストールされている必要があります。

パスマッピングの失敗(ソースにナビゲートできない)

原因: テストロケーターがコンパイル済みの .js ファイルに対応する .res ファイルを見つけることができません。

解決方法: プロジェクト構造が標準的な ReScript の規約に従っており、lib/js/ の出力が src/ ディレクトリ構造をミラーしていることを確認してください。パスコンバーターは以下のようなパターンを想定しています:

コンパイル済み JS パス

解決された .res パス

lib/js/src/MyTest.bs.js

src/MyTest.res

lib/es6/src/MyTest.mjs

src/MyTest.res

lib/js/test/Math_test.bs.js

test/Math_test.res

rescript.json が非標準の出力ディレクトリを使用している場合、パスマッピングが正しく機能しない可能性があります。

"package.json not found" エラー

原因: 実行構成の作業ディレクトリに package.json ファイルが含まれていません。

解決方法: 実行構成の Working directory をプロジェクトルート(package.jsonrescript.json を含むディレクトリ)に設定してください。通常は自動検出されますが、モノレポ構成では手動調整が必要な場合があります。

フレームワークが検出されない

原因: テストフレームワークが package.json の dependencies に記載されていません。

解決方法: package.jsondependencies または devDependenciesjest または vitest が記載されていることを確認してください。または、実行構成でフレームワークを手動で選択するか、ユーザー定義コマンドで Custom フレームワークオプションを使用してください。

注釈

テスト実行には、ReScript プロジェクトがテストフレームワークで適切に設定され、ReScript コンパイラがテストファイルをすでにコンパイルしている必要があります。プラグインはテスト実行前に ReScript ビルドを自動的にトリガーしません。

これらのトラブルシューティングのヒントは最も一般的なテストセットアップの問題に対処し、修正が通常は依存関係の欠如や古いコンパイル結果である場合にビルドパイプラインのデバッグを省けます。