Rust學(xué)習(xí)筆記9 測試與評測

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 還支持對文檔進行測試。
一個項目中路徑如下:


image.png

之前提到過的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非常相似。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容