~/Ali GÖREN

Unit Test Yazarak Rust Öğrenmek

Ali Goren · · 4 dk okuma

Unit Test Yazarak Rust Öğrenmek


Genel olarak bahsetmek gerekirse herkesin öğrenebilme yetenekleri farklıdır. Örneğin kimisi bazı kodlamalar yaparak İngilizce dilini öğrenebilir.

Aynı şekilde bir programlama dilinden bahsederken de farklı şekillerde öğrenme yöntemleri olabiliyor. Örneğin bir backend developer bu süreci yine bir web uygulaması yaparak aşabiliyor. Beni göz önüne alacak olursak bu yazının başlığı aslında “REST API Geliştirerek Rust Öğrenmek” olabilirdi.

Unit Test Alışkanlığı Kazanmak Önemlidir

Günün sonunda hangi programlama dili ile çalışırsak çalışalım, eğer kodumuzun davranışıyla alakalı kuşkularımız var ise unit test yazabiliyoruz. Örnek verecek olursak float değer dönmesi gereken bir fonksiyonun integer bir değer dönmesi gerçek bir probleme işaret edebilir. Bu nedenle ben öğrendiğim yeni teknolojileri ya da dilleri unit test yazarak öğreniyorum. Çalışma şeklim ise şöyle oluyor;

testproc test_a_function:
  
     assert!(a_function(), "a string");

Yukarıdaki saçma örnek size bir şey ifade etmemiş olabilir. Yaptığım şeyi kısaca doğmamış çocuğa don biçmek olarak ifade edebilirim.

Henüz tanımlanmamış olan a_function fonksiyonu için çoktan bir test yazdım bile. Kafamda bunun işi bu diyorum. Tabii ki gerçek dünyada işler böyle yürümüyor. Bu farklı bir konu :)

Bu aşamadan sonra ise bahsettiğim fonksiyonu yazmaya başlıyorum. Örneğin şöyle bir fonksiyonu test ediyorum

proc a_function:
   return "aa string";

Sanırım test sonucum fail verecek… Hmm. Peki test sonucumun fail vermesi kötü bir şey mi? Aslında bu pragmatik bir durum çıkarıyor. Testin fail etmesi sana fayda sağlıyor mu? Ya hiç fail olmadan yani testsiz fail bir süreç production ortamında çalışıyorsa? Bunu önlemek istiyorsan test yazmanın değerini, olası riskleri azalma gibi bir fayda ile ölçmüleyebilirsin. Bla bla bla!

Rust Öğrenme Süreci

Şimdi gelelim Rust kısmına. Rust öğrenme sürecim yeni değil. Daha öncesinde İngilizce yazdığım blog yazıları da oldu. Rust kısacası performans ve güvenlik odaklı, kendine ait mükemmel dokümantasyonu ve toolları olan bir programlama dili. Çoğu kişinin dikkatini performans ve güvenlik çekmiş olabilir.

Derleme zamanında size sağladığı memory-safe ve thread-safe controlleri ile bu kısımda oluşabilecek problemler konusunda sizi bilgilendiriyor. Zaten öyle bir sorun var ise derleyemiyorsunuz o ayrı :) Gerçi kesin konuşmak istemiyorum, en azından çoğu türdeki bugları elediğini kendisi söylüyor.

Peki Ben Rust ile Nasıl Unit Test Yazıyorum

Açıkcası yazı burada size ipucu sağlıyordur. Ancak genel olarak Rust ile iki tür test yapıldığına denk gelebilirsiniz. İlk parçası direkt bir kütüphaneyi test etmek gibi. Yani ortada executed bir durum yok, bir output yok sadece library yazdınız, bir başka proje bunu kullanacak. Kullanmadan önce o library için testleri hazırlayabilirsiniz.

Ben ise öğrenirken mutlaka output alabildiğim, içerisinde main fonksiyonu olan yani CLI output veren projelerle test ediyorum.

Örnekler

Yeni proje açınca sizi şöyle bir kod parçacığı karşılar

fn main() {
    println!("Hello, world!");
}

Ben ise hemen bu fonksiyonun altına test yazmaya başlıyorum. İlk proje için yazacağımız test şöyle olsun

#[cfg(test)]
mod tests {
    use crate::first_function;

    #[test]
    fn message_is_validate() {
        assert_eq!(first_function(), "Hello, world!");
    }
}

Şu anlık cft attribute’unun ne olduğu önemli değil ancak bir tür conditional checking olduğunu söyleyebiliriz. Nerede kalmıştık? Elimizde bir unit test var. Bu haliyle test etmeye çalışalım diyeceğim ancak;

cargo test

sizi bu aşamada uyaracak ve diyecek ki;

^^^^^^^^^^^^^^ not found in this scope

Şu anda çocuk doğmadı diyebiliriz. Hadi gelin bu çocuğu doğuralım.

fn first_function() -> &'static str {
"Hello, world!"
}

Çabuk doğdu fark ederseniz 😛 Basitçe yukarıdaki testin çalışabileceği fonksiyonu yazdık diyebiliriz. Şimdi tekrar bu fonksiyon için testi çalıştıralım;

cargo test

Tabii ki her developer’ın hayali olan “ok” değerini görüyoruz :)

running 1 test
test tests::message_is_validate ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Tabii ki stokastik süreçlerin testleri bu kadar basit olmuyor :) Ancak basitçe bir dili böyle öğrendiğimi söyleyebilirim. Uzmanı mı oldun falan demeyin. Bir konuda uzmanlaşmak ve onu anlamaya çalışmak farklı şeyler. Ben ikincisini yapıyorum :)

Yazı Özeti

Bu tarz öğrenme yöntemi bana unit test bilinci katıyor. Tabii ki herkesin öğrenme şekli farklıdır. Ancak unit test projelerinizde kaçınılmaz olduğunda ve bunu uygulamadığınızda daha büyük sorunlar kapıda olabilir.

Bu nedenle bu tarz bir öğrenme ile olmasa da unit test bilincini bir şekilde edinmeniz faydalı olur diye düşünüyorum. Belki sizin bir dili öğrenme şekliniz önce ilgili konu ardından var olan fonksiyonlar üzerine test yazmak şeklinde de olabilir.

Kaynaklar

Rust Programming Language

Okuduğunuz için teşekkür ederim :)