تست‌کردن

جامعه Rust معمولاً unit testهای را در یک ماژول قرار می‌دهد که در همان فایل منبع کد مورد آزمایش قرار می‌گیرد. این مورد قبل‌تر در دوره پوشش داده شده بود و به این صورت است:

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

در Chromium باید unit testها را در یک فایل منبع جداگانه قرار دهیم و همچنان این روش را برای Rust دنبال می‌کنیم --- این باعث می‌شود تست‌ها به طور مداوم قابل کشف باشند و کمک می‌کند از بازسازی فایل‌های .rs برای بار دوم (در پیکربندی test) جلوگیری شود.

این منجر به گزینه‌های زیر برای تست کد Rust در Chromium می‌شود:

  • تست‌های Native Rust (یعنی #[test]). خارج از //third_party/rust مناسب نیست.
  • تست‌های gtest که در C++ نوشته شده‌اند و Rust را از طریق تماس‌های FFI انجام می‌دهند. زمانی که کد Rust فقط یک لایه نازکی از FFI است و unit testها موجود، پوشش کافی برای ویژگی‌هایی که ارائه می‌کنند کافی است.
  • آزمایش‌های gtest که در Rust نوشته شده‌اند و از crate تحت آزمایش از طریق API عمومی آن استفاده می‌کنند (در صورت نیاز از pub mod for_testing { ... } » استفاده می‌کنند. این موضوع در چند اسلاید بعد معرفی شده است.

ذکر کنید که تست‌هایnative Rust در مورد crateهای شخص ثالث باید در نهایت توسط روبات‌های Chromium انجام شود. (چنین آزمایشی به ندرت مورد نیاز است --- فقط پس از افزودن یا به‌روز‌رسانی crateهای شخص ثالث.)

برخی از مثال‌ها ممکن است به توضیح اینکه چه زمانی باید از C++ gtest در مقابل Rust gtest استفاده شود کمک کند:

  • ‏ QR عملکرد بسیار کمی در لایه Rust شخص اول دارد (این فقط یک چسب FFI باریک است) و بنابراین از unit testهای++C موجود برای آزمایش ++C و اجرای Rust استفاده می‌کند (تست‌ها را پارامتر می‌کند تا Rust را با استفاده از یک ScopedFeatureList آن را فعال یا غیرفعال کند.

  • ‏ Hypothetical/WIP PNG ممکن است نیاز به پیاده‌سازی ایمن از حافظه تبدیل‌های پیکسلی داشته باشد که توسط libpng ارائه شده‌اند اما در png crate وجود ندارند - به عنوان مثال. RGBA => BGRA یا تصحیح‌گر گاما (gamma correction). چنین عملکردی ممکن است از آزمایش های جداگانه‌ای که در Rust نوشته شده است بهره‌مند شود.