このプロジェクトはRstestを使用してテストを行っています。
# 全テストを実行
pnpm test:run
# ウォッチモードでテストを実行(開発時に便利)
pnpm test
# UIモードでテストを実行
pnpm test:ui
# カバレッジレポートを生成
pnpm test:coverage基本的なコンポーネントの機能をテストします:
- レンダリング: コンポーネントが正しくレンダリングされるか
- Props: 各プロパティが正しく動作するか
- イベント:
ready,update,change,destroyなどのイベントが正しく発火するか - V-Model: 双方向バインディングが正しく動作するか
- スロット: スロットコンテンツが正しく表示されるか
- 公開メソッド:
getRange(),setCursor()などのメソッドが正しく動作するか
サーバーサイドレンダリング環境での動作をテストします:
- サーバーサイドレンダリング: SSR環境でエラーなくレンダリングされるか
- 安全なメソッド呼び出し:
viewが未初期化でもメソッドがエラーを投げないか - クライアントサイドハイドレーション: ブラウザでの初期化が正しく行われるか
- グレースフルデグラデーション: 機能が段階的に提供されるか
- メモリリーク防止: コンポーネントが正しくクリーンアップされるか
新しい機能を追加する場合は、対応するテストも追加してください:
import { describe, it, expect } from "@rstest/core";
import { mount } from "@vue/test-utils";
import CodeMirror from "@/components/CodeMirror";
describe("New Feature", () => {
it("should work correctly", async () => {
const wrapper = mount(CodeMirror, {
props: {
modelValue: "test",
// 新機能のprops
},
});
// テストロジック
expect(wrapper.exists()).toBe(true);
});
});- テストランナー: Vitest
- DOM環境: happy-dom(軽量で高速)
- Vueテストユーティリティ: @vue/test-utils
- アサーション: Vitest標準のexpect API
カバレッジレポートは以下を除外しています:
node_modules/src-docs/(ドキュメントサイト)dist/(ビルド出力)**/*.d.ts(型定義ファイル)**/*.config.*(設定ファイル)src/Meta.ts(自動生成ファイル)src/helpers/h-demi.ts(Vue 2/3互換レイヤー)
各テストは他のテストに依存しないようにしてください。
beforeEach(() => {
// 各テストの前にクリーンアップ
document.body.innerHTML = "";
});コンポーネントのライフサイクルを待つためにnextTick()を使用してください。
await nextTick();
await nextTick(); // onMountedを待つテスト後はコンポーネントをアンマウントしてください。
wrapper.unmount();テストは何をテストしているかが明確になるようにしてください。
// 良い例
expect(wrapper.props("readonly")).toBe(true);
// 避けるべき例
expect(wrapper.props("readonly")).toBeTruthy();長時間かかるテストにはタイムアウトを設定できます:
it("long running test", { timeout: 10000 }, async () => {
// テストコード
});attachToオプションを使用してDOMに直接マウントしてください:
const wrapper = mount(CodeMirror, {
props: { modelValue: "test" },
attachTo: document.body,
});
// 忘れずにクリーンアップ
wrapper.unmount();テスト後に適切にクリーンアップされているか確認してください:
afterEach(() => {
// 必要に応じてグローバルな状態をリセット
});GitHub ActionsなどのCI環境でテストを実行する場合は、pnpm test:runを使用してください。これはウォッチモードなしで一度だけテストを実行します。
- name: Run tests
run: pnpm test:run