ProgramlamaRust geliştirici

Rust'ta 'unit tests' (modül testleri) nasıl uygulanır, doğru şekilde nasıl organize edilir ve test kodunun güvenilirliği ve okunabilirliğini sağlamak için hangi teknikler kullanılır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Testler sadece cargo test ile derlendiğinde derlenir, çıkış ikili dosyasında yer almaz
  • Nitelikler ve makrolar aracılığıyla dile tamamen entegre
  • Modüllere göre kolay test organizasyonu, genel ve özel test fonksiyonları olabilir

Soru-Cevap.

Testleri 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.

Yaygın hatalar ve anti-patronlar

  • Test modüllerinin koddan ayrılmaması (#[cfg(test)] olmadan)
  • Testler içinde kod tekrarının veya karmaşık mantıkların varlığı
  • assert_eq! kullanmamak veya aşırı karmaşık kontroller yapmak

Gerçek hayattan bir örnek

Olumsuz durum

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:

  • Hızlı prototip oluşturma

Eksiler:

  • Test kodu çıkışa girer
  • Testler koddaki değişiklikler nedeniyle bozulur ve izole değildir

Olumlu durum

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:

  • Testlerin üretim kodundan izole edilmesi
  • Testlerin hızlı ve öngörülebilir şekilde çalıştırılması

Eksiler:

  • Disiplin ve dosya yapısının düzgün olması gerekmektedir