Rust'ta modül testleri, yerleşik makrolar, özel nitelikler ve cargo altyapısı aracılığıyla dile entegre edilmiştir. Tarihsel olarak, C ve bazı diğer dillerde test etme – dış bir yapı olarak görülmektedir, bu da üretim kodu ile testler arasında uyumsuzluğa neden olur. Rust'ta testler, ana kodla aynı ortamda derlenir ve çalıştırılır, bu da "testlerde çalışıyor" sorununu ortadan kaldırır.
Sorun: Testler derlemeyi yavaşlatabilir, bilgi verici olmayabilir veya kötü organize edilmiş olabilir; ayrıca iyi ayrılmamış testler, kode bakımında ve okunabilirliğinde sorunlara yol açar.
Çözüm: Testler, #[test] niteliği ile işaretlenmiş özel fonksiyonlar olarak mod tests modülünde yazılır. Tüm test kodu sadece cargo test anahtar kelimesi ile derlenir ve çalıştırılır, üretim derlemesinden hariç tutulur. assert_eq!, should_panic gibi makrolar ve kurulum yöntemleri, test etmenin etkinliğini ve temizliğini artırmak için kullanılır.
Kod örneği:
pub fn add(a: i32, b: i32) -> i32 { a + b } #[cfg(test)] mod tests { use super::*; #[test] fn test_add() { assert_eq!(add(2, 2), 4); } }
Ana özellikler:
cargo test ile derlendiğinde derlenir, çıkış ikili dosyasında yer almazTestleri yalnızca iç içe modül mod tests'e koymak zorunlu mu?
Zorunlu değildir, ancak testlerin izole edilmesi ve test kodunun çıkışa sızmasını önlemek için yaygın olarak tercih edilir. Aynı zamanda #[cfg(test)] kullanmayı da kolaylaştırır.
Yalnızca belirli bir modül/dosya üzerinde testler çalıştırılabilir mi?
Evet, cargo test isim ile testin adını veya yolunu belirtmek mümkündür.
Özel fonksiyonlar test edilir mi?
Evet, test modülü aynı dosya içinde tanımlanmışsa ve use super::*; kullanıyorsa, testler bu dosyanın tüm iç fonksiyonlarına erişebilir.
Testler, ana kodla karıştırılmış, #[cfg(test)] içinde gizlenmemiş olup, başlatma için genel değişkenler kullanılmaktadır.
Artılar:
Eksiler:
Testler, iç içe modüllerde kapsüllenmiştir, test için kurulum fonksiyonları ve kontrol için assert_eq! makroları kullanılmaktadır.
Artılar:
Eksiler: