テスト
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でテストを作成することが役立つ場合があります。