110 lines
6.3 KiB
Markdown
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 をある程度検証できている。
|
|
|