6.3 KiB
6.3 KiB
テスト妥当性レビュー: llm-worker-macros
- 評価: 混在
確認範囲
- 対象 crate:
crates/llm-worker-macros - 読んだ主なファイル:
crates/llm-worker-macros/src/lib.rscrates/llm-worker-macros/Cargo.tomlcrates/llm-worker-macros/README.mdcrates/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とToolinstance を返せること。- tool 名が method 名由来になること。
- doc comment が
ToolMeta.descriptionに入ること。 - JSON 引数が deserialize され、method に渡されること。
- 複数引数の tool が動くこと。
- 引数なし tool が
{}で実行できること。 - 不正な引数、少なくとも必須 field 欠落が error になること。
Result<T, E>返却の success/error mapping が動くこと。- async method と sync method の両方が wrapper 経由で実行できること。
ToolExecutionContexttyped parameter が JSON schema/input からではなく実行時 context から渡されること。- definition factory を複数回呼んでも
ToolMetaが安定していること。
この crate の中心責務は「compile-time macro expansion による runtime tool definition 生成」なので、下流 crate で実 macro expansion を通している点は妥当。
不足・疑問のあるテスト
llm-worker-macrospackage 自身の 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
Resultalias や path-qualified resultToolExecutionContextの path-qualified type / alias
- negative compile tests がないため、「サポート外 syntax が分かりやすく失敗するか」は不明。
- assert が
summary.contains(...)に寄りがちで、Debugformatting 前提の出力仕様を明確に固定していない。脆すぎるわけではないが、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。
- 最小構成の consuming crate で
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-macroscrate 自身にも、少なくとも compile test harness を置くか、下流llm-worker側の macro tests がこの crate の実質テストであることを明示する。
実行したコマンド
cd /home/hare/Projects/yoi && cargo test -p llm-worker-macros
結果:
- 成功。
- Unit tests:
0 passed。 - Doctests:
0 passed,2 ignored。 - この crate 単体の test 妥当性評価としては、挙動検証はほぼない。
cd /home/hare/Projects/yoi && cargo test -p llm-worker --test tool_macro_test
結果:
- 成功。
9 passed。llm-worker側の integration test としては、macro の主要 runtime behavior をある程度検証できている。