測試

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 中編寫的獨立測試。