0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Effective-Rustlings-jp】Day 20:ユニットテスト以上のものを書こう(最終回!!)

Last updated at Posted at 2025-01-27

はじめに

こんにちは。細々とプログラミングをしているsotanengelです。
この記事は以下の記事の連載です。

他の連載記事 (詳細)

また本記事はEffective Rust(David Drysdale (著), 中田 秀基 (翻訳))を参考に作成されております。とてもいい書籍ですので興味を持った方は、ぜひ読んでみてください!

あと今回最終回です!
最後まで取り組んだ皆さん、本当にお疲れ様でした!!!

今日の内容

概要

Rustではユニットテスト以外にも様々なテストを実行することができます。
今回はいくつかのテストを実際に書いてみましょう。

書籍で紹介されていたテストの一覧

テスト名称 概要
ユニットテスト ある関数の動作をテストする
結合テスト クレート内部にアクセスせず、公開APIだけテストする挙動テスト
ドックテスト ドックコメント内部で公開APIをテストする
サンプルコード example配下のコードで公開APIをテストする
ベンチマーク コードの性能をテストする
ファズテスト ランダムな入力に晒すことでクラッシュなどを検知する

色んなテストを書いてみよう

問(リンク)

ドックテスト、ベンチマークテストを書いてみましょう。

コード (詳細)
#![feature(test)]
// ↑ Nightly Rust のみで使用できる機能 (#[bench] などのため)
//   Stable Rust ではこの行と benchmark 関連の箇所を削除するか、
//   代わりに Criterion などのベンチマーククレートを利用してください。

extern crate test; // Nightly Rust のベンチマーク用クレート

/// 2つの整数を足し合わせる関数
///
/// # Examples
///
/// ```
/// let result = add(2, 3);
/// // TODO: add関数を使った結果が5になることをassert_eq!でテストしてください。
///
/// ```
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

/// メイン関数
fn main() {
    let x = 5;
    let y = 7;
    // TODO: add関数を使って、xとyを足し合わせた結果をresultに格納してください。
    let result;
    println!("{x} + {y} = {result}");
}

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

    /// ユニットテスト
    #[test]
    fn test_add() {
        assert_eq!(add(0, 0), 0);
        assert_eq!(add(1, 2), 3);
        assert_eq!(add(-5, 5), 0);
    }

    /// ベンチマーク
    /// 実行コマンド (Nightly Rust):
    /// `cargo +nightly bench`
    #[bench]
    fn bench_add(b: &mut Bencher) {
        b.iter(|| {
            // TODO: add関数を以下に記載し、ベンチマークテストを実行してください。
            //       aとbの値はどんな値でも構いません。
        });
    }
}

解答(リンク)

コード参照。

コード (詳細)
#![feature(test)]
// ↑ Nightly Rust のみで使用できる機能 (#[bench] などのため)
//   Stable Rust ではこの行と benchmark 関連の箇所を削除するか、
//   代わりに Criterion などのベンチマーククレートを利用してください。

extern crate test; // Nightly Rust のベンチマーク用クレート

/// 2つの整数を足し合わせる関数
///
/// # Examples
///
/// ```
/// let result = add(2, 3);
/// assert_eq!(result, 5);
/// ```
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

/// メイン関数
fn main() {
    let x = 5;
    let y = 7;
    let result = add(x, y);
    println!("{x} + {y} = {result}");
}

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

    /// ユニットテスト
    #[test]
    fn test_add() {
        assert_eq!(add(0, 0), 0);
        assert_eq!(add(1, 2), 3);
        assert_eq!(add(-5, 5), 0);
    }

    /// ベンチマーク
    /// 実行コマンド (Nightly Rust):
    /// `cargo +nightly bench`
    #[bench]
    fn bench_add(b: &mut Bencher) {
        b.iter(|| {
            // ベンチマークしたい処理
            // コンパイラーが最適化でループを削除してしまうため、「std::hint::black_box」という恒等関数を入力とする。
            add(std::hint::black_box(1000), std::hint::black_box(999))
        });
    }
}

さいごに

もしも本リポジトリで不備などあれば、リポジトリのissueやPRなどでご指摘いただければと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?