3A Prensibi ve NUnit ile Unit Testlerin Geliştirilmesi

Özkan Şahan
inventiv
Published in
4 min readApr 22, 2022

Bu yazımızda unit test nedir, unit testin faydaları nelerdir, unit test yazarken nelere dikkat edilmelidir ve unit test geliştirilirken kullanılan 3A prensibi nedir konularına değineceğiz. Bu konulara değindikten sonra, örnek bir unit test uygulaması yapacağız.

Unit Test Nedir?

Unit test, bir uygulamanın en küçük birimlerinin davranışlarını tek tek ve birbirinden bağımsız olarak test etmek için kullandığımız bir süreçtir. Unit testler agile bakış açısına göre uygulama testlerinin ilk basamağıdır. Genellikle uygulama geliştiriciler tarafından yazılmakla birlikte, kimi durumlarda kalite uzmanları tarafından da geliştirilebilmektedir.

Unit Testin Faydaları Nelerdir?

Test ettiğimiz her birimin istenilen şekilde çalışıp çalışmadığını doğrular.

Uygulama geliştirme sürecinin başında unit testler geliştirildiği için oluşabilecek hataların maliyetlerini düşürür.

Aynı zamanda kod için dokümantasyon görevi görüp, kodun anlaşılabilirliğini ve değiştirilebilirliğini kolaylaştırır.

Kod kalitesini artırıp belirli standartlara sahip olmasını sağlar ve kodun tekrar kullanılmasına yardımcı olur.

Unit testler aslen hata bulma amacıyla değil hatayı engelleme amacıyla geliştirilir. Bununla birlikte tüm hataları engellemez çünkü her bir birimi bağımsız olarak test eder. Birimlerin birbiriyle olan iletişiminden kaynaklı hatalar entegrasyon testleri ile test edilmelidir.

Unit Test Yazarken Nelere Dikkat Edilmelidir?

Birbirinden bağımsız en küçük kod parçacığını test edecek şekilde geliştirilmelidir. Test edeceğimiz kod parçacığının bir bağımlılığı varsa ya bu bağımlılık giderilecek şekilde kod parçacığında değişiklik yapılmalı ya da ilgili bağımlılık için mock objesi kullanılmalıdır.

Testi yazılacak kod parçacığının tüm işlevlerini test edecek şekilde geliştirilmelidir. Ancak her bir işlev için ayrı unit test senaryosu kurgulanmalıdır.

Bir test mümkün olduğunca test ettiği senaryonun ihtiyaçlarını karşılamalıdır. Test edeceği senaryonun dışında kalan herhangi bir durumu içermemelidir.

Geliştirilecek olan testin isimlendirilmesi açıklayıcı olmalı ve test senaryosunun neyi test ettiğini net olarak ifade etmelidir. Herhangi biri tarafından okunduğunda testin içeriğine bakılmadan testin senaryosunun ne olduğu anlaşılabilmelidir. Bir kod parçacığı için yazılan tüm unit testlerin isimleri o kod parçacığının dokümantasyonu görevi görmelidir.

Unit testler otomatik ve ortam bağımsız olarak çalışmalıdır. Her derleme işlemi sonrasında unit testlerin tamamı çalıştırılmalı böylece oluşan hatalar gözlemlenebilir olmalıdır. Var olan bağımlılıklar için mock objesi kullanılarak ortam bağımsız hale getirilmelidir.

Bir unit test olabilecek en kısa sürede çalışmasını bitirmelidir. Eğer unit test süresi uzuyorsa, bu durum testi yazılan kod parçacığının aslında bölünebilir parçalar içerdiğini gösterebilir. Bu durumda önce kod parçacığı refactor edilip sonra unit testler eklenmelidir.

Bir unit test bile hata aldığında derlenme süreci durdurulmalıdır. Testin neden hata aldığı test sonucu olarak açıkça belirtilmelidir. Test sonucundaki beklenen çıktının ve alınan çıktının ne olduğu gözlemlenebilmelidir.

Unit Test için 3A Prensibi Nedir?

Bu model yazılacak tüm unit testler için tek tip bir yapı sağlamak amacıyla kullanılmaktadır. Arrange-Act-Assert bölümlerinden oluşur. Bu modelin en büyük avantajı okunabilirliği artırmak ve bakım maliyetlerini düşürmektir.

  1. Arrange

Test edilecek olan senaryonun bağımlılıklarının ve ihtiyaçlarının hazırlanacağı bölümdür. Kullanılacak olan verilerin değeri testin senaryosu için anlamlı bir bilgi değilse yardımcı genel metotlar tanımlanmalıdır.

2. Act

Test edilecek kod parçacığının çağırıldığı bölümdür. İstenen parametreler gönderilerek eğer bir dönüş değeri bekleniyorsa bu dönüş değeri alınmalıdır.

3. Assert

Test senaryosundan beklenen çıktı ile act bölümünden elde edilen çıktının karşılaştırıldığı bölümdür.

Sık Kullanılan Unit Test Framework’leri

Yukarıdaki framework’lerden NUnit ile örnek bir unit test uygulaması gerçekleştireceğiz.

NUnit ile Örnek Unit Test Uygulaması

Bu uygulamamızda örnek olarak .Net Core projesi üzerinden unit test geliştirmesi yapacağız. Uygulama için varsayılan olarak herhangi bir proje açabilirsiniz. Projenizi açtıktan sonra class library tipinde bir proje ekleyiniz.

Eklediğiniz projenize aşağıdaki paketleri ekleyiniz.

Mevcut projenize aşağıdaki gibi bir “Calculator” sınıfı ekleyiniz.

Class library olarak açtığınız projeye öncelikle mevcut projenizin referansını ekleyiniz. Sonrasında aşağıdaki gibi bir “SumUnitTest” sınıfı ekleyiniz.

Unit testleri çalıştırdığınızda aşağıdaki şekilde başarılı olarak testlerin geçtiğini göreceksiniz.

Tebrikler!

Yazıyı bu bölüme kadar okuduysanız artık unit test kavramı ve nasıl geliştirilmesi gerektiği hakkında fikir sahibi oldunuz. Bunu projelerinize istediğiniz gibi genişleterek uygulayabilirsiniz.

Bu içeriği arkadaşlarım Mücahit Ballı ve Mehmet Yürek ile birlikte oluşturduk. Umarız faydalı olmuştur.

Okuduğunuz için teşekkür ederiz.

--

--