Yazılım Mimarisinin Unit Test Üzerindeki Etkisi

Fetiye Demircan
3 min readNov 3, 2021

--

Merhabalar,

Bu yazıda Yazılım Mimarisinin Unit Test üzerindeki etkisini inceliyor olacağız. Öncesinde Unit Test nedir, neden yazmalıyız gibi konuları ele alarak yazılım mimarisinin unit test üzerindeki önemini daha iyi vurgulayacağımızı düşünüyorum.

O halde Unit Test nedir ile başlayabiliriz. Unit Test, adından da anlaşılabileceği üzere uygulamanın en küçük birimini, uygulamanın geri kalanından bağımsız bir şekilde çalıştırarak bu birimin davranışını doğrulayan metottur diyebiliriz.

Peki neden projelerimizde Unit Test yazmalıyız?

  • Hataları erken fark etmek; test yazılarak geliştirilen projelerde yapılacak hatalar henüz geliştirme aşamasındayken fark edilir ve düzeltilir.
  • Kodu istenmeyen değişikliklerden korumak; örneğin kodda bir değişiklik yaptığınızı düşünün. Eğer beklenmedik bir hataya sebep oluyorsa, bu hata daha önce bu kod için yazmış olduğunuz testler tarafından yakalanacaktır.
  • Kod karmaşıklığını azaltmak ve daha okunabilir bir kod yazmak; bir kodu test etmek istiyorsak o kod, bağımlılıklarını en aza indirgemiş ve belirli bir kalıbı takip ediyor olmalı. Böylece tekrarlanan kod parçacıklarından da kurtulmuş oluruz.

Yukarıda bahsettiğim başlıklar neden unit test yazmalıyız sorusunun öne çıkan cevaplarından sadece birkaçı..

Projelerimizde belirli standartları olan yazılım mimarilerini takip etmenin ve unit testi projelerimize dahil etmenin sebeplerinin örtüştüğünü görebilirsiniz. Günün sonunda yaptığımız yazılımın farklı yazılımcılar tarafından okunabilmesi, en az hatayla ve maliyetle geliştirilmiş olmasını isteriz. Bunu başarabilmek için de belirli prensipleri takip etmeye çalışırız. Mesela SOLID Prensipleri, projelerimiz içerisinde kullandığımız çeşitli Design Patterns (MVVM, Viper, vb) ve proje içerisine dahil ettiğimiz çeşitli testler (Unit Test, Integration Test, UI Test, vb). Hepsi tek bir amaca uygun olarak tasarlanmış olup, kaliteli bir ürün ortaya çıkarmak için vazgeçilmez konu başlıklarından sadece birkaçıdır. Tüm bunlar bir araya getirildiğinde ise proje içerisinde belirli standartları olan bir yazılım mimarisini oluşturur.

Kötü yazılmış başkalarından miras kalan projelere unit test yazmak oldukça zordur. Çok fazla bağımlılığı mocklamak, tekrar eden kod parçalarına her seferinde test yazmak, onlarca koşulu kontrol etmek bir yerden sonra sürdürülebilir olmayabilir. Bu noktada da test yazmak oldukça zor gelebilir. Fakat zor olan test yazmak değil kodu test edilebilir hale getirmektir.

Kodu test edilebilir hale getirmek için projemiz içerisinde aşağıdaki konu başlıklarına dikkat edebiliriz:

  • Bağımlılıkları en aza indirgemek; mesela nesneleri oluşturmak için statik kod kullanmak yerine dependency injection ile constructor kullanarak oluşturmak. Böylece kod yeniden yapılandırıldığında veya bir modelin arabirimi değiştirildiğinde testleri veya nesneyi oluşturduğumuz kodun güncellenmesini kolaylaştırır.
  • Single Responsibility’e uymak (her metodun tek bir sorumluluğu olması); sınıfları veya metotları tasarlarken tüm kodu tek bir yere yazmak yerine sorumluluğuna göre bölerek ve tekrar kullanılabilir parçalar halinde yazmak. Böylece bir metot için test yazarken onlarca farklı koşul için test yazmaktan kaçınmış oluruz.
  • Belirli bir Design Pattern’i takip etmek; design pattern’ler projeyi katmanlara böler. Böylece logic, network, vb gibi işlemleri tuttuğumuz katmanlar diğer kodlardan ayrıştırılmış olacağı için o katmana test yazmak işimizi daha da kolaylaştırır.
  • Side Effect kontrolüne dikkat etmek (global ya da static değişkenler); testler belirli bir sırayla çalışmadığı için global ya da statik tanımladığımız ve sonrasında herhangi bir yerde değerini değiştirdiğimiz değişkenler testlerin stabil çalışmamasına sebep olur.

Böylece yazılım mimarilerini unit test yazmak için doğru kullanmış oluruz. Aynı zamanda unit test yazarak geliştirdiğimiz projelerde de yazdığımız kodun kalitesini arttırmış oluruz.

Tabi burda bahsettiğim başlıklar en çok tartışılanlardan sadece birkaçı, hepimizin de bildiği gibi burası derya deniz :)

Eksik veya anlaşılamayan gördüğünüz yerler varsa yorum yazabilir, görüşlerinizi paylaşabilirsiniz. Sonuçta bu konular tartışmaya açık konular olup, kesin doğrusu olmayan konulardır.

Sonraki yazılarda görüşmek üzere.. :)

--

--