テスト

Rust コミュニティは通常、テスト対象のコードと同じソースファイルに配置されたモジュールで単体テストを作成します。これは本コースの 前の部分 で説明しており、以下のようになります。

#![allow(unused)]
fn main() {
#[cfg(test)]
mod tests {
    #[test]
    fn my_test() {
        todo!()
    }
}
}

Chromium では単体テストを別のソースファイルに配置しており、Rust でもこの方針を継続します。これにより、テストが常に検出可能になり、2 度目に(test 構成で).rs ファイルを再ビルドする必要がなくなります。

その結果、Chromium で Rust コードをテストするための次の選択肢が提供されます。

  • ネイティブ Rust テスト(例: #[test])。//third_party/rust 以外では推奨されません。
  • C++ で作成され、FFI 呼び出しを介して Rust を実行する gtest テスト。Rust コードが単なる薄いFFI レイヤであり、既存の単体テストで今後この機能が漏れなくカバーされる場合には十分です。
  • Rust で作成され、公開 API を介してテスト対象のクレートを使用する gtest テスト(必要に応じて pub mod for_testing { ... } を使用)。これについては、次の数枚のスライドで説明します。

サードパーティ クレートのネイティブ Rust テストが最終的に Chromium bot によって実行される必要があることを説明します(このようなテストが必要になることはめったになく、サードパーティのクレートを追加または更新した後にのみ必要となります)。

C++ のgtest と Rust のgtest をどのような場合に使うべきか、いくつかの例を使って説明するとよいでしょう。

  • QR には、ファースト パーティの Rust レイヤの機能はほとんどありません(単なるシン FFI グルーです)。そのため、C++ と Rust の実装の両方をテストするには、既存の C++ 単体テストを使用します(テストをパラメータ化し、ScopedFeatureList を使用して Rust を有効化または無効化できるようになっています)。

  • 仮定の、または開発中の PNG 統合では、libpng では提供されているのに、png クレートでは欠落しているピクセル変換(RGBA => BGRA、ガンマ補正など)のメモリセーフな実装が必要となる場合があります。このような機能の開発においては、別途Rustでテストを作成することが役立つ場合があります。