テストマトリクス
テストの対象範囲は make test 1 つに収まりません。Formulon は 1 つのソースツリーから複数パッケージを出荷するため、コア、Oracle、パッケージング、実行環境間の一致を別々に検証します。
用語: CTest のラベル
CTest はテストにテキストのラベル(SLOW / BENCH / TSAN / PARITY / VARIANT)を付けます。ラベルのないテストが高速な層です。ターゲットはラベルで対象を含めたり除外したりできるので、コミット前は遅いテストや診断用テストを省き、CI ではそれらも実行できます。
コアテスト
make build
make test
make test-slow
make test-allmake test は SLOW・BENCH・TSAN ラベルを除外します。make test-slow は SLOW を含め、BENCH・TSAN は除外します。make test-all は現在のビルド設定で有効なテストをすべて実行します。コミット前に make test、コアを変更する PR の前に make test-all を実行します。
Oracle テスト
make oracle-verifyOracle 検証は Excel 由来のゴールデンデータと Formulon 出力を比較します。Excel を起動しないので CI でも安全です。
バリアント Oracle テストは明示的に有効化します。
cmake -B build-variants -DCMAKE_BUILD_TYPE=Debug -DFORMULON_ORACLE_VARIANTS=ON
cmake --build build-variants --target formulon_oracle_variant_tests formulon_workbook_oracle_variant_tests --parallel
ctest --test-dir build-variants -L VARIANT --output-on-failure検証済みの取得元情報があるバリアントだけが対象です。オプションを有効にしても、取得済みデータがすべて自動的にテスト対象になるわけではありません。プロファイル固有差分の調査や、対応するプロファイルを追加する前に使います。
現在のプロファイルカタログは 14 ロケール、28 個の ID です。数式 Oracle のゲートは Mac 14 プロファイルを対象とし、Windows のワークブックターゲットは実測済みの win-365-ja_JP です。残り 13 個の Windows プロファイルは、Mac での実測値と Windows ホストの規則から推定しています。Windows の Excel 取得がなくても、ロケール切り替え、数式変換、ロケール情報の取得はコアとバインディングのテストで検証します。
パッケージングのスモークテスト
| 実行環境 | コマンド |
|---|---|
| WASM | make wasm、make test-wasm、make npm-test |
| Python | make python-test |
| Native Node | make node-test |
| CLI | tests/cli 配下の CTest ターゲット |
各バインディングの load → mutate → recalc → save ループがコア変更後も成立することを確認します。ホスト側の値変換とリソースの寿命も検証します。
実行環境間の一致
make parity-test一致を検証するツールは、ローカルで利用できる CLI・npm WASM・Python の実行環境を比較します。利用できない実行環境はスキップします。比較には 2 つ以上の実行環境が必要で、足りない場合は終了コード 77 を返すため、make は正常終了しません。結果の不一致、評価エラー、検証用データの期待値との不一致で失敗します。Native Node、pthread 版 npm 入口、MCP、セル UI は別途検証します。
パリティと Oracle の違い
パリティは利用可能な実行環境同士の一致を確認します。Oracle はコアと Excel の一致を確認します。リリース前には両方の結果が必要です。
診断
| コマンド | 目的 |
|---|---|
ctest -R RegistryCatalog.CoverageReport -V --output-on-failure(make build の後、build ディレクトリで実行) | 正規カタログに対する実行時の関数登録状態 |
make function-status | カテゴリごとの認識数、実装数、スタブ数、環境依存の数。ビルドせずにカタログファイルから読む |
make behavior-status | 細かな挙動のカタログの状態 |
make coverage | ローカルカバレッジ診断 |
make mutation | ローカルミューテーションテスト診断 |
RegistryCatalog.CoverageReport は診断専用の gtest ケースです。常に成功し、カバレッジ比率を標準出力に出すだけなので、ctest -V を付けたときにしか表示されません。合否の判定ではなく、現在の数値を読むために使ってください。
追加の診断
| ターゲット | 目的 |
|---|---|
make bench | BENCH ラベルのベンチマーク検査を実行します。build/ をリリース構成に変更します |
make fuzz / make fuzz-long | パーサ、評価器、ファイル形式、印刷設定のファジングハーネスを実行します |
bash tools/ci/run_tsan.sh | CI で使う ThreadSanitizer テストを実行します |
ファジングハーネスは -DFM_BUILD_FUZZ=ON で構成したビルドにだけ存在し、そこでは SLOW ラベルが付きます。既定のビルドにも CI にも含まれません。libFuzzer ランタイムを同梱した Clang が必要で、Apple のツールチェーンには含まれないため、macOS では別途 LLVM を用意します。macOS では AddressSanitizer も既定で無効です。最近の動的リンカーと組み合わせると、ASan 自身のシャドウメモリ初期化でデッドロックするためです。そのため macOS でのファジングで検出できるのはクラッシュ、タイムアウト、未定義動作までで、ヒープ破壊は検出できません。
次に読むもの
- ソースからビルド ─ テスト対象のビルド方法
- Oracle データの提供 ─
oracle-verifyが消費するデータ - リリースチェックリスト ─ リリース時に各テストを実行する時期