5.0 KiB
5.0 KiB
テスト妥当性レビュー: project-record
- 評価: 概ね良い
確認範囲
- Workspace root:
/home/hare/Projects/yoi - Crate:
crates/project-record - Main source/test file:
crates/project-record/src/lib.rs - Crate の責務:
- Unix epoch milliseconds を、path-safe な固定幅13文字の Crockford base32 風 ID に encode/decode する。
- ID の validation を提供する。
- collision 時に suffix を付けず、millisecond 値を bounded に increment して未使用 ID を割り当てる。
- Ticket / Objective などの project record ID 生成・検証の共通基盤になっている。
現在のテストがよくカバーしていること
encode_unix_epoch_millisの基本境界を押さえている。0 -> 000000000000031 -> 000000000000Z32 -> 0000000000010
- 固定幅 ID の lexicographic order が numeric / chronological order と一致する、というこの crate の重要 invariant を明示的にテストしている。
- ambiguous / path-unsafe な文字を reject するテストがある。
I,L,O,/を拒否しており、path-safe ID としての意図は確認できる。
- decode overflow 相当のケースも一応含まれている。
ZZZZZZZZZZZZZは文字種としては valid だがu64を超えるため invalid になる。
- collision allocation の基本動作を押さえている。
- 既存 ID と衝突したら
base_millis + 1を使う。 - 全候補が衝突する場合は
MAX_COLLISION_PROBESで bounded に失敗する。
- 既存 ID と衝突したら
不足 / 疑問のあるテスト
- encode/decode の round-trip coverage が薄い。
decode_unix_epoch_millis("0000000000010") == 32以外は decode の成功系がほぼ確認されていない。u64::MAX、現在時刻に近い値、桁境界、複数の代表値でdecode(encode(x)) == xを見ると、crate の中心 invariant がより強くなる。
decode_digitの valid alphabet coverage が不足している。- 現在の成功系 decode は主に
0,1周辺に偏っている。 A-H,J-K,M-N,P-T,V-Zの range 分岐が壊れても一部は検出しにくい。
- 現在の成功系 decode は主に
- overflow 境界が明確にテストされていない。
decode("FZZZZZZZZZZZZ") == u64::MAXdecode("G000000000000")やdecode("ZZZZZZZZZZZZZ")がTimestampOverflowのように、13桁 base32 が 65bit 空間であることに由来する境界を分けて確認したい。
rejects_ambiguous_or_path_unsafe_charactersは少し名前と中身が混ざっている。ZZZZZZZZZZZZZは ambiguous/path-unsafe character ではなく numeric overflow なので、invalid character 系と overflow 系は別テストにした方が失敗時の意味が明確になる。
allocate_record_idの overflow 経路が未テスト。base_millis == u64::MAXかつ最初の候補が衝突した場合、次の probe でTimestampOverflowになるはず。- collision boundedness だけでなく、上限付近の arithmetic safety を確認したい。
- lowercase policy がテストされていない。
- Crockford base32 という名前からは lowercase 許容を期待する読者もいるため、この実装が uppercase-only なら
a,zなどを reject するテストか、仕様コメントでの明示があると良い。
- Crockford base32 という名前からは lowercase 許容を期待する読者もいるため、この実装が uppercase-only なら
unix_epoch_millis_nowは実質未テスト。SystemTime::now()wrapper なので優先度は低いが、少なくとも「現在の正常環境でOkを返す」程度の smoke test は可能。- ただし時刻依存なので、無理に強い assertion を置く必要はない。
追加を提案するテスト
- 代表値での round-trip test:
013132331024- 現在時刻近辺の固定値
u64::MAX
- decode boundary tests:
FZZZZZZZZZZZZがu64::MAXに decode されること。G000000000000やZZZZZZZZZZZZZがTimestampOverflowになること。
- alphabet mapping test:
RECORD_ID_ALPHABETの各文字を下位桁に置いた ID を decode し、index と一致すること。
- invalid character test の分割:
- ambiguous chars:
I,L,O - lowercase chars:
a,zなど、uppercase-only policy を明示する場合 - path separators / unsafe chars:
/,\,., maybe whitespace - overflow: valid alphabet だが
u64範囲外
- ambiguous chars:
- allocation overflow test:
allocate_record_id(u64::MAX, |_| true)がTimestampOverflowになること。
- allocation probe behavior test:
existsが必要以上に呼ばれないこと、また最初の available candidate で止まることを確認すると、bounded allocation の仕様がより明確になる。
実行したコマンド
cargo test -p project-record- 結果: pass
- 概要: 5 unit tests passed, 0 failed; doc-tests 0 passed / 0 failed.
- 注記: artifact directory の file lock 待ちがあったが、テスト妥当性評価に影響する失敗ではない。