機能テスト
概要
OpenRefine の Web インターフェースは Cypress でテストしています。Cypress は実際のブラウザーを使ってアサーションを行うため、実ユーザーと同じ操作感でテストできます。バックエンド(サーバー)も含めて検証する E2E(End-to-End)テスト です。
Cypress テストの実行方法は 2 つあります。
- Cypress Test Runner(開発モード)
- コマンドライン(CI/CD モード)
テストを作成・調整する際は Test Runner で十分です。CI/CD モードは主に GitHub Actions などの自動実行で利用されます。
Cypress の概要
Cypress はブラウザー内で動作し、内部的に Node.js を使用します。これは Selenium などとの大きな違いです。
Cypress ドキュメントより:
テストコードは ブラウザー内で評価されます。Node やサーバー側の言語ではありません。サポートする言語は Web の言語、すなわち JavaScript だけです。
おすすめの読み物:
一般的な Cypress テストの流れ:
- ブラウザーを起動(
yarn run cypress open) - URL にアクセス
- ユーザーアクションをトリガー
- セレクターで DOM のテキストや要素を検証
はじめ方
初めて Cypress を使う場合は、以下の資料で仕組みを把握しておくとスムーズです。
1. Cypress のインストール
必要なもの:
- Node.js 20.x/22.x 以上
- Yarn または NPM
- Unix/Linux シェル、または Windows コマンドライン
依存関係を含めてインストール:
cd ./main/tests/cypress
yarn install
2. テストランナーを起動
テストランナーは OpenRefine がローカルで起動していることを前提にします(テスト側で起動・再起動はしません)。
リポジトリルートで OpenRefine を起動:
cd ../../..
./refine
続いて Cypress を起動:
yarn --cwd ./main/tests/cypress run cypress open
3. 既存テストの実行
Cypress Launchpad が開いたら「E2E Testing」を選び、実行したいテストをクリックします。複数選択も可能です。
4. 最初のテストを追加
main/tests/cypress/cypress/e2eにtest.spec.jsを作成- すぐにリストへ反映されます
- テスト名をクリックし、コードを追加
テスト技術ドキュメント
代表的なテスト
it('Ensure cells are blanked down', function () {
cy.loadAndVisitProject('food.mini');
cy.get('.viewpanel-sorting a').contains('Sort').click();
cy.get('.viewpanel').should('to.contain', 'Something');
});
冒頭の説明文(Ensure cells are blanked down)でテスト内容を明示します。行頭の cy. が Cypress のコマンドです。
例:
cy.get('a.my-class'):<a class="my-class" />要素を取得cy.click(): 要素をクリックcy.should('to.contains', 'my text'): アサーション
OpenRefine 独自のヘルパーもいくつか用意しています。
cy.loadAndVisitProject: 指定データで新規プロジェクトを作成cy.assertCellEquals: セル内容を検証
詳細は後述の「テストユーティリティ」を参照してください。
テストのガイドライン
cy.waitは最後の手段(基本的にアンチパターン)- テスト同士は独立させ、1 つの機能に集中する
- 毎回新しい OpenRefine プロジェクトで開始する
- ファイル名は UI 上の位置に合わせる
- Facet など hover で表示される要素は
.invoke('trigger', 'mouseover')を利用(jQuery を使用) - jQuery メソッドをアサートしたい場合も
.invokeが便利
テストユーティリティ
main/tests/cypress/cypress/support/commands.js に共通処理が定義されています。
最重要なのは loadAndVisitProject で、パラメータに応じて新規プロジェクトを作成します。
- 任意の配列を渡す: 最初の行が列名、それ以降がデータ。
特定のグリッドを明示的に用意したい場合のみ使用してください。
const fixture = [
['Column A', 'Column B', 'Column C'],
['0A', '0B', '0C'],
['1A', '1B', '1C'],
['2A', '2B', '2C'],
];
cy.loadAndVisitProject(fixture); - 既存フィクスチャを渡す:
food.mini(2 行・少列)、food.small(数百行)。基本的にはfood.miniを使い、特別な理由がある場合のみfood.smallを選びます。 フィクスチャはmain/tests/cypress/cypress/fixturesにあります。
対応ブラウザー
利用できるブラウザーは OS にインストールされているものに依存します。対応一覧は Cypress ドキュメント を参照してください。
ディレクトリ構成
テストは main/tests/cypress/cypress 配下にあります。
/fixtures: CSV や OpenRefine プロジェクト/integration: テストコード(※ Cypress v10 以降はe2eフォルダを使用)/plugins: プロジェクト用のカスタムプラグイン/screenshots,/videos: 実行記録(Git 無視)/support: アサーションや操作の共通ライブラリ
設定
実行時の設定は環境変数で行えます(OS レベルまたはコマンドライン)。主なもの:
OPENREFINE_URL: 接続先(デフォルトhttp://localhost:3333)DISABLE_PROJECT_CLEANUP: 1 にするとテスト後のプロジェクト削除を無効化(デフォルト 0)
詳しくは Cypress の環境変数ガイド を参照してください。簡単な方法は次の通りです。
cypress.env.json を使う
このファイルは Git で無視され、ローカル設定に利用できます。
{
"OPENREFINE_URL": "http://localhost:3334"
}
コマンドラインで上書き
実行時に CYPRESS_ プレフィックス付きで渡します。
CYPRESS_OPENREFINE_URL=http://localhost:3334 \
yarn --cwd ./main/tests/cypress run cypress open