0Pricing
Learn Rust Coding · レッスン

ユニットテスト

test属性

「ユニットテスト」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

Rustでのテスト

Rustにはテスト機能が組み込まれているため、外部フレームワークは必要ありません。テストは #[test] が付いた通常の関数で、cargo test によって実行されます。

最初のテスト

テスト関数は引数を取らず、アサーションを使います。正常に戻れば成功し、パニックすると失敗します。

fn add(a: i32, b: i32) -> i32 {
    a + b
}

#[test]
fn it_adds() {
    assert_eq!(add(2, 3), 5);
}

fn main() {
    println!("{}", add(2, 3));
}

アサーションマクロ

標準的なアサーションは次のとおりです。

  • assert!(cond) — 条件が false の場合に失敗
  • assert_eq!(a, b) — 等しくない場合に失敗
  • assert_ne!(a, b) — 等しい場合に失敗
fn main() {
    let x = 4;
    assert!(x > 0);
    assert_eq!(x, 4);
    assert_ne!(x, 5);
    println!("All assertions passed");
}

testsモジュール

慣例として、ユニットテストは #[cfg(test)] が付いたモジュールに記述します。これにより、テスト時にのみコンパイルされます。

fn square(n: i32) -> i32 {
    n * n
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn squares_correctly() {
        assert_eq!(square(5), 25);
    }
}

fn main() {
    println!("{}", square(5));
}

use super::*

テストモジュールは入れ子になっているため、use super::* を使うと親モジュールのアイテム(テスト対象の関数など)をスコープに取り込めます。

テストの実行

cargo test はすべてのテストをコンパイルして実行します。成功、失敗、無視されたテストの数が報告されます。

cargo test

パニックのテスト

#[should_panic] を使うと、特定の条件で関数がパニックすることを検証できます。

fn checked_div(a: i32, b: i32) -> i32 {
    if b == 0 {
        panic!("division by zero");
    }
    a / b
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    #[should_panic(expected = "division by zero")]
    fn panics_on_zero() {
        checked_div(10, 0);
    }
}

fn main() {}

Resultを返すテスト

テストでは Result を返せるため、? 演算子を使えます。Err を返すとテストは失敗します。

fn parse(s: &str) -> Result<i32, std::num::ParseIntError> {
    s.parse::<i32>()
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn parses_number() -> Result<(), std::num::ParseIntError> {
        let n = parse("42")?;
        assert_eq!(n, 42);
        Ok(())
    }
}

fn main() {}

テストを無視する

時間のかかるテストや環境に依存するテストには #[ignore] を付けます。cargo test -- --ignored で明示的に実行できます。

#[test]
#[ignore]
fn expensive_test() {
    // long-running work
}

fn main() {}

便利なテストフラグ

テスト実行時に便利なオプション:

  • cargo test name — 名前に一致するテストを実行
  • cargo test -- --nocapture — println の出力を表示
  • cargo test -- --test-threads=1 — 直列に実行

プライベート関数のテスト

テストモジュールは同じファイル内に入れ子になっているため、プライベート関数にもアクセスできます。これは統合テストにはできないことで、ユニットテストの重要な利点です。

fn internal(n: i32) -> i32 {
    n + 1
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn tests_private() {
        assert_eq!(internal(4), 5);
    }
}

fn main() {
    println!("{}", internal(4));
}

理解度チェック

Cargo が実行するテストとして関数をマークする属性はどれですか?

まとめ

Rust に組み込まれたテストについて学びました:

  • #[test] でテスト関数をマークする
  • アサーションには assert!、assert_eq!、assert_ne! がある
  • テストは use super::* を持つ #[cfg(test)] モジュールに記述する
  • #[should_panic] と Result を返すテストでエラーを扱う
  • cargo test ですべてを実行する

よくある質問

「ユニットテスト」レッスンは無料ですか?

はい。「ユニットテスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「ユニットテスト」で何を学びますか?

test属性 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「ユニットテスト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ユニットテスト
  2. 統合テスト
  3. ドキュメントコメント
  4. ドキュメントテスト
← Learn Rust Codingに戻る