
Rustのテスト、難しそう?いえいえ、基本をマスターすれば簡単!安全なコードへの第一歩を踏み出そう。
Rustのテストコードの書き方:ユニットテスト入門
Rustは、安全性とパフォーマンスを重視したプログラミング言語であり、テスト駆動開発(TDD)を強力にサポートしています。この記事では、Rustにおけるユニットテストの基本的な書き方について、具体的な例を交えながら解説します。
ユニットテストは、コードの個々の部分(関数、メソッド、モジュールなど)が意図したとおりに動作するかどうかを検証するためのテストです。Rustでは、#[test]アトリビュートを使ってテスト関数を定義し、assert!マクロなどを使って期待される結果と実際の結果を比較します。
CargoはRustのパッケージマネージャー兼ビルドツールであり、テストの実行もCargoを通じて行います。cargo testコマンドを実行することで、プロジェクト内のすべてのテストが実行されます。
基本的なテストの書き方
最も基本的なテストは、#[test]アトリビュートを付与した関数を定義し、assert!マクロを使って条件が真であることを確認するものです。
#[test]
fn it_works() {
assert!(true);
}このテストは常に成功します。より実用的な例を見てみましょう。
fn add(a: i32, b: i32) -> i32 {
a + b
}
#[test]
fn test_add() {
assert_eq!(add(2, 2), 4);
}assert_eq!マクロは、2つの値が等しいことを確認します。もし等しくなければ、テストは失敗し、エラーメッセージが表示されます。
assert_ne!マクロは、2つの値が等しくないことを確認します。もし等しければ、テストは失敗し、エラーメッセージが表示されます。
#[test]
fn test_not_equal(){
assert_ne!(1,2);
}テストの構成
Rustでは、テストは通常、モジュール内に記述されます。慣例として、テストモジュールはtestsという名前で、#[cfg(test)]アトリビュートを付与します。これにより、テストコードはリリースビルドには含まれません。
mod my_module {
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
#[cfg(test)]
mod tests {
use super::add;
#[test]
fn test_add() {
assert_eq!(add(2, 2), 4);
}
}
}use super::*;と記述することで、親モジュール(この例ではmy_module)の要素をテストモジュール内で使用できます。
テストの実行
テストを実行するには、ターミナルでcargo testコマンドを実行します。Cargoは、プロジェクト内のすべてのテストをコンパイルし、実行します。
テスト結果は、テストが成功したか失敗したか、および失敗した場合はその理由を示します。
cargo testは、いくつかのオプションも提供します。例えば、特定のテストだけを実行したり、テスト結果をより詳細に表示したりすることができます。詳細については、Cargoのドキュメントを参照してください。
panicを起こすかどうかのテスト
テストの中には、特定の条件下でpanic!を発生させることを期待するものもあります。Rustでは、#[should_panic]アトリビュートを使って、そのようなテストを記述できます。
fn divide(a: i32, b: i32) -> i32 {
if b == 0 {
panic!("Divide by zero error");
}
a / b
}
#[test]
#[should_panic]
fn test_divide_by_zero() {
divide(10, 0);
}このテストは、divide(10, 0)がpanic!を発生させることを期待しています。もしpanic!が発生しなければ、テストは失敗します。
参考リンク
まとめ
この記事では、Rustにおけるユニットテストの基本的な書き方について解説しました。#[test]アトリビュート、assert!マクロ、cargo testコマンドなどを活用することで、堅牢なRustアプリケーションを開発できます。テスト駆動開発(TDD)を取り入れ、積極的にテストコードを記述することで、より信頼性の高いコードを作成しましょう。

