rstest がどんな仕組みか知りたい
rstest は、Rust で fixture test と parameterized test ができるようにするライブラリ rstestは裏でマクロを展開し、それぞれのテストケースに対して専用の関数を生成します。これにより、forループを使用したテストと比較すると、どのassertionが落ちたかを関数名から瞬時に知ることができるようになります。forループを利用したテストで問題であった、どのassertionが落ちているか瞬時にはわかりにくいという問題はこれによって解消されます。
マクロを展開してテストケースに対する関数を作るらしい
実行例:
code:fibonacci.rs
use rstest::rstest;
fn fibonacci_test(#case input: u32,#case expected: u32) { assert_eq!(expected, fibonacci(input))
}
fn fibonacci(input: u32) -> u32 {
match input {
0 => 0,
1 => 1,
n => fibonacci(n - 2) + fibonacci(n - 1)
}
}
code:result
cargo test --example fibonacci
Compiling mf v0.1.0 (/home/u/ghq/github.com/lemonadern/ff)
Running unittests examples/fibonacci.rs (target/debug/examples/fibonacci-c309a08fc25c270f)
running 5 tests
test fibonacci_test::case_1 ... ok
test fibonacci_test::case_4 ... ok
test fibonacci_test::case_2 ... ok
test fibonacci_test::case_3 ... ok
test fibonacci_test::case_5 ... ok
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
https://gyazo.com/b13cfd26c663b87b79ca5134d8185b00
この画像部分からも、テストケース分の関数が実際に生成されてから実行されていそうということがわかる
VSCodeのrust-analyzerも個別の関数を認識していそう
https://gyazo.com/ea20d619fcbdb670c32a063107174568
どういう仕組みなんだろう?
そもそもマクロもあんまりわかってない。二種類あるよみたいな話だけ知ってる
ていうか rust-analyzer はマクロをどうやって展開してるか、のほうが興味としては近いか?