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 は、パッケージングのためのツールで、開発時にモジュール内部のユニットテストを実行させることは、本来の使い方からは外れているのだと思われます (筆者の勝手な想像ですが)。 ただ、開発時用にわざわざ別のビルド方法を準備するのもなんだか嫌な感じだったので、上記のように回避するのもありかなーと思いました。