テストの分け方(HMD が要る範囲)
範囲で分けると、何が決まるか
Section titled “範囲で分けると、何が決まるか”FloatSoda のテストは、どこまで結合して動かすかで、単体・結合・描画・実機の4つの範囲に分かれます。範囲によって、動かす手段、速さ、HMD が要るかが決まります。
範囲を決めずにテストを書くと、HMD が要らない確認を実機に回して遅くしたり、実機でしか壊れないものを xunit で通ったことにしたりします。このページを読むと、確かめたいことを置く範囲を自分で選べます。置き場所の決め方は、最後の節にあります。
HMD なしで確かめられる3つの範囲
Section titled “HMD なしで確かめられる3つの範囲”単体、結合、描画の3つは、dotnet test で動き、HMD も SteamVR も要りません。
| 範囲 | 対象 | 受け持つテストプロジェクト |
|---|---|---|
| 単体 | ジオメトリ型、RenderObject 1個、Widget 1個 | tests/FloatSoda.Test。Layer ツリーは tests/FloatSoda.Rendering.Test |
| 結合 | WidgetBinding から RenderPipeline までを通したフロー。差分更新、入力の配送 |
tests/FloatSoda.Test |
| 描画 | ビットマップに描画した画素 | tests/FloatSoda.Test(src/FloatSoda.Testing/ のビットマップ描画を使う) |
CI が動かすテストプロジェクトは、FloatSoda.Rendering.Test と FloatSoda.Test の2つです。CI は SteamVR を使いません。
テスト名は MemberName_条件_期待結果 の形で付けます。命名の規約は CONTRIBUTING.md の「テストの命名」にあります。何を検証するかの観点は、同じファイルの「テスト観点」が正本です。このページには写しません。
HMD が要る範囲
Section titled “HMD が要る範囲”実機の範囲は、SteamVR が動いているときにしか観測できないものに使います。たとえば、オーバーレイのハンドル、コントローラーの座標、描画スレッドの GL コンテキストです。
実機の確認は、サンプルの checks/items.jsonl に書いた項目を、HMD を着けて1つずつ判定する形で行います。項目の生成は floatsoda-device-test-gen、実行と yes/no の記録は floatsoda-device-test-run が担います。
HMD を持っていない人は、実機の確認を、持っている人に頼る形になります。自分の変更が実機を要するのに HMD がないときは、PR に「実機で未確認」と書いて、確認を頼みます。出す前に確かめることは、コントリビューターの規約から案内しています。
動作検証の結果の報告は、不具合を切り分けて報告するにあります。
CONTRIBUTING.md と skill には、実機のシナリオを置く tests/FloatSoda.DeviceTest という名前が出てきます。このディレクトリは、いまのリポジトリにはありません。
期待値の決め方
Section titled “期待値の決め方”範囲を選んだら、期待値をどう定義するかを選びます。4つあります。
| 決め方 | 期待値の定義 | 向いている対象 |
|---|---|---|
| 例示 | 入力に対する正確な出力を書く | サイズ計算、イベントの順序、画素の色 |
| 不変条件 | 常に成り立つ性質を書く | ツリーの親子関係と深さ、dirty list の整合 |
| ゴールデン | 保存した出力と比べる | 描画結果の意図しない変化 |
| 差分 | Flutter の挙動を正解にして比べる | Flutter 由来の Widget / RenderObject |
差分が使えるのは、Flutter から観測できる挙動に限ります。性能や並行性は、Flutter が正解になりません。
Flutter 由来の部品では、Flutter の実装の分岐と公式テストを確かめて、検証するケースを決めます。この規約は、CONTRIBUTING.md の「テスト観点」にあります。
どこにテストを置くか決める
Section titled “どこにテストを置くか決める”置き場所は、2つの基準で1つに決めます。
- 同じ不具合を、より小さな範囲で観測できるなら、大きな範囲は使わない。実機は、実機でしか観測できないものにだけ使う
- 選んだ範囲で期待値を定義できないなら、期待値の決め方を選び直す。それでも定義できない範囲は使わない。たとえば、性能は Flutter が正解にならないので、差分以外の決め方を選ぶ
画素の色なら、描画の範囲で例示を使います。ツリーの整合なら、単体か結合の範囲で不変条件を使います。オーバーレイのハンドルは、実機の範囲です。
docs と API の分かりやすさは、このページの範囲には入れません。LLM に docs だけを渡して実装させるジュニアコーダーテストで確かめます。CI には入れません。手順は floatsoda-junior-coder-test にあります。
次に読むページ
Section titled “次に読むページ”目的に合うほうへ進みます。
- テストの書き方の規約を引く: コントリビューターの規約
- Flutter のテストを写す: Flutter から移植する