言語工学の実践
Vize は Vue ツールチェーンですが、コンパイラーと同じ障害モードがあり、構文の小さな変更により、 移動診断、コード生成、エディターの動作、パッケージ出力、パフォーマンスを同時に実行 時間。このページには、Vize が成熟したコンパイラーと型から採用した言語処理の実践が記録されています。 チェッカー リポジトリを作成し、それらを Vize 独自のフィクスチャ、スナップショット、パリティ テスト、ベンチマークにマッピングします。 そしてゲートを解放します。
ソース信号
| 出典 | 実践が観察されました | 翻訳をバイズ |
|---|---|---|
rust-lang/rust と rustc-dev-guide |
compiletest は UI テストをスイートごとにグループ化し、予想される出力をソース ケースの近くに保存し、リポジトリの不変条件に tidy を使用して、エコシステムとパフォーマンスの回帰を個別に追跡します。 |
コンパイラ向けの変更を最初にフィクスチャの変更として扱います。パーサー/コンパイラーの期待値を tests/fixtures および tests/expected に保持し、リポジトリの不変条件を tests/tooling/*.test.ts に保持します。 |
rustc エコシステムとパフォーマンスのテスト |
Crater、cargotest、大規模プロジェクト ビルダー、および Rustc-perf は、コンパイラの変更をマージする前または後に、広範な互換性とパフォーマンスのリスクを明示します。 | ユニット フィクスチャのみに依存するのではなく、広範な Vue セマンティクス、生成されたコード形状、またはホットパスの変更を現実世界のフィクスチャ、Vue パリティ マトリックス、PR ベンチマーク バジェットにエスカレーションします。 |
rust-fuzz/cargo-fuzz と libFuzzer |
カバレッジに基づくファズ ターゲットは、決定論的な回帰に変換する前に、任意のバイト入力を実行し、コーパスを永続化し、クラッシュ再現要因を最小限に抑えます。 | クラッシュ修正が完了したものとして処理される前に、ファズ パーサー、レクサー、CSS、式、テンプレート コンパイル境界が tests/fuzz から cargo +nightly fuzz run <target> に変更されます。 |
| Linux カーネル テスト | KUnit は小さなホワイト ボックス ユニットをカバーし、kselftest はユーザーに表示されるシステム インターフェイスをカバーし、KCOV はカバレッジ ガイド付きファジングをフィードし、perf stat は反復可能なカウンターとタイミング ステータスをキャプチャします。 |
CLI/ワークスペース統合チェックから小さなクレートレベルのチェックを分割し、任意の入力に対してカバレッジ/ファジングを使用し、ホット パスが移動したときにプロファイルまたはベンチマーク ステータスを添付します。 |
| クロムテストとCQ | クロム層の密閉ユニット、ブラウザ、Web、テレメトリ、およびファザーのテスト。 CQ/trybot は高価なレーンや不安定なレーンを明示し、ClusterFuzz は発見されたファズ ターゲットを大規模に実行します。 | Vize チェックをデフォルトで密閉状態に保ち、ブラウザ/アプリの動作を現実世界のフィクスチャにエスカレートし、テレメトリのようなステータスに PR ベンチマーク バジェットを使用し、トリアージのためにファズ再現ツールを保持します。 |
| V8 テスト および 機能のリリース | V8 は、mjsunit や Test262 などのエンジン スイートを実行し、レビュー後にのみ予期されるファイルを再生成し、tools/run_perf.py とベンチマーク比較フローを使用し、言語機能を出荷する前にファジングを必要とします。 |
Vue/TS 互換性の変更を言語機能のように扱います。ソースの動作を引用し、シナリオ テストを追加し、関連する場合はパフォーマンスを比較し、昇格前にファジングを実行またはスケジュールします。 |
microsoft/TypeScript |
Hereby タスク グラフは、ビルド、フォーマット、lint、テスト、およびベースラインのタスクを分離します。コンパイラー出力は、tests/baselines/reference を通じてレビューされ、baseline-accept より前にローカルで生成された出力と比較されます。 |
レビューされた契約としてスナップショットを保存します。変更された tests/snapshots/* または Rust insta スナップショットは PR によって説明され、変更された動作に限定される必要があります。 |
TypeScript tests/cases/fourslash |
エディター向けの言語サービスの動作は、コンパイラー テストだけから推測されるのではなく、数千のシナリオ ファイルとしてキャプチャされます。 | LSP、クイックフィックス、補完、ホバー、および増分エディターの変更には、パーサー/コンパイラー フィクスチャだけでなく、シナリオ レベルのスモークまたは統合をカバーする必要があります。 |
microsoft/typescript-go |
ネイティブ ポートは、TypeScript サブモジュールを参照実装として保持し、最小限のコンパイラ テストを追加し、生成された出力を testdata/baselines/local に書き込み、縮小された .diff ベースラインを収束証拠として扱います。 |
Vize 固有のルールを導入する前に、Vize の出力を公式の Vue および TypeScript の動作と比較してください。 Vize が意図的に分岐する場合は、その理由と互換性層を文書化してください。 |
facebook/flow |
フローは、予想される出力 .exp を使用したディレクトリ形式の統合テストを維持し、意図的な出力変更の再記録をサポートし、エディターおよびサーバー フローにアクション/アサーション スタイル newtests を使用します。 |
診断とエディターのワークフローには、小規模なシナリオ フィクスチャを優先します。再記録されたスナップショットは、差分を確認し、生成されたノイズがベースラインから外れないようにした後にのみ受け入れられます。 |
Vize クラス変更
すべての言語処理 PR は、変更クラスに名前を付け、一致する証拠を含める必要があります。 行。開発中は最も狭いコマンドを使用し、変更が共有されると範囲を広げます。 行動。
| クラス変更 | 必要な証拠 | 共通コマンド |
|---|---|---|
| パーサーまたはAST | 最小限のパーサー フィクスチャ、予想される AST またはエラー出力、および広範なスナップショットの更新はありません。 | cargo test -p vize_armature、cargo test -p vize_test_runner、node tests/tooling/support/generate-expected.ts <fixture> |
| コンパイラと codegen | 最小限のソース フィクスチャ、DOM/Vapor/SSR の予想される出力、および放出されるランタイム形状が変化するときの現実世界のパリティ。 | cargo test -p vize_atelier_dom、cargo test -p vize_atelier_vapor、vp run --filter './tests' test:build |
| セマンティック分析、lint、ファイル間分析 | ルールまたはアナライザー フィクスチャ、JSON またはエージェント出力スナップショット、および変更された診断に関するドキュメント。 | cargo test -p vize_patina、vp run --filter './tests' test:lint、node --test tests/tooling/snapshot-baselines.test.ts |
| 仮想 TypeScript と型チェック | 最小限の SFC フィクスチャ、マッピングされた診断スナップショット、生成された仮想 TS レビュー、および公式の Vue または TypeScript パリティ ノート。 | vp run --filter './tests' test:check:fixtures、cargo test -p vize_canon、vize check --show-virtual-ts <file> |
| フォーマッタと LSP | ゴールデン フォーマットの出力またはプロトコル スモーク カバレッジに加え、動作がユーザーに見える場合の集中的なエディタ統合チェック。 | cargo test -p vize_glyph、cargo test -p vize_maestro、node --test tests/tooling/lsp-smoke.test.ts |
| ランタイム パッケージ、リリース、またはドキュメント | ガバナンス テスト、スモーク インストールまたはワークフロー カバレッジ、運用体制が変更されたときのリリース/準備ドキュメント。 | node --test tests/tooling/*.test.ts、node tools/npm/smoke-release-install.mjs --prepare-manifests --runtime-checks、vp run --workspace-root check:ci |
保証レーン
一部の変更には、変更クラスに加えて 2 番目のレンズが必要です。これらのレーンはセキュリティステータスを作り、 パフォーマンスのステータス、および曖昧な証拠をレビュー担当者として残すのではなく、PR で明確にします。 記憶。
| レーン | 変更が | に触れる場合に使用します。記録すべき証拠 |
|---|---|---|
| セキュリティ | URL 処理、HTML または SSR 出力、ファイルシステム/構成の読み込み、ネイティブの読み込み、パッケージの公開、CI、または資格情報。 | .github/workflows/check.yml、vp exec pnpm audit --prod --audit-level moderate、cargo audit --deny warnings の security-audit、smoke-install ランタイム チェック、固定された GitHub Actions チェック、およびリスクのある入力または境界をカバーする焦点を絞った回帰。 |
| パフォーマンス | パーサー、コンパイラー、リンター、フォーマッタ、型チェッカー、キャッシュ、プロジェクト グラフ トラバーサル、生成された出力、または CLI I/O。 | .github/workflows/benchmark.yml、bench/compare-pr.mjs、bench/enforce-pr-budget.mjs、pr-benchmark-budget ステータス、ローカル bench:* タスク、および回帰が必要な場合の vize lint --profile、vize check --profile、または vize fmt --profile 出力帰属。 |
| ファジング | バイト指向の解析、構文の回復、CSS 解析、JS/TS 式の解析、テンプレートの字句解析、または codegen の回復。 | .github/workflows/fuzz.yml、tests/fuzz/Cargo.toml、tools/fuzz/seed_corpus.mjs、cargo +nightly fuzz run <target>、アップロードされた fuzz-reproducers-* アーティファクト、およびクラッシュ、タイムアウト、または OOM 後の最小化された決定論的回帰が理解されています。 |
ベースラインポリシー
最も小さな失敗例または実例となるケースから始めて、次に、より広範なフィクスチャを受け入れられるのは、 横断的な行動を証明します。
スナップショット ファイルとベースライン ファイルはユーザーに表示されるコントラクトです。 diff によって診断が変更された場合、生成される コード、パブリック CLI 出力、またはエディターの動作について、PR は新しい出力が正しい理由を説明する必要があります。
揮発性データがベースラインに達する前に正規化します。パス、タイミング、ハッシュ、環境 詳細によりスナップショットのチャーンが繰り返し発生しないようにする必要があります。
パリティアーティファクトを明示的に保ちます。
tests/snapshots/check、tests/snapshots/lint、現実世界 フィクスチャのスナップショットと Vue パリティ マトリックスが互換性レコードです。PR がそれらの出力に関するものでない限り、大規模なスナップショット ベースラインを更新しないでください。多数のファイルを移動する場合 共通の原因についての短い説明を一緒に含めます。
エスカレーションのトリガー
変化が次のいずれかの形である場合は、より広範な証拠を入手します。
構文、変換、または仮想 TypeScript の動作は、通常の Vue アプリケーションに影響を与える可能性があります。 現実世界のフィクスチャを追加または更新し、公式の Vue ツールとの同等性を説明します。
生成されたコード形状、キャッシュ、プロジェクト グラフのトラバーサル、または型認識分析が移動する可能性があります。 スループット: サーフェスと一致するローカル ベンチマークを実行し、PR ベンチマーク バジェットに依存します。
URL処理、HTML/SSR出力、構成ロード、パッケージ公開、ネイティブロード、CI、または 認証情報に隣接するコードの変更: セキュリティ監査ステータスを記録し、焦点を絞った回帰を追加します。 境界がまだ守られていることを証明します。
パーサーの回復、任意のバイト入力、CSS/テンプレート/式の解析、またはクラッシュの修正: 実行または 一致するファズターゲットをスケジュールし、再現器を保持し、最小化された決定論的結果を取得します。 修正リクエストを閉じる前に回帰を確認してください。
LSP、エディター、クイックフィックス、完了、ホバー、または増分動作の変更: シナリオレベルの追加 最終的な診断だけでなく、ユーザーに表示されるシーケンスを実行するカバレッジ。
スナップショットは、パス、ハッシュ、順序、タイミング、環境、またはホスト プラットフォームによって変更されます。 最初に正規化してから、残りの差分が意味のある場合にのみベースラインを受け入れます。
運用上のガードレール
Vize は、メモリに依存する代わりに、これらのプラクティスを実行可能に保ちます。
CONTRIBUTING.mdは、貢献者向けのクラス変更規律に名前を付けます。.github/PULL_REQUEST_TEMPLATE.mdは、行動の参照、リスク、検証証拠を求めます。bench/test-inventory.mjsは、PR CI の現在のテスト資産インベントリをレポートします。.github/workflows/benchmark.ymlは、ベース CLI とヘッド CLI のパフォーマンスを比較し、PR 予算を適用します。.github/workflows/check.ymlは、実稼働 npm および Rust のsecurity-auditジョブを実行します 依存関係に関する勧告。.github/workflows/fuzz.ymlはtests/fuzzカーゴファズ ワークスペースを実行し、アップロードがクラッシュします パーサー/コンパイラーのトリアージのための再現者。docs/release/production-readiness.mdおよびdocs/release/vue-parity-matrix.mdは、いつ 動作は実稼働対応または互換性があると言えます。tests/tooling/language-engineering-practices.test.tsはこのページ、貢献ガイドを保管しています。 PR テンプレートを結び付けます。