はじめに
#NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる
- 最近Claudeにobsitdian読みこませて目標を立ててみている
今日読む場所
#NO IMAGE自動テストを書く - The Rust Programming Language 日本語版
お勉強
#メモ
#プログラムの正当性は、どこまで自分のコードが意図していることをしているかなのです。 Rustは、プログラムの正当性に重きを置いて設計されていますが、 正当性は複雑で、単純に証明することはありません。Rustの型システムは、 この重荷の多くの部分を肩代わりしてくれますが、型システムはあらゆる種類の不当性を捕捉してはくれません。 ゆえに、Rustでは、言語内で自動化されたソフトウェアテストを書くことをサポートしているのです。
- どこまで行ってもそうだよねー
コンパイラはプログラマがまさしく意図したことを関数が実行しているかどうかは確かめられません。
- まあそうだよね
いいテストの書き方をあらゆる方面から講義することは1章だけではできないのですが、 Rustのテスト機構のメカニズムについて議論します。テストを書く際に利用可能になるアノテーションとマクロについて、 テストを実行するのに提供されているオプションと標準の動作、さらにテストをユニットテストや統合テストに体系化する方法について語ります。
- この辺ちゃんと学びたかった
テストは、テスト以外のコードが想定された方法で機能していることを実証するRustの関数です。 テスト関数の本体は、典型的には以下の3つの動作を行います:
1.必要なデータや状態をセットアップする。
2.テスト対象のコードを走らせる。
3.結果が想定通りであることを断定(以下、アサーションという)する。
- どこでもそうか
cargo testコマンドでテストを実行したら、コンパイラはtest属性で注釈された関数を走らせるテスト用バイナリをビルドし、 各テスト関数が通過したか失敗したかを報告します。
- そうか、当たり前だがバイナリをビルドするんだ、知らなかった。
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}
- おー
assert_eqってmacroなんだ
関数本体は、assert_eq!マクロを使用して、2 + 2が4に等しいことをアサーションしています。
- 想定通りだった
テスト出力の次の部分、つまりDoc-tests adderで始まる部分は、ドキュメンテーションテストの結果用のものです。
- んーなんじゃそら、新しい概念だな
各テストは、新規スレッドで実行され、メインスレッドが、テストスレッドが死んだと確認した時、 テストは失敗と印づけられます。
- パラレルじゃないわけね
assert!マクロは、標準ライブラリで提供されていますが、テスト内の何らかの条件がtrueと評価されることを確かめたいときに有効です。
- ふむ
testsモジュールは、内部モジュールなので、外部モジュール内のテスト配下にあるコードを内部モジュールのスコープに持っていく必要があります。
- やばい、ここ理解できてなくて何を言ってるかわからんぞ
- geminiに聞こう
ロジックと同じファイルにテストを書く場合、mod tests を使うのが今でも標準です。
- んー理解できた
#[cfg(test)]
mod tests {
use super::*; // これで「親(lib.rsなど)」が持っているRectangleをさらに引き継ぐ
}
- ここは別のスコープ扱いなんだな
まとめ
#- testの書き方は概ね理解できた
#[cfg(test)]
mod tests {
- 上記がどうしても理解できなくて詰まってしまったが理解した
- 別スコープとして考える必要があるってことだった
- 全然進んでないけど明日はここ
- おそらくサクっと終わる気がする