成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在Rust中編寫自動(dòng)化測(cè)試

開發(fā) 測(cè)試
Rust中的測(cè)試函數(shù)是用來驗(yàn)證非測(cè)試代碼是否是按照期望的方式運(yùn)行的,本篇文章主要探討了Rust自動(dòng)化測(cè)試的幾種常見場(chǎng)景。

1.摘要

Rust中的測(cè)試函數(shù)是用來驗(yàn)證非測(cè)試代碼是否是按照期望的方式運(yùn)行的, 測(cè)試函數(shù)體通常需要執(zhí)行三種操作:

  • 設(shè)置任何所需的數(shù)據(jù)或狀態(tài);
  • 運(yùn)行需要測(cè)試的代碼;
  • 斷言其結(jié)果是我們所期望的。

本篇文章主要探討了Rust自動(dòng)化測(cè)試的幾種常見場(chǎng)景。

2.測(cè)試函數(shù)詳解

在Rust項(xiàng)目工程中, 可以對(duì)任意函數(shù)進(jìn)行自動(dòng)化測(cè)試, 前提是需要在被測(cè)試函數(shù)上面加上#[test]注解, 然后運(yùn)行cargo test命令進(jìn)行函數(shù)自動(dòng)化測(cè)試, Rust會(huì)查找所有被#[test]注解的函數(shù)并自動(dòng)進(jìn)行測(cè)試。

先看下面一段代碼:

#[test]
fn add_calc() {
    let result = 1 + 2;
    assert_eq!(result, 3);
}

在上面的代碼中, 我實(shí)現(xiàn)了一個(gè)加法計(jì)算的函數(shù): add_calc(), 將加法結(jié)果保存到不可變變量result中, 并使用了assert_eq!宏來斷言1+2的結(jié)果, assert!宏由標(biāo)準(zhǔn)庫(kù)提供, 在希望確保測(cè)試過程中一些條件為true時(shí)非常有用。在函數(shù)上方加上了#[test]注解, 表示該函數(shù)將執(zhí)行自動(dòng)化測(cè)試, 運(yùn)行: cargo test看下結(jié)果:

從測(cè)試結(jié)果中, 可以看到test add_calc ... ok 這行, 表示該函數(shù)測(cè)試通過了。

現(xiàn)在我修改下斷言的結(jié)果, 將代碼修改為:

#[test]
fn add_calc() {
    let result = 1 + 2;
    assert_eq!(result, 4);
}

再次運(yùn)行cargo test命令, 返回結(jié)果如下:

可以看到, 計(jì)算的結(jié)果是3, 但斷言相等的條件是等于4, 因此函數(shù)執(zhí)行失敗, add_calc()函數(shù)自動(dòng)化測(cè)試不通過。

接下來我們?cè)偌尤胍粋€(gè)函數(shù), 看看在具有多個(gè)函數(shù)的前提下, 同時(shí)具備成功和失敗的情況, 代碼如下:

#[test]
fn add_calc() {
    let result = 1 + 2;
    assert_eq!(result, 3);
}

#[test]
fn another_method() {
    panic!("執(zhí)行失敗,拋出一個(gè)異常!")
}

在上面的代碼中, 增加了一個(gè)名為another_method()的函數(shù), 該函數(shù)直接使用panic!拋出一個(gè)異常, 直接扮演了函數(shù)執(zhí)行失敗的角色, 而上面的add_calc()函數(shù)我講assert_eq!宏修改正確, 將扮演執(zhí)行成功的角色, 使用cargo test命令看下結(jié)果:

可以看到, add_calc()函數(shù)測(cè)試沒問題, 后面用綠色ok表示, 而another_method()函數(shù)執(zhí)行失敗, 使用紅色的FAILED標(biāo)記。

3.自定義失敗信息

在上面的案例中, 我使用了assert_eq!宏來斷言結(jié)果, 同樣, 也可以向宏傳遞一個(gè)可選的失敗信息參數(shù), 可以在測(cè)試失敗時(shí)將自定義的失敗信息一并打印出來, 使用自定義信息有個(gè)好處, 當(dāng)測(cè)試失敗時(shí), 能更好的理解代碼到底出了什么問題, 看一段下面的代碼:

pub fn make_string(name: &str) -> String {
    format!("Hello,{}!", name)
}

#[test]
fn is_contain_name() {
    let result = make_string("cargo");
    assert!(result.contains("cargo"));
}

在這段代碼中, 定義了一個(gè)函數(shù)make_string, 該函數(shù)接收一個(gè)字符串參數(shù), 并在函數(shù)內(nèi)部通過format!宏格式化字符串后返回, 在函數(shù)is_contain_name()中, 傳入一個(gè)字符串"cargo", assert!會(huì)判斷make_string()函數(shù)返回的字符串中是否會(huì)包含"cargo"字符串,如果包含就是成功的,否則就失敗, 這里我們能預(yù)言結(jié)果應(yīng)該是成功的, 測(cè)試一下看看:

結(jié)果跟我們預(yù)想的一樣, 現(xiàn)在再加入一些更詳細(xì)的變化信息看看, 代碼如下:

pub fn make_string(name: &str) -> String {
    format!("Hello,{}!", name)
}

#[test]
fn is_contain_name() {
    let result = make_string("rustup");
    assert!(result.contains("cargo"), "make_string中不包含該字符串,值為:`{}`", result);
}

我在assert!宏中加入了變量打印, 假如make_string()函數(shù)沒有返回預(yù)期的結(jié)果, 那結(jié)果到底是什么,這里我們將能看到失敗原因, 測(cè)試結(jié)果如下:

從結(jié)果可以看到, 函數(shù)的確測(cè)試失敗了, 但我們看到了關(guān)鍵信息, 失敗的原因是因?yàn)閙ake_string()函數(shù)返回的字符串內(nèi)容為:Hello,rustup!,這個(gè)結(jié)果與斷言中的result.contains("cargo")結(jié)果是不同的, “Hello,rustup!”字符串中并不包含"cargo"字符串,所以函數(shù)測(cè)試失敗。

4.檢查崩潰異常

除了使用斷言宏之外, Rust還提供了一個(gè)should_panic用來檢測(cè)程序中的panic,并且提供了一個(gè)名為expected的參數(shù)用來自定義消息,看一段下面的代碼:

pub fn number_calc(value: i32) -> i32 {
    let ret_value = 40;
    if value < 0 {
        panic!("值必須大于0,傳參的值為:{}", value)
    }
    return ret_value
}

#[test]
#[should_panic(expected = "傳參不能小于0")]
fn is_contain_name() {
    let result = number_calc(-1);
}

在number_calc()函數(shù)中, 如果判斷參數(shù)傳入的值小于0, 會(huì)拋出一個(gè)panic, 為了監(jiān)視是什么原因?qū)е? 在函數(shù)is_contain_name()上面使用should_panic進(jìn)行監(jiān)控, 并使用expected參數(shù)指定自定義消息, 如果遇到傳入的參數(shù)小于0, 將觸發(fā)該消息打印, 使用cargo test運(yùn)行一下看看結(jié)果:

從結(jié)果可以看到, 的確檢測(cè)到了panic產(chǎn)生, panic打印了本身的消息, 最后一行shoud_panic也觸發(fā)了消息, 并打印出失敗的原因。

5.使用Result<T, E>測(cè)試

先看一段下面的代碼:

pub fn number_calc(value: i32) -> i32 {
    let ret_value = 40;
    if value < 0 {
        return 30
    }
    return ret_value
}

#[test]
fn is_contain_name() -> Result<(), String>{
    if number_calc(2) == 40 {
      OK(())
  }else{
    Err(String::from("結(jié)果不等于40,請(qǐng)檢查原因!"))
  }
}

在上面的代碼中, is_contain_name()函數(shù)的返回類型現(xiàn)在變?yōu)?Result<(), String>, 在函數(shù)體中, 不同于調(diào)用assert_eq!,現(xiàn)在如果測(cè)試通過,將返回Ok(()), 在測(cè)試失敗時(shí), 返回帶有String的Err錯(cuò)誤。現(xiàn)在傳入?yún)?shù)為2, 將顯示正常的結(jié)果:

現(xiàn)在我們?cè)賯魅胍粋€(gè)小于0的負(fù)值看看,結(jié)果如下:

可以看到, 如果使用Result<(), String>接收結(jié)果, 當(dāng)出來錯(cuò)誤時(shí), 將返回一個(gè)Error,并打印對(duì)應(yīng)的自定義消息。

6.總結(jié)

在本篇文章中, 我們使用#[test]注解完成了對(duì)指定函數(shù)的自動(dòng)化測(cè)試, 使用assert!宏對(duì)錯(cuò)誤進(jìn)行斷言, 在斷言中自定義錯(cuò)誤顯示消息用于查看更詳細(xì)的錯(cuò)誤原因。使用了should_panic對(duì)panci錯(cuò)誤進(jìn)行了監(jiān)控, 最后使用Result<T, E>替代斷言分別完成了代碼測(cè)試和自定義錯(cuò)誤消息打印, 在以后的實(shí)際應(yīng)用中, 可能還會(huì)有一些組合測(cè)試的場(chǎng)景出現(xiàn), 到時(shí)候再具體問題具體分析。

責(zé)任編輯:趙寧寧 來源: 二進(jìn)制空間安全
相關(guān)推薦

2011-04-18 12:52:37

自動(dòng)化測(cè)試功能測(cè)試軟件測(cè)試

2019-07-18 11:00:45

自動(dòng)化運(yùn)維測(cè)試

2024-05-06 08:08:31

2022-07-14 08:16:24

Node.js后端自動(dòng)化測(cè)試

2010-07-26 09:53:08

Perl多進(jìn)程

2022-02-17 10:37:16

自動(dòng)化開發(fā)團(tuán)隊(duì)預(yù)測(cè)

2012-02-27 17:34:12

Facebook自動(dòng)化

2021-09-03 09:56:18

鴻蒙HarmonyOS應(yīng)用

2022-09-12 16:02:32

測(cè)試企業(yè)工具

2013-05-16 10:58:44

Android開發(fā)自動(dòng)化測(cè)試

2014-04-16 14:15:01

QCon2014

2011-12-23 17:09:57

自動(dòng)化測(cè)試

2021-06-30 19:48:21

前端自動(dòng)化測(cè)試Vue 應(yīng)用

2012-12-24 22:54:31

2024-11-01 15:05:12

2018-06-22 12:40:31

Windows 10Windows黑暗模式

2018-02-25 19:29:49

自動(dòng)化數(shù)字化IT

2011-10-11 09:56:59

PhoneGapSelenium

2010-07-14 11:14:48

Perl多進(jìn)程

2010-09-08 15:25:09

自動(dòng)化測(cè)試技術(shù)網(wǎng)站鏈接測(cè)試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩中出 | 国产一级免费在线观看 | 成人h动漫精品一区二区器材 | 伊人网站在线 | 黄色毛片在线播放 | 中文字幕视频在线看5 | 国产精品视频999 | 暴草美女 | 亚洲精品大全 | 黄片毛片免费观看 | 毛片网在线观看 | 久久精品亚洲欧美日韩精品中文字幕 | 亚洲成人av一区二区 | 亚洲综合大片69999 | 亚洲一区二区视频 | 成人综合久久 | 久久精品小视频 | 亚洲性视频网站 | 亚洲视频一区在线观看 | 欧美一区不卡 | 成年人免费在线视频 | 亚洲三区视频 | 久久9热| 国产精品视频久久 | 久久综合九九 | 成人精品视频在线观看 | 国产乱码精品一区二区三区中文 | 91极品视频 | 91精品久久久久久综合五月天 | 欧美男人天堂 | 中文字幕亚洲精品 | 91在线看| 日日草夜夜草 | 亚洲字幕在线观看 | 国产超碰人人爽人人做人人爱 | 精品久久久久久亚洲精品 | 亚洲h视频| 亚洲高清视频在线 | 日本久久网 | 国产99视频精品免视看9 | 狠狠爱网址|