Rustでcargo testする時のテスト対象

Rustでテストを行う時、cargo testとすると#[cfg(test)]と書かれた部分を自動でテストをしてくれますが、ふと「一体どこまでのファイルがテストされるんだろう?srcフォルダにあれば全てされるんだろうか?」と思い調べてみたのでその記録を残します。

結論としては、「srcの中のlib.rs, もしくはmain.rsから追いかけられるrsファイルで#[cfg(test)]が書かれている部分がcargo testでテストされる」ということでした。

例えば、srcフォルダ以下が下記のような構成で、また、module_a.rsとmodule_b.rsにはどちらもテストが書かれているとします。

src
  lib.rs
  module_a.rs
  module_b.rs

そしてlib.rsの中身が

pub mod module_a;
pub mod module_b;

である時、cargo testをするとmodule_a.rsとmodule_b.rs両方に書かれているテストが実行されます。

では次に

pub mod module_a;
//pub mod module_b;

と、module_bをコメントアウトした状態でcargo testをするとどうなるかと言うと、この時はmodule_a.rsに書かれているテストのみが実行されます。

コメントアウトされたモジュール(ここではmodule_b.rs)内のテストは実行されないんですねー。

つまり、「lib.rsから辿れるモジュールのテストが実行される」ということのようです。

さて、次はsrcフォルダ内が下のようにlib.rsとmain.rsが混在している時はどうなるでしょうか。

src
  lib.rs
  main.rs
  module_a.rs

この場合、lib.rsから辿れるモジュールとmain.rsに書かれている(辿れる)モジュールのテストが実行されます。

以上、Rustのテストに関する記事でした。