Rust編程-編寫自動化測試

編寫單元測試步驟:

? ? ? ? 1. 準備所需的數據????????

? ? ? ? 2. 調用需要測試的代碼

? ? ? ? 3. 斷言運行結果與我們所期望的一致

Rust的test元數據:

????????#[cfg(test)]是一個屬性宏(attribute macro)。用于控制特定的代碼段僅在測試環境中編譯。

#[cfg(test)]
mod tests {// 測試函數#[test]fn my_test() {// 測試代碼}
}

?????#[cfg(test)]的作用是確保tests模塊內的代碼僅在執行cargo test命令時被編譯和運行。

????????cfg還可以用于更復雜的條件編譯場景:

#[cfg(target_os = "linux")]
fn os_specific_function() {// Linux-specific code
}#[cfg(target_os = "windows")]
fn os_specific_function() {// Windows-specific code
}

?cfg指定目標操作系統,選擇性的編譯代碼

? ? ? ? #[test] 關鍵字:表示是測試函數

? ? ? ? 測試函數:將#[test] 添加到fn關鍵字的上一行就將函數轉變為測試函數

單元測試執行命令:

? ? ? ? cargo test命令來運行測試

? ? ? ? 這個命令會構建并執行一個用于測試的可執行文件,該文件在執行過程中會逐一調用所有標注了test屬性的函數,并生成統計測試運行成功或失敗的報告。

????????Rust能夠編譯在API文檔中出現的任何代碼示例

assert_eq! 宏

 assert_eq!(2 + 2, 4);

? ? ? ? 用于斷言兩個值相等。如果不相當則panic,單元測試失敗?

assert_ne!宏:

? ? ? ? 斷言兩個值不相等,單元測試則通過

????????確定它絕不可能?是某些值的時候的使用

????????總結:

????????????????assert_eq! 和assert_ne! 宏分別使用了==和!=運算符來進行判斷,并在斷言失敗時使用調試輸出格式({:?})將參數值打印出來,它們的參數必須同時實現PartialEq和Debug這兩個trait

????????????????這兩個trait都是可派生trait,可以通過在自定義的結構體或枚舉的定義的上方添加#[derive(PartialEq, Debug)]標注來自動實現這兩個trait。

assert! 宏檢查結果

????????assert! 宏由標準庫提供,它可以確保測試中某些條件的值為true

????????assert! 宏可以檢查代碼是否按照我們預期的方式運行。

????????assert! 宏接收一個能夠被計算為布爾類型的值作為參數:當這個值為true時,assert! 宏正常通過測試。當值為false時,assert! 宏就會調用panic! 宏,進而導致測試失敗。

? ? ? ? assert!宏傳入兩個值==,則等價于assert_eq!

添加自定義的錯誤提示信息

????????任何在assert!、assert_eq! 或assert_ne! 的必要參數之后出現的參數都會一起被傳遞給format! 宏:

assert!(result.contains("Carol"),"Greeting did not contain name, value was `{}`", result
)

其中,第二個參數會被傳給format!宏

should_panic檢查panic

? ? ? ? should_panic:編寫一個測試來檢查使用了非法值是否會如期發生panic

????????新屬性:should_panic。標記了這個屬性的測試函數會在代碼發生panic時順利通過,而在代碼不發生panic時執行失敗。

????????將#[should_panic]屬性放在了#[test]屬性之后、對應的測試函數之前

pub struct Guess{value:u32,
}impl Guess{pub fn new(value:u32) ->  Guess{if value <1 || value > 100{panic!("Guess value must be between 1 and 100,got {}",value);}Guess{value}}
}#[cfg(test)]mod tests{use super::*;#[test]#[should_panic]fn greater_than_100(){Guess::new(200);}
}

????????should_panic屬性中添加可選參數expected,讓should_panic測試更加精確一些

#[should_panic(expected = "Guess value must be less than or equal to 100")]fn greater_than_100() {

????????測試某個條件會觸發帶有特定錯誤提示信息的panic!

使用Result<T, E>編寫測試:

#[cfg(test)]
mod tests{use super::*;#[test]fn it_works() -> Result<(),String>{if 2+2 == 4{Ok(())}else {Err(String::from("two plus two does not equal for"))}}
}

不要在使用Result<T, E>編寫的測試上標注#[should_panic]

編寫返回Result<T, E>的測試,就可以在測試函數體中使用問號運算符了。

在測試運行失敗時,我們應當直接返回一個Err值

控制測試的運行方式:

cargo test同樣會在測試模式下編譯代碼,并運行生成的測試二進制文件

cargo test生成的二進制文件默認會并行執行所有的測試

可以為cargo test指定命令行參數,也可以為生成的測試二進制文件指定參數:

????????分隔符--

????????cargo test --help會顯示出cargo test的可用參數

????????運行cargo test -- --help則會顯示出所有可以用在--之后的參數

并行或串行地進行測試

????????Rust會默認使用多線程來并行執行

????????開發者必須保證測試之間不會互相依賴,或者依賴到同一個共享的狀態或環境上

????????

cargo test -- --test-threads=1

? ? ? ?指定測試執行的線程數

顯示函數輸出

? ? ? ? 默認只有在測試失敗時,我們才能在錯誤提示信息的上方觀察到打印至標準輸出(println!)中的內容。

cargo test -- --nocapture

????????在測試通過時也將值打印出來

只運行部分特定名稱的測試

????????

cargo test one_hundred

給cargo test傳遞一個測試函數的名稱來單獨運行該測試

cargo test add

指定測試名稱的一部分來作為參數,任何匹配這一名稱的測試都會得到執行

通過顯式指定來忽略某些測試

#[ignore]

添加#[ignore]屬性宏

cargo test -- --ignored

通過--ignored參數單獨運行添加了#[ignore]屬性宏的測試函數

測試的組織結構:

? ? ? ? 測試分類:單元測試(unit test)和集成測試(integration test)

????????單元測試小而專注,每次只單獨測試一個模塊或私有接口

????????集成測試完全位于代碼庫之外,訪問公共接口,并且在一次測試中可能會聯用多個模塊。

標注#[cfg(test)]可以讓Rust只在執行cargo test命令時編譯和運行該部分測試代碼,而在執行cargo build時剔除它們。

不需要對集成測試標注#[cfg(test)],因為集成測試本身就放置在獨立的目錄

單元測試:

一般將單元測試與需要測試的代碼存放在src 目錄下的同一文件中。同時也約定俗成地在每個源代碼文件中都新建一個tests模塊來存放測試函數,并使用cfg(test)對該模塊進行標注。

集成測試:

集成測試是完全位于代碼庫之外。意味著你只能調用對外公開提供的那部分接口。集成測試的目的在于驗證庫的不同部分能否協同起來正常工作

集成測試首先需要建立一個tests 目錄:項目根目錄下創建tests 文件夾,它和src 文件夾并列。Cargo會自動在這個目錄下尋找集成測試文件。我們可以在這個目錄下創建任意多個測試文件,Cargo在編譯時會將每個文件都處理為一個獨立的包。

成測試需要在代碼頂部添加語句use 包名:因為tests 目錄下的每一個文件都是一個獨立的包,所以我們需要將目標庫導入每一個測試包中

cargo test 輸出中出現了單元測試、集成測試和文檔測試這3部分

cargo test --test integration_test

cargo test時使用--test并指定文件名,可以單獨運行某個特定集成測試文件下的所有測試函數

?創建tests/common/mod.rs 將功能函數放在該文件中,這是可以被Rust理解的命名規范,rust不會將common模塊看成集成測試文件了原因:tests 子目錄中的文件不會被視作單獨的包進行
編譯,更不會在測試輸出中擁有自己的區域。

mod common;?聲明了需要引用的模塊

二進制包的集成測試

只有代碼包(librarycrate)才可以將函數暴露給其他包來調用,而二進制包只被用于獨立執行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43389.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自定義類型:聯合體

像結構體一樣&#xff0c;聯合體也是由一個或者多個成員組成&#xff0c;這些成員可以是不同的類型。 聯合體類型的聲明 編譯器只為最?的成員分配?夠的內存空間。聯合體的特點是所有成員共?同?塊內存空間。所以聯合體也叫&#xff1a;共?體。 輸出結果&#xff1a; 聯合體…

size_t 數據類型的好處

什么是size_t size_t 類型在不同的平臺上對應不同的底層整數類型&#xff0c;具體取決于平臺的指針大小。size_t 主要用于表示大小和長度&#xff0c;如數組的元素數量、緩沖區的大小等&#xff0c;它的設計目的是為了匹配指針的大小&#xff0c;以避免類型不匹配引起的錯誤。…

代碼隨想錄算法訓練營DAY58|101.孤島的總面積、102.沉沒孤島、103. 水流問題、104.建造最大島嶼

忙。。。寫了好久。。。。慢慢補吧。 101.孤島的總面積 先把周邊的島嶼變成水dfs def dfs(x, y, graph, s):if x<0 or x>len(graph) or y<0 or y>len(graph[0]) or graph[x][y]0:return sgraph[x][y]0s1s dfs(x1, y, graph, s)s dfs(x-1, y, graph, s)s dfs(…

【爬蟲入門知識講解:xpath】

3.3、xpath xpath在Python的爬蟲學習中&#xff0c;起著舉足輕重的地位&#xff0c;對比正則表達式 re兩者可以完成同樣的工作&#xff0c;實現的功能也差不多&#xff0c;但xpath明顯比re具有優勢&#xff0c;在網頁分析上使re退居二線。 xpath 全稱為XML Path Language 一種…

軟考高級第四版備考--第16天(規劃溝通管理)Plan Communication Management

定義&#xff1a;基于每個干系人或干系人群體的信息需求、可用的組織資產以及具體的項目的需求&#xff0c;為項目溝通活動制定恰當的方法和計劃的過程。 作用&#xff1a; 及時向干系人提供相關信息&#xff1b;引導干系人有效參與項目&#xff1b;編制書面溝通計劃&#xf…

【基于R語言群體遺傳學】-16-中性檢驗Tajima‘s D及連鎖不平衡 linkage disequilibrium (LD)

Tajimas D Test 已經開發了幾種中性檢驗&#xff0c;用于識別模型假設的潛在偏差。在這里&#xff0c;我們將說明一種有影響力的中性檢驗&#xff0c;即Tajimas D&#xff08;Tajima 1989&#xff09;。Tajimas D通過比較數據集中的兩個&#x1d703; 4N&#x1d707;估計值來…

vue項目中常見的一些preset及其關系

Babel的作用 Babel主要用途是用來做js代碼轉換的&#xff0c;將最新的js語法或者api轉換成低版本瀏覽器可兼容執行的代碼。 語法兼容是指一些瀏覽器新特性增加的js寫法&#xff0c;例如箭頭函數 ()>{}&#xff1b;低版本的瀏覽器無法識別這些&#xff0c;會導致一些語法解…

spark shuffle寫操作——UnsafeShuffleWriter

PackedRecordPointer 使用long類型packedRecordPointer存儲數據。 數據結構為&#xff1a;[24 bit partition number][13 bit memory page number][27 bit offset in page] LongArray LongArray不同于java中long數組。LongArray可以使用堆內內存也可以使用堆外內存。 Memor…

秋招突擊——7/9——字節面經

文章目錄 引言正文八股MySQL熟悉嗎&#xff1f;講一下MySQL索引的結構&#xff1f;追問&#xff1a;MySQL為什么要使用B樹&#xff1f;在使用MySQL的時候&#xff0c;如何避免索引失效&#xff1f;講一下MySQL的事物有哪幾種特征&#xff1f;MySQL的原子性可以實現什么效果&…

GESP C++ 三級真題(2023年9月)T2 進制判斷

進制判斷 問題描述 N進制數指的是逢N進一的計數制。例如&#xff0c;人們日常生活中大多使用十進制計數&#xff0c; 而計算機底層則一般使用二進制。除此之外&#xff0c;八進制和十六進制在一些場合也是 常用的計數制(十六進制中&#xff0c;一般使用字母A至F表示十至十五…

【區塊鏈+跨境服務】粵澳健康碼跨境互認系統 | FISCO BCOS應用案例

2020 年突如其來的新冠肺炎疫情&#xff0c;讓社會治理體系面臨前所未見的考驗&#xff0c;如何兼顧疫情防控與復工復產成為社會 各界共同努力的目標。區塊鏈技術作為傳遞信任的新一代信息基礎設施&#xff0c;善于在多方協同的場景中發揮所長&#xff0c;從 而為粵澳兩地的疫情…

uniapp上傳文件并獲取上傳進度

1. 上傳普通文件 uni.chooseMessageFile({count: 1,success: (res) > {console.log(res)console.log("res123456", res.tempFiles[0].path)const uploadTask uni.uploadFile({url: http://localhost:8000/demo,filePath: res.tempFiles[0].path,name: file,form…

CSS關于居中的問題

文章目錄 1. 行內和塊級元素自身相對父控件居中1.1. 塊級元素相對父控件居中1.2. 行內元素相對于父控件居中 2. 實現單行文字垂直居中3. 子絕父相實現子元素的水平垂直居中3.1. 方案一3.1.1. 示例 3.2. 方案二3.2.1. 示例 3.3. 方案三(推薦)3.3.1. 示例 3.4. 方案四(了解一下) …

AI大模型知識點大梳理_ai大模型的精度以下哪項描述的準確

AI大模型是什么 AI大模型是指具有巨大參數量的深度學習模型&#xff0c;通常**包含數十億甚至數萬億個參數。**這些模型可以通過學習大量的數據來提高預測能力&#xff0c;從而在自然語言處理、計算機視覺、自主駕駛等領域取得重要突破。 AI大模型的定義具體可以根據參數規模…

短信驗證碼研究:公開的短信驗證碼接口、不需要注冊的短信驗證碼接口

短信驗證碼研究&#xff1a;公開的短信驗證碼接口、不需要注冊的短信驗證碼接口 0 說明 本文提供了一個短信驗證碼接口&#xff0c;主要用于以下場景&#xff1a; 1、用于開發調試 2、用于申請驗證碼困難的企業和個人 3、用于短信驗證碼認證還沒有通過&#xff0c;但是著急…

DBeaver操作MySQL無法同時執行多條語句的解決方法

DBeaver選擇數據庫連接&#xff0c;在【驅動屬性】中將allowMultiQueries允許執行多條語句置為True

各種音頻處理器

在HiFi&#xff08;高保真&#xff09;音頻系統中&#xff0c;通常需要使用一些特定類型的音頻處理器&#xff0c;以確保音頻信號的高保真和優質輸出。以下是一些常見的音頻處理器類型及其在HiFi系統中的應用&#xff1a; DAC&#xff08;數模轉換器&#xff09;&#xff1a; …

mysql 導出導入 數據庫

導出 MySQL 數據庫可以通過多種方法實現&#xff0c;最常見的方法是使用 mysqldump 工具。以下是一些常用的導出 MySQL 數據庫的方法&#xff1a; 使用 mysqldump 工具 mysqldump 是一個命令行工具&#xff0c;用于導出 MySQL 數據庫的結構和數據。以下是基本的導出命令&…

泰迪智能科技大數據實驗室產品-實訓管理平臺介紹

高校大數據實驗室通常配備有先進的計算機硬件和軟件工具&#xff0c;以及專門的數據庫和分析平臺&#xff0c;以便研究人員和學生能夠進行復雜的數據處理、分析和解釋。主要利用大數據技術進行科學研究、技術開發和人才培養。 泰迪智能科技實訓管理平臺作為教學核心&#xff0c…

JS進階-構造函數

學習目標&#xff1a; 掌握構造函數 學習內容&#xff1a; 構造函數 構造函數&#xff1a; 封裝是面向對象思想中比較重要的一部分&#xff0c;js面向對象可以通過構造函數實現的封裝。 同樣的將變量和函數組合到了一起并能通過this實現數據的共享&#xff0c;所不同的是借助…