rustpkg test でプロダクトコード中に書かれたユニットテストを実行する
以下のようなパッケージ foo
が存在したとします。
// src/foo/lib.rs #[crate_id = "foo"]; pub fn super_complex_function() -> uint { 42 } #[cfg(test)] mod test { #[test] fn test_super_complex_function() { assert_eq!(42, super::super_complex_function()); } }
上記に対し、適当な src/foo/test.rs
を作成して rustpkg test foo
を実行しても、 lib.rs
中のユニットテストは実行されません。
// src/foo/test.rs extern mod foo;
$ rustpkg test foo WARNING: The Rust package manager is experimental and may be unstable running 0 test test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
以下のように test.rs
のサブモジュールとして lib
を読み込むと、ユニットテストが走行するようになります。
// src/foo/test.rs mod lib; #[test] fn test() {}
$ rustpkg test foo WARNING: The Rust package manager is experimental and may be unstable /home/nksm/tmp/rustpkg/src/foo/lib.rs:1:1: 1:21 warning: crate-level attribute should be in the root module, #[warn(attribute_usage)] on by default /home/nksm/tmp/rustpkg/src/foo/lib.rs:1 #[crate_id = "foo"]; ^~~~~~~~~~~~~~~~~~~~ running 1 test test lib::test::test_super_complex_function ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
警告が出るのが嫌な場合は、 lib.rs
はサブモジュールを読み込むだけの内容に留めておき、test.rs
からもサブモジュールを参照するだけにすれば良いと思います。
rustpkg
は、パッケージングのためのツールで、開発時にモジュール内部のユニットテストを実行させることは、本来の使い方からは外れているのだと思われます (筆者の勝手な想像ですが)。
ただ、開発時用にわざわざ別のビルド方法を準備するのもなんだか嫌な感じだったので、上記のように回避するのもありかなーと思いました。