Rustのテスト用関数の実装

モック関数実装用のcrateに mockallがあります。

mockallで実装できる関数であれば積極的に利用できますが、現状async traitへの対応にやや難があるのと、テスト時にトレイトオブジェクトを渡す必要があり、あらゆる用途に使えるとは言いづらい面もあります。

cfg(debug_assertions)マクロ

cfg(debug_assertions)マクロを利用すると、ビルドモードに応じてコンパイル対象のコードを切り替えられます。

#[cfg(not(debug_assertions))]
async fn some_api_call() {
  // cargo build --release時にコンパイルされる関数
  // productionで動作させる実コードを実装
}

#[cfg(debug_assertions)]
async fn some_api_call() {
  // releaseモード以外の際にコンパイルされる関数
  // テスト用に必要な値を直接返す
}

この挙動を利用すると、cargo test実行時向けの同名関数を実装できます。
ただし、cargo runcargo buildなどのデフォルト挙動もdebug_assertionsの方が利用される点には注意が必要です。

not(debug_assertions)を指定するには、cargo check --releaseのようにリリースオプションを付ける必要があります。

環境変数による挙動の切り替え

テストケースの細分化には、 std::envを利用する手があります。

var()で環境変数を取得し、変数に応じた値を返すことで、各種ケースを再現できます。
テストケースにset_var()を実装するとケース単位で挙動を制御できます。

中馬崇尋
Chuma Takahiro