###### tags: `Rust` `test` # Better Rust 1 Rustの応用知識 より良いRustを書くためのtips # 1. テストの書き方 1番かんたんな方法は、 #[test] アトリビュートを書くこと ## #[test] 1. テストコードの準備 以下のようなlib.rsを用意 ```rust= #[test] fn it_works() { } ``` 2. テストの実行 `cargo test` 3. 結果確認 ``` test it_works ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured ``` ## テスト結果 ok/ng の判定は、 コード内で **panic!** が発生するか否か なんにも書いてないコードはokになる。 ## テストを失敗させる panic!を起こせばいい ```rust= #[test] fn it_works() { assert!(false); } ``` ## panic!するのを成功にする #[shoud_panic] アトリビュートをテスト関数につける また、引数で expected(エラーメッセージ) を指定して、指定のエラーのときだけ 成功にできる。 ```rust= #[test] #[should_panic(expected = "assertion failed")] fn it_works() { assert_eq!("Hello", "world"); } ``` ## テストのステータスコード `cargo test` を実行後に `echo $?` で$?環境変数を表示 - 0 : 成功 - 否0 : 失敗 ## 「リアル」なテスト 実際にテストを書くときはこんなかんじ ```rust= pub fn add_two(a: i32) -> i32 { a + 2 } #[test] fn it_works() { assert_eq!(4, add_two(2)); } ``` ## #[ignore] #[ignore] アトリビュートのついたテストはデフォルトで無視される 実行時コストの高いテストを基本無視するとき使える。 cargo test コマンドにオプションを付けることで実行できる `cargo test -- --ignored` --ignored アトリビュートはテストバイナリの引数であって、Cargoのものではない # tests module 今までの書き方は慣用的ではない 慣用に乗っ取るなら、test moduleを作り、#[cfg(test)] アトリビュートをつける ```rust= pub fn add_two(a: i32) -> i32 { a + 2 } #[cfg(test)] mod tests { use super::add_two; #[test] fn it_works() { assert_eq!(4, add_two(2)); } } ``` 変更点 - mod キーワード - use で外のスコープのテストしたい関数を持ち込み - #[cfg(test)] こうすることのメリット - すべてのテストをグループ化できる - クレートの一部に含まれないようにできる - cfg(test)アトリビュートにより、 `cargo test` のときだけビルドされる - 通常ビルド時間の短縮 # tests/ ディレクトリ 結合テストは testsディレクトリを作成 tests/lib.rs に書く ```rust= extern crate tester; #[test] fn it_works() { assert_eq!(4, adder::add_two(2)); } ``` 結合テストを書くための慣用的な方法 全てはテストのためだけの空間なので、tests moduleを書く必要はない # ドキュメンテーションテスト ```rust= //! `adder`クレートはある数値を数値に加える関数を提供する //! //! # Examples //! //! ``` //! assert_eq!(4, adder::add_two(2)); //! ``` /// この関数は引数に2を加える /// /// # Examples /// /// ``` /// use adder::add_two; /// /// assert_eq!(4, add_two(2)); /// ``` pub fn add_two(a: i32) -> i32 { a + 2 } #[cfg(test)] mod tests { use super::*; #[test] fn it_works() { assert_eq!(4, add_two(2)); } } ``` - //! : モジュールレベルのドキュメント - /// : 関数レベルのドキュメント - \``` : テストコードを書くブロック - マークダウン記法をサポート
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up