測試
Rust 社群撰寫單元測試的模組,通常會位在與所測試程式碼相同的來源檔案中。這種做法已在先前課程中介紹,如下所示:
#![allow(unused)] fn main() { #[cfg(test)] mod tests { #[test] fn my_test() { todo!() } } }
在 Chromium 中,我們將單元測試放在獨立的來源檔案中,而對 Rust 也繼續採取這項做法,這樣不僅能較一致地找到測試,也有助於避免在 test
設定中再次重新建構 .rs
檔案。
因此 Chromium 中有以下 Rust 程式碼測試選項:
- 原生 Rust 測試 (即
#[test]
)。不建議在//third_party/rust
之外使用。 - 在 C++ 中編寫的
gtest
測試,並透過 FFI 呼叫並執行 Rust。如果 Rust 程式碼只是精簡的 FFI 層,這麼做就夠充分,而現有的單元測試可為這項功能提供足夠的涵蓋率。 - 在 Rust 中編寫的
gtest
測試,並透過公用 API 使用受測試的 Crate (視需要使用pub mod for_testing { ... }
)。這是接下來幾張投影片的主題。
請提及第三方 Crate 的原生 Rust 測試最終應由 Chromium 機器人執行 (這類測試極少需要執行,只有在新增或更新第三方 Crate 後才需要)。
以下範例或許有助說明 C++ gtest
和 Rust gtest
各自的使用時機:
-
QR 在第一方 Rust 層中的功用很少 (只是精簡的 FFI 黏合工具),因此會使用現有的 C++ 單元測試,測試 C++ 和 Rust 的實作項目 (將測試參數化,方便以
ScopedFeatureList
啟用或停用 Rust)。 -
假設性/WIP PNG 整合可能需實作記憶體安全地像素轉換,這類像素轉換是由
libpng
提供,但png
Crate 中缺少 (例如 RGBA => BGRA 或伽馬校正)。這類功能可能受益於在 Rust 中編寫的獨立測試。