Unit Test Metotları
Unit Test Nedir ?
Unit Test günümüz yazılım dünyasında artık olmazsa olmaz bir kural olarak bütün projelerde yazılması zorunlu hale gelmektedir. Bir fonksiyonu bir uygulamanın test edilebilir en küçük parçası olarak da tanımlayabiliriz aslında.İdeal olarak, her bir test metodu diğerlerinden bağımsızdır. Kodun tasarımını karşıladığından ve amaçlandığı gibi davrandığından emin olunur. Unit test ile ilk olarak test metotlarını çalıştırılır ve metotlardan herhangi biri fail verdiğinde deploy’u durdurup developer’ı bilgilendirir.
Unit Testin Avantajları
a) Unit testlerin olmadığı projelerde developer herhangi bir fonksiyonelliği test edebilmek için projeyi ayağa kaldırıp ilgili arayüze bağlanıp hataları çalışma zamanında bulacaktır. Hatayı düzeltip tekrar çalıştırıp tekrar aynı işlemleri yapacaktır. Bu da yazılımcıya geliştirmenin ilerleyen aşamalarında çok büyük zaman kaybı olarak dönecektir. Unit testlerin en büyük avantajı, bu işlemlerin hiç birini yapmadan kendi oluşturduğumuz dummy datalarla bu hataları arayüz katmanına bağlanmadan tespit edip zaman kaybından kurtulmaktır.
b) Doğru yazılmış unit testler fonksiyonlarımızın single responsibilty prensibine uyduğunun güvencesidir. Single responsibilty prensibine göre her fonksiyon tek bir amaca hizmet eder. Eğer bir fonksiyon kendi içerisinde birden fazla işlem yapmaya ve karmaşıklaşmaya başlıyorsa bu fonksiyon daha küçük parçalara ayrılmalıdır anlamına gelir ve fonksiyon karmaşıklaştıkça o fonksiyona unit test yazması da zor bir hal alır. Kısaca bir fonksiyona unit test yazarken olması gerekenden fazla zorlanıyorsanız, orda bir durup düşünüp fonksiyonunuza tekrar bakmanız gerekebilir 🙂
c) Dependency Injection gibi kalıpların doğru kullanımına yardımcı olur. Unit testi yazılan kod her zaman unit testi yazılmayan koda göre daha kalitelidir.
1) Assert.AreEqual (Eşitlik Testi)
Parametredeki değerlerin birbirine eşit olmasını kontrol eder. Eğer değerler eşitse test başarılı, değerler eşit değilse başarısız olacaktır.
Aşağıdaki iki metodun da sonucu başarılı olarak dönecektir.
[TestMethod] public void TestAreEqual_FarkliTur() { int islemSonucu = 10; decimal olmaliBeklenen = 10; Assert.AreEqual(islemSonucu, olmaliBeklenen); }
[TestMethod] public void TestAreEqual_AyniTur() { int islemSonucu = 10; int olmasiBeklenen = 10; Assert.AreEqual(islemSonucu, olmasiBeklenen); }
2) Assert.AreNotEqual (Eşitsizlik Testi)
Parametredeki değerlerin birbirine eşit olmama durumunu kontrol eder. Eğer değerler eşit değilse test başarılı, eşitse başarısız olacaktır.
Aşağıdaki test sonucu başarılı olacaktır.
[TestMethod] public void TestAreNotEqual() { int islemSonucu = 10; int olmasiBeklenen = 20; Assert.AreNotEqual(islemSonucu, olmasiBeklenen); }
3) Assert.AreSame (Aynılık Testi)
Parametredeki değerlerin aynı olmasını kontrol eder. Eğer aynı ise test başarılı değil ise başarısız olacaktır. Buradaki aynılık kavramını yukarıdaki eşitlik kavramından ayıran durum , parametrelerin değer olarak değil değişkenlerin aynı olması yani değişkenlerin bellekte tutulan adreslerinin aynı olması durumudur. Bu sebepten aşağıdaki ilk test metodunun sonucu başarılı ikincisinin sonucu ise başarısız dönecektir.
[TestMethod] public void TestAreSame_Dizi() { int[] notlar = { 10, 20, 30 }; int[] notlar2 = notlar; Assert.AreSame(notlar, notlar2); }
[TestMethod] public void TestAreSame_Dizi() { int[] notlar = { 10, 20, 30 }; int[] notlar2 = { 10, 20, 30 }; Assert.AreSame(notlar, notlar2); }
- Burada önemli bir nokta ise referans tipli değişkenlerle değer tipli değişkenleri birbirinden ayırmaktır. Referans tipli değişkenlerde bir değişkeni diğerine atadığınızda o değişkenin bellekteki yerini bir diğer değişkene geçirirken değer tipli değişkenlerde sadece değerini diğer değişkene atamış olursunuz. Dolayısıyla aşağıdaki testin sonucu başarısız olarak gelecektir.
[TestMethod] public void TestAreSame_Dizi() { int notlar = 10; int notlar2 = notlar; Assert.AreSame(notlar, notlar2); }
4) Assert.AreNotSame (Aynı olmama testsi)
Parametredeki değerlerin aynı olmamasını kontrol eder. Eğer değerler aynı değilse test başarılı, aynıysa başarılı olacaktır.
[TestMethod] public void TestAreSame_Dizi() { int notlar = 10; int notlar2 = notlar; Assert.AreNotSame(notlar, notlar2); }
5) Assert.Fail(Başarısızlık Testi)
Testi hatalı olarak döndürmeyi sağlayan metoddur. Aşağıdaki örnekte test metodu çalıştırıldığında işlem başarısız olacaktır.
[TestMethod] public void TestFail() { Assert.Fail(); }
6) Assert.IsFalse (Değerin false olma testi)
Parametredeki değerin false olmasını kontrol eder. Eğer false ise test başarılı , true ise başarısızdır. Dolayısıyla aşağıdaki test metodu başarılı sonuç dönecektir.
[TestMethod] public void TestIsFalse() { bool sonuc = false; Assert.IsFalse(sonuc); }
7) Assert.IsTrue (Değerin true olma testi)
Parametredeki değerin true olmasını kontrol eder. Eğer true ise test başarılı , falseise başarısızdır. Dolayısıyla aşağıdaki test metodu başarılı sonuç dönecektir.
[TestMethod] public void TestIsTrue() { bool sonuc = true; Assert.IsTrue(sonuc); }
8) Assert.IsNull (Değerin null olma testi)
Parametredeki değerin null olmasını kontrol eder. Eğer null ise test başarılı , null değil ise başarısızdır. Dolayısıyla aşağıdaki test metodu başarılı sonuç dönecektir.
[TestMethod] public void TestIsNull() { bool? sonuc = null; Assert.IsNull(sonuc); }
9) Assert.IsNotNull (Değerin null olmama testi)
Parametredeki değerin null olmamasını kontrol eder. Eğer null değil ise ise test başarılı , null ise başarısızdır. Dolayısıyla aşağıdaki test metodu başarılı sonuç dönecektir.
[TestMethod] public void TestIsNotNull() { bool sonuc = true; Assert.IsNotNull(sonuc); }