Merhaba, bugün sizlere test çeşitleri ve .Net projelerinde unit test yazma konuları hakkında bilgiler vereceğim. Çok fazla vakit kaybetmeden test çeşitlerini incelemeye başlayalım.
Unit Test
Unit Test bir programın en küçük test edilebilir parçalarının (genellikle fonksiyonlar veya metotlar) doğru çalışıp çalışmadığını kontrol etmek için kullanılan bir test türüdür. Geliştirme sürecinin erken aşamalarında hataları tespit etmeye, kodun yeniden kullanılabilirliğini ve bakımını kolaylaştırmaya yardımcı olur.
Yazılımın daha karmaşık bileşenleri ve sistemleri entegre edilmeden önce, temel yapı taşlarının sağlam olduğundan emin olunmasını sağlar.
Integration Test
Integration Test bir uygulamadaki komponent ya da modüllerin birbiri ile nasıl bir davranış sergilediğinin test edilmesidir. Amaç, bireysel modüllerin tek başına düzgün çalışmasının yanı sıra, entegrasyon sürecinden sonra bir sorun olup olmadığının test edilmesidir. Unit test ile farkı, unit testte tek bir modülün veya metodun testi yapılır fakat Integration test birden fazla modül veya sistemin etkileşimini test eder. Integration test daha yüksek seviye bir test türüdür. .net projelerinde NUnit ve MSTest, Integration test araçlarıdır.
End to End Test
End to End Test bir uygulamanın baştan sona nasıl davranış sergilediğinin test edilmesidir. Amaç, tüm sistemin entegre bir şekilde çalışıp çalışmadığını ve kullanıcıların uygulamayı beklenen şekilde kullanabildiğini doğrulamaktır.
Bir e-ticaret uygulaması üzerinde bir E2E test yapmak istiyorsanız aşağıdaki kullanıcı akışını test edebilirsiniz:
Kullanıcı giriş sayfasına gider.
Kullanıcı hesabına giriş yapar.
Ürünleri arar ve bir ürün seçer.
Sepete ekler ve ödeme işlemini tamamlar.
Sipariş özeti ekranında başarı mesajını görür.
Bu süreçte:
Kullanıcı arayüzünün (UI) düzgün çalışıp çalışmadığını,
Arka plandaki sistemlerin (API çağrıları, veri tabanı işlemleri) sorunsuz bir şekilde entegre olduğunu,
Kullanıcı deneyiminin kesintisiz olduğunu kontrol edersiniz.
UI Test
UI Test kullanıcı arayüzünün test edilmesidir, amaç kullanıcının temasta bulunduğu unsurların doğru çalışıp çalışmadığını test etmektir.
Resim-1
.net Projelerine Unit Test Yazmak
Test etmek istediğiniz uygulama herhangi bir Console App, Web App veya API uygulaması olabilir. Unit test yazabilmek için farklı Framework’ler bulunmaktadır. Bu makalede xUnit ile test yazmanın detaylarını inceleyeceğiz.
Test etmek istediğiniz projenin Solution’ında Add-> New Project kısmından Resim-2 ‘ deki gibi xUnit Test Project Template’ini seçerek test projenizi oluşturun. Bunu yaptığınızda test metotlarını yazacağınız test projeniz oluşmuş olacak.
Resim-2
Unit test yazmak temel olarak üç aşamadan oluşur.
- Arrange: Test yazılacak metodun kullanacağı kaynaklar belirlenir, nesneler oluşturulur, değişkenler tanımlanır.
- Act: Test edilecek metodun çalıştırıldığı kısımdır.
- Assert: Test ettiğimiz metodun doğrulanması aşamasıdır. Metodun döndüğü Result ya da Exception doğrulanır.
Assert aşamasında bahsettiğimiz doğrulama işlemi için kontrol edebileceğimiz durumlar neler olabilir bunlara bakalım.
Assert.Equal(expected, actual), Assert.NotEqual(expected, actual): Beklenen ve gerçek değerlerin birbirine eşit olup olmadığını doğrular.
Assert.True(condition), Assert.False(condition): Belirtilen koşulun doğru veya yanlış olduğunu doğrular.
Assert.NotNull(object), Assert.Null(object): Nesnenin null olup olmadığını doğrular.
Assert.Same(expected, actual), Assert.NotSame(expected, actual): İki nesnenin aynı nesne olup olmadığını (aynı referansa sahip olduğunu) doğrular.
Assert.Empty(collection), Assert.NotEmpty(collection): Bir koleksiyonun boş olduğunu doğrular.
Assert.IsType<int>(result), Assert.IsNotType<string>(result): Bir nesnenin belirli bir tipe sahip olup olmadığını doğrular.
Assert.Throws<TException>(Action): Belirtilen işlem sırasında belirli bir türde bir istisna oluştuğunu doğrular.
Test edeceğimiz örnek bir Calculation sınıfı oluşturarak, içinde matematiksel işlemler için metotlar oluşturalım.
Resim-3
Daha sonra oluşturduğumuz test projesinin içinde bu metotları test edebileceğimiz CalculationTest metodunu oluşturalım. Bu test metodunda, projemizde yazmış olduğumuz metotların kurallarını test edecek tüm metotları yazabiliriz. Eğer projede birden çok sınıfınız varsa bütün sınıflar için ayrı test metodu oluşturmanız kod temizliği açısından daha uygun olacaktır.
CalculationTest sınıfının içine test etmek istediğimiz durumları ekleriz. Öncelikle test yazacağımız metodun aldığı değerleri ve bu değerlere göre sonuç olarak dönmesi gereken değeri bir değişken olarak tanımlarız. Act kısmında test ettiğimiz metoda bu değerleri veririz. Sum metodunun dönmesi gereken değerin, metottan dönen değere eşit olup olmadığını Assert.Equal metodunu kullanırız. Bu Assert metotları, test etmek istediğiniz duruma göre değişkenlik gösterebilir. Yukarıda da bahsedilen Assert metotlarından ihtiyacınıza uygun olanı kullanmak testlerinizi doğrulamada yardımcı olacaktır.
Resim-4
Yazdığımız Divide metodunda farklı durumları test etmek istediğimiz için iki farklı test metodu oluşturduk.
Resim-5
Testlerin Çalıştırılması ve Debug Aşaması
Visual Studio Test Explorer ekranından Run ile test metotları çalıştırılır. Debug ile test metotları Debug edilerek, eğer test metodunuz hata alıyorsa hangi adımda hata alındığını görebilirsiniz. Testleriniz hata aldığı durumda Error Message kısmından hata detaylarını görebilirsiniz.
Resim-6
Moq Framework Nedir?
Mocklama, birim testleri yazarken dış bağımlılıkların veya nesnelerin taklit edilmesi işlemidir. Mesela gerçek bir veri tabanına bağlanmak yerine veri tabanı işlemleri taklit edilebilir. Bu taklit edilen nesnelere “Mock nesneler” denir. Mock’lama, bir nesnenin dış bağımlılıklarını kontrol altına almanıza, bu bağımlılıkların test sırasında belirli bir şekilde davranmasını sağlayarak testlerinizi daha öngörülebilir ve tekrarlanabilir hale getirir. Uygulamanızda Mock yapısını kullanmanız gerektiğinde aşağıdaki gibi Nuget Package Manager üzerinden Moq Framework’ünü indirmelisiniz. Biz de bu Framework’ü indirerek Mock’lama yapısına örnek olacak bir test metodu yazalım.
Resim-7
Mocking (Bağımlılıkları taklit Etmek)
Resim-8
Mocklama yapmak için iki önemli adım vardır.
- Mock nesnesinin oluşturulması: var mock=new Mock<IBağımlılık>();
- Davranışların tanımlanması: mock.Setup(x => x.Metod()).Returns(değer);
Test sırasında gerçek bağımlılığın yerine Mock nesnenin kullanılması ile ilgili örnek aşağıdaki şekilde olabilir. Bu örnek metotta veri tabanına yapılan ekleme işlemi ile ilgili Interface ve kullanılan Mapper Interface’i taklit edilmiştir yani Mock’lanmıştır.
Resim-9
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
Test controller logic in ASP.NET Core | Microsoft Learn
Test Minimal API apps | Microsoft Learn
TAGs: .NetCore, Unit Test, unit testing, debug, framework, xUnit, tdd, software, test types, test nedir, ASP .NET Core, test türleri