github地址:https://github.com/bradyjoestar/rustnotes(歡迎star!)
pdf下載鏈接:https://github.com/bradyjoestar/rustnotes/blob/master/Rust%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.pdf
參考:
https://rustcc.gitbooks.io/rustprimer/content/ 《RustPrimer》
https://kaisery.github.io/trpl-zh-cn/ 《Rust程序設(shè)計語言-簡體中文版》
第九章 測試與評測
在rust中內(nèi)部構(gòu)建了測試和評測模塊,雖然目前bench模塊仍然在nightly channel。
需要手動將rust切換到nightly版本,通過以下命令:
rustup default nightly
作為軟件工程質(zhì)量保障體系的重要一環(huán),測試是應(yīng)該引起我們充分注意并重視的事情。前面說過,Rust 語言的設(shè)計集成了最近十多年中總結(jié)出來的大量最佳工程實踐,而對測試的原生集成也正體現(xiàn)了這一點。很大程度借鑒了golang的部分內(nèi)容。
Rust 的測試特性按精細(xì)度劃分,分為 3 個層次:
1.函數(shù)級;主要通過#[test] 標(biāo)識
2.模塊級;主要通過#[cfg(test)]標(biāo)志。
3.工程級;例如黑盒測試,放于test目錄下。
另外,Rust 還支持對文檔進行測試。
一個項目中路徑如下:

之前提到過的Cargo.toml補充:
cargo.toml和cargo.lock文件總是位于項目根目錄下。
源代碼位于src目錄下。
默認(rèn)的庫入口文件是src/lib.rs。
默認(rèn)的可執(zhí)行程序入口文件是src/main.rs。
其他可選的可執(zhí)行文件位于src/bin/*.rs(這里每一個rs文件均對應(yīng)一個可執(zhí)行文件)。
外部測試源代碼文件位于tests目錄下。
示例程序源代碼文件位于examples。
基準(zhǔn)測試源代碼文件位于benches目錄下。
9.1 函數(shù)級測試
當(dāng)我們創(chuàng)建一個空的庫項目時,打開src/lib.rs文件,可以看到如下代碼:
#[test]
fn it_works() {
// do test work
}
Rust 中,只需要在一個函數(shù)的上面,加上 #[test] 就標(biāo)明這是一個測試用的函數(shù)。
有了這個屬性之后,在使用cargo build編譯時,就會忽略這些函數(shù)。使用 cargo test 可以運行這些函數(shù)。類似于如下效果:
$ cargo test
Compiling adder v0.0.1 (file:///home/you/projects/adder)
Running target/adder-91b3e234d4ed382a
running 1 test
test it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
此外,可以使用的屬性還有:
[ignore]
[should_panic]
9.2 模塊級測試
有時,我們會組織一批測試用例,這時,模塊化的組織結(jié)構(gòu)就有助于建立結(jié)構(gòu)性的測試體系。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 的上面寫上 #[cfg(test)] ,表明這個模塊是個測試模塊。一個測試模塊中,可以包含若干測試函數(shù),測試模塊中還可以繼續(xù)包含測試模塊,即模塊的嵌套。
如此,就形式了結(jié)構(gòu)化的測試體系,甚是方便。
9.3工程級測試(黑盒集成測試)
函數(shù)級和模塊級的測試,代碼是與要測試的模塊(編譯單元)寫在相同的文件中,一般做的是白盒測試。工程的測試,一般做的就是黑盒集成測試了。
我們看上圖截圖工程的目錄,在這個目錄下,有一個 tests 文件夾。
extern crate rusttest;
#[test]
fn block_box_test() {
assert_eq!(4, rusttest::add_two(2));
}
這里,比如,我們 src 中,寫了一個庫,提供了一個 add_two 函數(shù),現(xiàn)在進行集成測試。
首先,用 extern crate 的方式,引入這個庫,由于是同一個項目,cargo 會自動找。引入后,就按模塊的使用方法調(diào)用就行了,其它的測試標(biāo)識與前面相同。
9.4 基準(zhǔn)測試
單元測試是用來校驗程序的正確性的,然而,程序能正常運行后,往往還需要測試程序(一部分)的執(zhí)行速度,這時,就需要用到性能測試。 通常來講,所謂性能測試,指的是測量程序運行的速度,即運行一次要多少時間(通常是執(zhí)行多次求平均值)。Rust參照go實現(xiàn)了這部分內(nèi)容。
推薦基準(zhǔn)測試專門寫在benches下,否則容易編譯失敗,在使用stable channel時。
例子如下:
#![feature(test)]
extern crate test;
extern crate rusttest;
#[cfg(test)]
mod testbinwen {
use rusttest::add_two;
use test::Bencher;
#[bench]
fn bench_add_two(b: &mut Bencher) {
b.iter(|| add_two(2));
}
}
評測函數(shù)fn bench_add_two(b: &mut Bencher) {}上面使用#[bench]做標(biāo)注,同時函數(shù)接受一個參數(shù),b 就是 Rust 提供的評測器。這個寫法是固定的。
執(zhí)行
cargo bench
即可獲得結(jié)果。
可以看出,rust對測試的支持和go非常相似。