#19 Rustで学ぶテスト(単体テスト)の基本
Rustはコンパイル時に多くのミスを防いでくれますが、「計算結果やロジックが正しいか」はコンパイラでは分かりません。この記事では、Rustで書いたコードを自動でチェックする「テスト」の基本を解説します。
なぜテストを書くのか
コンパイラは型の不一致やメモリ安全性の問題を見つけてくれますが、「意図した計算結果になっているか」までは保証しません。テストを用意しておけば、修正のたびにコマンド一つで動作確認ができます。
Rust標準のテスト機能
Rustには追加のライブラリを入れなくても使えるテスト機能が標準で備わっています。関数の上に#[test]という目印(属性)を付けるだけです。
fn add(a: i32, b: i32) -> i32 {
a + b
}
#[test]
fn test_add() {
assert_eq!(add(2, 3), 5);
}
assert_eq!は「左右の値が等しいはず」を宣言するマクロです。ターミナルでcargo testと実行するだけで、#[test]が付いた関数がすべて自動で実行されます。
テスト専用モジュールにまとめる
実際のプロジェクトでは、テストを#[cfg(test)]という目印を付けたモジュールにまとめるのが一般的です。
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add_negative() {
assert_eq!(add(-1, 1), 0);
}
}
#[cfg(test)]を付けると、通常のビルドではこのコードが含まれず、cargo test実行時だけコンパイルされます。
Rustならではの注意点
Rustは所有権という仕組みがあるため、テストコードの中でも値の所有権の移動やコピーを意識する必要があります。assert_eq!を使う際、比較する値が所有権を消費してしまう型だと、テストの書き方次第でコンパイルエラーになることがあります。困ったら値を借用(参照)する形に変えてみましょう。
まとめ
Rustは標準機能だけでテストが書けるのが大きな特徴です。#[test]とassert_eq!から始めて、コンパイラの安全性とテストによる動作保証を組み合わせて開発を進めましょう。
関連記事
本ページはプロモーションを含みます。
参考書籍(PR)
Rustをもっと学びたい方には「実践Rust入門[言語仕様から開発手法まで]」がおすすめです。
コメント
コメントを投稿