為程式碼測試是一件很重要的事情,不管在哪個程式語言,程式都是必須要寫的
雖然說 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