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

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è)計(jì)語言-簡(jiǎn)體中文版》

第九章 測(cè)試與評(píng)測(cè)

在rust中內(nèi)部構(gòu)建了測(cè)試和評(píng)測(cè)模塊,雖然目前bench模塊仍然在nightly channel。

需要手動(dòng)將rust切換到nightly版本,通過以下命令:

rustup default nightly

作為軟件工程質(zhì)量保障體系的重要一環(huán),測(cè)試是應(yīng)該引起我們充分注意并重視的事情。前面說過,Rust 語言的設(shè)計(jì)集成了最近十多年中總結(jié)出來的大量最佳工程實(shí)踐,而對(duì)測(cè)試的原生集成也正體現(xiàn)了這一點(diǎn)。很大程度借鑒了golang的部分內(nèi)容。
Rust 的測(cè)試特性按精細(xì)度劃分,分為 3 個(gè)層次:
1.函數(shù)級(jí);主要通過#[test] 標(biāo)識(shí)
2.模塊級(jí);主要通過#[cfg(test)]標(biāo)志。
3.工程級(jí);例如黑盒測(cè)試,放于test目錄下。
另外,Rust 還支持對(duì)文檔進(jìn)行測(cè)試。
一個(gè)項(xiàng)目中路徑如下:


image.png

之前提到過的Cargo.toml補(bǔ)充:
cargo.toml和cargo.lock文件總是位于項(xiàng)目根目錄下。
源代碼位于src目錄下。
默認(rèn)的庫入口文件是src/lib.rs。
默認(rèn)的可執(zhí)行程序入口文件是src/main.rs。
其他可選的可執(zhí)行文件位于src/bin/*.rs(這里每一個(gè)rs文件均對(duì)應(yīng)一個(gè)可執(zhí)行文件)。
外部測(cè)試源代碼文件位于tests目錄下。
示例程序源代碼文件位于examples。
基準(zhǔn)測(cè)試源代碼文件位于benches目錄下。

9.1 函數(shù)級(jí)測(cè)試

當(dāng)我們創(chuàng)建一個(gè)空的庫項(xiàng)目時(shí),打開src/lib.rs文件,可以看到如下代碼:

#[test]
fn it_works() {
    // do test work
}

Rust 中,只需要在一個(gè)函數(shù)的上面,加上 #[test] 就標(biāo)明這是一個(gè)測(cè)試用的函數(shù)。
有了這個(gè)屬性之后,在使用cargo build編譯時(shí),就會(huì)忽略這些函數(shù)。使用 cargo test 可以運(yùn)行這些函數(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 模塊級(jí)測(cè)試

有時(shí),我們會(huì)組織一批測(cè)試用例,這時(shí),模塊化的組織結(jié)構(gòu)就有助于建立結(jié)構(gòu)性的測(cè)試體系。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)] ,表明這個(gè)模塊是個(gè)測(cè)試模塊。一個(gè)測(cè)試模塊中,可以包含若干測(cè)試函數(shù),測(cè)試模塊中還可以繼續(xù)包含測(cè)試模塊,即模塊的嵌套。
如此,就形式了結(jié)構(gòu)化的測(cè)試體系,甚是方便。

9.3工程級(jí)測(cè)試(黑盒集成測(cè)試)

函數(shù)級(jí)和模塊級(jí)的測(cè)試,代碼是與要測(cè)試的模塊(編譯單元)寫在相同的文件中,一般做的是白盒測(cè)試。工程的測(cè)試,一般做的就是黑盒集成測(cè)試了。

我們看上圖截圖工程的目錄,在這個(gè)目錄下,有一個(gè) tests 文件夾。

extern crate rusttest;
#[test]
fn block_box_test() {
    assert_eq!(4, rusttest::add_two(2));
}

這里,比如,我們 src 中,寫了一個(gè)庫,提供了一個(gè) add_two 函數(shù),現(xiàn)在進(jìn)行集成測(cè)試。
首先,用 extern crate 的方式,引入這個(gè)庫,由于是同一個(gè)項(xiàng)目,cargo 會(huì)自動(dòng)找。引入后,就按模塊的使用方法調(diào)用就行了,其它的測(cè)試標(biāo)識(shí)與前面相同。

9.4 基準(zhǔn)測(cè)試

單元測(cè)試是用來校驗(yàn)程序的正確性的,然而,程序能正常運(yùn)行后,往往還需要測(cè)試程序(一部分)的執(zhí)行速度,這時(shí),就需要用到性能測(cè)試。 通常來講,所謂性能測(cè)試,指的是測(cè)量程序運(yùn)行的速度,即運(yùn)行一次要多少時(shí)間(通常是執(zhí)行多次求平均值)。Rust參照go實(shí)現(xiàn)了這部分內(nèi)容。

推薦基準(zhǔn)測(cè)試專門寫在benches下,否則容易編譯失敗,在使用stable channel時(shí)。
例子如下:

#![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));
    }
}

評(píng)測(cè)函數(shù)fn bench_add_two(b: &mut Bencher) {}上面使用#[bench]做標(biāo)注,同時(shí)函數(shù)接受一個(gè)參數(shù),b 就是 Rust 提供的評(píng)測(cè)器。這個(gè)寫法是固定的。
執(zhí)行

cargo bench

即可獲得結(jié)果。
可以看出,rust對(duì)測(cè)試的支持和go非常相似。

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

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

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