iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0

為程式碼測試是一件很重要的事情,不管在哪個程式語言,程式都是必須要寫的

雖然說 Rust 本身在編譯期間就會檢查基本的錯誤

不過能加上測試應該更能減少錯誤發生

今天我們就來看看 Rust 的測試該怎麼寫

我們將測試放在一個 module 中

測試屬性

先來測個簡單的加法

mod calculator {
    fn addition() {
        let result = 1 + 2;

        assert_eq!(result, 3)
    }
}

測試跑下去後,咦,為什麼是 0 個測試?

> cargo test

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

測試在 Rust 中算是一種屬性,所以我們必須要標註上去讓模組實現測試特徵

Rust 才知道這個是要跑測試的

#[cfg(test)]
mod calculator {
    #[test]
    fn addition() {
        let result = 1 + 2;

        assert_eq!(result, 3)
    }
}

再跑一次測試,這次就顯示跑了 1 次測試,並且通過了

> cargo test

running 1 test
test calculator::addition ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

測試

接著我們來把公式完整補上

程式碼基本上都會寫在測試模組外的地方

以下面例子來說,剛好都放在 main.rs 中,

所以我們可以直接使用 addition 函數或者使用 super::addition 進行引用

另外來解釋一下 assert_eq! 這個是 macro

當測試的值,不等於第二個參數時,會引發 panic!

#[cfg(test)]
mod calculator {
    use crate::addition;

    #[test]
    fn test_addition() {
        let result = addition(1, 2);

        assert_eq!(result, 3)
    }
}

fn addition(a: i32, b: i32) -> i32 {
    let result = a + b;
    result
}

自定義測試錯誤訊息

那假如說今天想自定義測試失敗的訊息呢?

可以這麼做:

先來解釋一下

這邊我們用 assert! 這個 macro,會檢查第一個參數是否為 true ,不是的話就會報錯

不過錯誤訊息易讀性不高,以下方例子來看,會報出 assertion failed: result.eq(&4)

所以通常會在後面加上自定義的錯誤訊息

eq 就如字面上所述的,看兩個參考是否為相等的值, eq 後面需要加上借用的值,也就是 &4,我們需要借用 4 來跟運算式的值做比較

#[cfg(test)]
mod calculator {
    use crate::addition;

    #[test]
    fn test_addition() {
        let result = addition(1, 2);

        assert!(result.eq(&4), "你的運算結果不等於 {}", 4)
    }
}

fn addition(a: i32, b: i32) -> i32 {
    let result = a + b;
    result
}

跑測試下去,錯誤訊息就清楚也易讀多了

running 1 test
test calculator::test_addition ... FAILED

failures:

---- calculator::test_addition stdout ----
thread 'calculator::test_addition' panicked at '你的運算結果不等於 4', src/main.rs:9:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

上一篇
Day 28 - 輸出 part 2
下一篇
Day 30 - 整合測試
系列文
成為程式界的 F1 賽車手,用 30 天認識 Rust 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言