yoi/docs/report/test-validity-20260612/llm-worker-macros.md

110 lines
6.3 KiB
Markdown

# テスト妥当性レビュー: llm-worker-macros
- 評価: 混在
## 確認範囲
- 対象 crate: `crates/llm-worker-macros`
- 読んだ主なファイル:
- `crates/llm-worker-macros/src/lib.rs`
- `crates/llm-worker-macros/Cargo.toml`
- `crates/llm-worker-macros/README.md`
- `crates/llm-worker/tests/tool_macro_test.rs`
- 変更はしていない。
`llm-worker-macros` 自体にはローカル unit/integration test がなく、`cargo test -p llm-worker-macros` では実質的に挙動を検証していない。一方で、下流 crate の `llm-worker` 側に `#[tool_registry]` / `#[tool]` の実利用 integration test があり、主要な happy path と一部 error path は確認されている。
## 現在のテストがよくカバーしていること
`crates/llm-worker/tests/tool_macro_test.rs` は、この proc macro が実際に `llm_worker::tool::Tool` と組み合わさって動くことを確認しており、単なる helper unit test より有用な面がある。
特に以下はよく押さえられている。
- `#[tool_registry]``*_definition()` を生成し、`ToolMeta` と `Tool` instance を返せること。
- tool 名が method 名由来になること。
- doc comment が `ToolMeta.description` に入ること。
- JSON 引数が deserialize され、method に渡されること。
- 複数引数の tool が動くこと。
- 引数なし tool が `{}` で実行できること。
- 不正な引数、少なくとも必須 field 欠落が error になること。
- `Result<T, E>` 返却の success/error mapping が動くこと。
- async method と sync method の両方が wrapper 経由で実行できること。
- `ToolExecutionContext` typed parameter が JSON schema/input からではなく実行時 context から渡されること。
- definition factory を複数回呼んでも `ToolMeta` が安定していること。
この crate の中心責務は「compile-time macro expansion による runtime tool definition 生成」なので、下流 crate で実 macro expansion を通している点は妥当。
## 不足・疑問のあるテスト
- `llm-worker-macros` package 自身の test は 0 件。`cargo test -p llm-worker-macros` 単体では回帰検知力がほぼない。
- proc macro crate として重要な compile-pass / compile-fail matrix がない。現在は runtime integration test 中で使われる形だけが通っている。
- `#[description = "..."]` parameter attribute の挙動が未検証。実装は `#[schemars(description = ...)]` に変換するが、schema に description が出るか、parameter attribute として期待通り扱えるかをテストしていない。
- JSON Schema の検証が弱い。`properties` の存在だけを見ており、以下を確認していない。
- field 名
- `required`
- field type
- `ToolExecutionContext` が schema から除外されること
- `#[description]` が schema に反映されること
- 不正引数 test が error variant や message を確認していない。`ToolError::InvalidArgument` であることまで見るべき。
- 引数なし tool は invalid JSON も `unwrap_or` で通す実装になっているが、この仕様が意図通りかを固定する test がない。現在の test は `{}` のみ。
- macro expansion が参照する外部 path/import の契約が未検証。生成コードは `serde`, `schemars`, `serde_json`, `async_trait`, `::llm_worker` に依存しているため、利用側 crate で何を明示 import/dependency すべきかを compile test で固定した方がよい。
- unsupported input の扱いが未検証。
- destructuring pattern 引数
- `self` 以外の receiver 形
- generic method
- generic impl / lifetime 付き impl
- `Result` alias や path-qualified result
- `ToolExecutionContext` の path-qualified type / alias
- negative compile tests がないため、「サポート外 syntax が分かりやすく失敗するか」は不明。
- assert が `summary.contains(...)` に寄りがちで、`Debug` formatting 前提の出力仕様を明確に固定していない。脆すぎるわけではないが、macro の期待仕様としてはやや曖昧。
- doctest はすべて `ignore` なので、README/API example の鮮度は保証していない。
## 追加の提案
- `trybuild` による compile-pass tests を追加する。
- 最小構成の consuming crate で `#[tool_registry]` が展開できること。
- async/sync/Result/no-arg/multi-arg/context-injected/description-attribute の pass cases。
- 必要な dependency/import 契約が明確になる fixture。
- `trybuild` による compile-fail tests を追加する。
- destructuring pattern 引数。
- unsupported receiver/method form。
- `Clone` できない context。
- 期待していない attribute placement。
- サポート外 generic form を意図的に禁止するなら、その diagnostic。
- schema の exact-ish assertions を追加する。
- `properties.message` 等の field 名。
- `required`
- numeric/string type。
- `ToolExecutionContext` が schema に出ないこと。
- `#[description = "..."]` が field schema に反映されること。
- error path の assertion を強くする。
- invalid JSON syntax。
- missing required field。
- wrong type。
- それぞれ `ToolError::InvalidArgument` になること。
- 引数なし tool の invalid input 仕様を明文化して test する。現在の「parse 失敗でも空 args として続行」はかなり permissive なので、意図した仕様なら固定し、意図しないなら変更前提の regression test を作る。
- `llm-worker-macros` crate 自身にも、少なくとも compile test harness を置くか、下流 `llm-worker` 側の macro tests がこの crate の実質テストであることを明示する。
## 実行したコマンド
```sh
cd /home/hare/Projects/yoi && cargo test -p llm-worker-macros
```
結果:
- 成功。
- Unit tests: `0 passed`
- Doctests: `0 passed`, `2 ignored`
- この crate 単体の test 妥当性評価としては、挙動検証はほぼない。
```sh
cd /home/hare/Projects/yoi && cargo test -p llm-worker --test tool_macro_test
```
結果:
- 成功。
- `9 passed`
- `llm-worker` 側の integration test としては、macro の主要 runtime behavior をある程度検証できている。