ユーニックス総合研究所

  • home
  • archives
  • rust-assert

Rustのassert!の使い方【assert!, assert_eq!, assert_ne!】

  • 作成日: 2022-05-17
  • 更新日: 2023-12-25
  • カテゴリ: Rust

Rustのassert!の使い方

単体テストなどで活躍するのがassert系の関数あるいはマクロです。
assertは引数の値に応じて、エラーを出してくれます。
そのため単体テストではこのassert系のマクロを使って機能を検証します。

この記事ではRustのassertについて詳しく見ていきます。

関連記事

文字列の描画 - Rustで作るWindowsアプリ
改行付きの文字列を描画する - Rustで作るWindowsアプリ
ラベルの表示 - Rustで作るWindowsアプリ

文字列の描画 - Rustで作るWindowsアプリ
改行付きの文字列を描画する - Rustで作るWindowsアプリ
ラベルの表示 - Rustで作るWindowsアプリ

assert系マクロの種類

Rustのassert系のマクロは以下の3つがあります。

  • assert!(bool) ... 引数が真ならOK
  • assert_eq!(T, T) ... 2つの引数が同じならOK
  • assert_ne!(T, T) ... 2つの引数が同一でないならOK

まずはassert!から解説します。

assert!の使い方

assert!()は引数がtrue, 真ならなにもしません。

    // 成功。何もしない  
    assert!(1 == 1);  

false, 偽だった場合はエラー(パニック)を送出します。

    // 失敗。パニックが発生  
    assert!(1 == 0);  

↑のコードを実行するとたとえば↓のようなエラーが出ます。

thread 'main' panicked at 'assertion failed: 1 == 0', src\main.rs:3:5  
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace  
error: process didn't exit successfully: `target\debug\rust_assert.exe` (exit code: 101)  

thread 'main' panicked at 'assertion failed」は日本語にすると「メインスレッドがアサーションの失敗にパニックを起こしました」という意味になります。

assertでは基本的に「これは通るだろ」というコードを書きます。
たとえば1 == 1というコードは「これは通らないとおかしいでしょ」というコードです。
当然これは通ります。
しかし1 == 0は通りません。
このようにassertでは「これは通るだろ」というコードを書くのが一般的です。
assertを使い慣れていないとassertの概念が掴みにくいのですが、このように認識するとわかりやすいかと思います。

🦝 < プログラマー「通るだろ!これは通るだろ!」

🐭 < assert「だめです」

🦊 < 無慈悲だな

assert!()の第2引数にはエラー時のカスタムメッセージを指定できます。
たとえば↓のように書くと

    // 失敗。カスタムメッセージでエラーを出力  
    assert!(1 == 0, "1 is 0");  

↓のようにエラーメッセージが変化します。

thread 'main' panicked at '1 is 0', src\main.rs:9:5  
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace  
error: process didn't exit successfully: `target\debug\rust_assert.exe` (exit code: 101)  

assert_eq!の使い方

assert_eq!()は第1引数と第2引数が同じだったら(イコールだったら)何もしません。

    // 成功。何もしない  
    assert_eq!(1, 1);  

同じでなかったらパニックになります。

    // 失敗。パニックが発生  
    assert_eq!(1, 0);  

↑のコードでパニックが起きた場合は↓のようなエラーになります。

thread 'main' panicked at 'assertion failed: `(left == right)`  
  left: `1`,  
 right: `0`', src\main.rs:12:5  
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace  
error: process didn't exit successfully: `target\debug\rust_assert.exe` (exit code: 101)  

assert_ne!の使い方

assert_eq!()は第1引数と第2引数が同じでなかった場合は何もしません。

    // 成功。何もしない  
    assert_ne!(1, 0);  

第1引数と第2引数の2つの引数が同じであった場合はパニックになります。

    // 失敗。パニックが発生  
    assert_ne!(1, 1);  

↑のコードを実行すると↓のようなエラーが出力されます。

thread 'main' panicked at 'assertion failed: `(left != right)`  
  left: `1`,  
 right: `1`', src\main.rs:18:5  
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace  
error: process didn't exit successfully: `target\debug\rust_assert.exe` (exit code: 101)  

おわりに

今回はRustのassert系のマクロを紹介しました。
単体テストを書く場合の恋人みたいなマクロですがうまく使ってテストを書きたいところです。

🦝 < assert!がだめといったら

🐭 < だめです