自動テストを書く
1972年のエッセイ「The Humble Programmer」で、エドガー・W・ダイクストラは「プログラム テストはバグの存在を示すには非常に効果的な方法になりうるが、その不在を示すには 絶望的なまでに不十分である」と述べています。だからといって、できる限り多くを テストしようとしなくてよい、という意味ではありません!
私たちのプログラムにおける 正しさ とは、コードが私たちの意図したとおりのことを 行う度合いのことです。Rust はプログラムの正しさを非常に重視して設計されています が、正しさは複雑であり、証明するのは容易ではありません。Rust の型システムはこの 負担の大部分を担いますが、型システムですべてを捉えられるわけではありません。そ のため、Rust には自動ソフトウェアテストを書くためのサポートが含まれています。
たとえば、渡された数値に 2 を足す関数 add_two を書いたとします。この関数のシグ
ネチャは整数を引数として受け取り、結果として整数を返します。その関数を実装してコ
ンパイルするとき、Rust はこれまで学んできた型チェックと借用チェックをすべて行い、
たとえばこの関数に String の値や無効な参照を渡していないことを保証します。しか
し Rust には、この関数が私たちの意図どおりに正確に動作すること、つまり引数に 10
を足したり 50 を引いたりするのではなく、引数に 2 を足した値を返すことまでは
確認できません。そこでテストの出番です。
たとえば、add_two 関数に 3 を渡したとき、返される値が 5 であることを検証す
るテストを書くことができます。コードに変更を加えるたびにこれらのテストを実行すれ
ば、既存の正しい振る舞いが変わっていないことを確認できます。
テストは複雑な技能です。良いテストの書き方に関するあらゆる詳細を 1 章で網羅する ことはできませんが、この章では Rust のテスト機能の仕組みについて説明します。テ ストを書くときに利用できるアノテーションやマクロ、テストを実行する際に提供される デフォルトの挙動やオプション、そしてテストをユニットテストと統合テストにどのよう に整理するかについて取り上げます。