Rustのrstestでパラメータテストをしてみる

はじめに

この記事では、「Rustのrstestを使ったパラメータテストの仕方」について書いています。\

自分に向けた備忘録でもありますが、「Rustでパラメータテストがしたい」「rstestを使ってみたい」な人の一助になれば嬉しいです。

rstestとは何か

rstestとは、フィクスチャベースのテストフレームワークで、フィクスチャとテーブルベースのテストが書けるようになるものです。

フィクスチャとは、テストを実行するのに必要な条件のことで、テーブルベースのテストの入力と期待値をテーブル形式で記述し、そのテーブルを走査しながら実行するようなテストのことです。

rstestでパラメータテストの行い方

Note

試した際の環境は以下の通りです。

Rustのプロジェクトをcarog new --lib rstest_sampleのコマンドを実行して作ります。

その後、まずはCargo.tomlに依存関係を加えます。[dependencies]の項目に以下を追加してください。 rstest = "0.15.0"

続いてlib.rsのコードにrstestでパラメータテストの簡単なサンプルを実行できるコードを書いていきます。

下のようにlib.rsの内容を書き換えてください

use rstest::rstest;

fn add_two(num: u32) -> u32 {
    num + 2
}

#[rstest(input, expected,
    case(0, 2),
    case(1, 3),
    case(2, 3),  # わざと失敗させている
    case(3, 5),
)]

fn test_add_two(input: u32, expected: u32) {
    assert_eq!(expected, add_two(input));
}

ポイントは以下の通りです。

  • #[rstestから続く部分でテストに使用するパラメータを記述します
  • テスト関数(ここではtest_add_two)の引数に、上で記述したパラメータを指定します。

ではlib.rsを書き換えたらcargo testを実行してみましょう

下のような出力が得られます。

running 4 tests
test test_add_two::case_1 ... ok
test test_add_two::case_2 ... ok
test test_add_two::case_4 ... ok
test test_add_two::case_3 ... FAILED

failures:

---- test_add_two::case_3 stdout ----
-------------- TEST START --------------
thread 'test_add_two::case_3' panicked at 'assertion failed: `(left == right)`
  left: `3`,
 right: `4`', src\lib.rs:14:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    test_add_two::case_3

test result: FAILED. 3 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

4つのcase(パラメータ)についてテストがされ、わざと失敗させるよう書いたcaseについてはちゃんと失敗されました。

おわりに

「Rustのrstestを使ったパラメータテストの仕方」について解説しました。

私個人の感覚としてはpytestのように書けて中々良さそうだなと感じました。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

https://caddi.tech/archives/1849

https://crates.io/crates/rstest