Merhaba arkadaşlar, bu hafta ASP.NET MVC yazı dizisinin son konusu olan unit testing'den bahsedeceğim. Bu yazıda unit testing'in öneminden ve ASP.NET MVC'de nasıl unit test yapıldığından bahsedeceğim.
Neden Unit Test?
Mesela elinizde bir web uygulaması var ve bir anda aklınıza bu üzerinde çalıştığınız uygulamayla ilgili bir ilham geldi. Uygulamaya uyguladığınızda, uygulamayı daha iyi bir hale getirecek bir değişiklik olduğunun farkına vardınız. Bu değişiklik, uygulamaya yeni bir özellik de ekliyor olabilir ya da bir hatayı düzeltmekle ilgili de olabilir. Bu değişikliği yapmak için bilgisayarın başına geçtiğinizde aklınıza şu soru takılıyor: "bu geliştirmeyi yapmak ne kadar güvenli?". Ya yapılan değişikliğin bir yan etkisi varsa ya da çalışan bir şeyi bozuyorsa? Bu değişikliği uygulamak çok az zaman alabilir, ama ya bütün uygulama senaryolarını elle test etmek çok fazla zaman alıyorsa? Ya bir senaryoyu atladıysanız ve çalışan uygulamanın çalışmamasına neden olduysanız? Uygulamada bu geliştirmeyi yapmak bunca çabaya değer miydi?
Otomatik testler, bu gibi durumlarda uygulamanızı sürekli geliştirmeniz için güvenli bir yol sağlıyor, ve üzerinde çalıştığınız koddan korkmamanızı sağlıyor.
Daha önceki yazılarımda da bahsettiğim gibi ASP.NET MVC'nin Web Forms'a göre en büyük avantajlarından biri çok daha kolay test edilebilir olmasıydı. ASP.NET MVC Framework'ü uygulamalarda unit test yapmayı kolaylaştırıyor ve daha doğal bir hale getiriyor.
Unit test'ler bir uygulamadaki en düşük seviyeyi çok dar bir odak çerçevesinde onaylamayı hedefler. Bir unit test'te test edilen birim bir sınıf hatta bir sınıftaki metot gibi çok spesifik ve düşük seviye bir bileşendir. Bir unit test'in amacı test edilen birimin altındaki mantığı test etmektir. Yani kısacası, başarısız bir unit test, kodda bir bug olduğunun göstergesidir.
Unit test'in daha iyi anlaşılması için aşağıda basit bir unit test örneğini görebilirsiniz:
[TestMethod] public void CalculatorShouldAddTwoNumbers() { var sum = new Calculator().Add(1, 2); Assert.AreEqual(1 + 2, sum); }
Yukarıdaki kodu açıklamak gerekirse, bu testte Calculator sınıfının yeni bir nesnesi oluşturuluyor ve onun Add() metoduna toplanması gereken iki sayı gönderilerek bu metot çağrılıyor. Daha sonra test Assert.AreEqual() metoduyla, Add() metodunun yapması gereken şeyi yani iki sayıyı toplamasının doğruluğunu kontrol ediyor.
Visual Studio'da Test Projesi Oluşturulması
.NET Framework için Visual Studio Unit Test ve NUnit gibi bir çok unit testing framework'ü mevcuttur. Ben bu yazımda Visual Studio Professional ve üstünde mevcut olarak gelen Visual Studio Unit Test'den bahsedeceğim.
Yukarıda bahsettiğim otomatik testleri oluşturmak için Visual Studio'da bu testleri içerecek bir test projesi oluşturulması gerekiyor. Visual Studio'da bir test projesi normal bir sınıf kütüphanesi projesinden ibarettir. Bu proje bir grup test sınıfından oluşmaktadır ve bu her sınıf o sınıfın metotları olarak temsil edilen testleri içermektedir. Bu her metot test edilen birimi oluşturmaktadır.
Visual Studio'da test projesi oluşturmanın bir kaç yolu mevcuttur.
İlk yol yeni ASP.NET projesi dialoğundaki "Create a unit test project" seçeneğini işaretlemektir.
Ya da alternatif olarak var olan bir solution'a yeni bir test projesi eklemek için File, Add, New Project menüsünü seçerek Test kategorisindeki Unit Test Project tipi seçilebilir.
Unit Test Oluşturulması ve Çalıştırılması
Projenin çalıştığından emin olmak için yeni bir unit test eklemek istersek yapmamız gereken şey: unit test projesine sağ tıklayarak Add, Unit Test seçeneğini seçmektir. Daha sonra oluşan sınıfın metodunun içine testle ilgili mantık kısmı yazılabilir. Aşağıda buna bir örnek görebilirsiniz:
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace MVCTestProject.Tests { [TestClass] public class UnitTestExample { [TestMethod] public void CanAddTwoNumbersTogether() { var sum = 1 + 2; Assert.AreEqual(3, sum); } } }
Daha sonra testi çalıştırmak için kod editöründe herhangi bir yere sağ tıklayarak Run Tests seçeneği seçilebilir. Bu işlem unit test projesini derleyecektir ve testlerin durumunu görebileceğiniz Test Explorer penceresini getirecektir. Testler tamamlandığında o testin yanında testin geçtiğine dair yeşil bir işaret görülecektir.
Controller'ların Test Edilmesi
ASP.NET MVC test edilebilirlik de düşünülerek oluşturulan bir framework olduğu için projedeki herhangi bir sınıfın yeni bir nesnesini oluşturmak ve bunu bir unit test içinde çalıştırmak da çok kolaydır. Controller'ları da basit sınıflar olarak düşünürsek, bunları test etmek de çok kolaydır. Mesela HomeController içindeki Index action'ını test etmek istersek, yapılması gereken tek şey bu controller'ın nesnesini oluşturup onun Index action'ını çağırmaktır. Basit bir örnek olması açısından aşağıdaki gibi Index action'ının bir view döndürüp döndürmediğini test edebiliriz.
[TestClass] public class HomeControllerTests { [TestMethod] public void ShouldReturnView() { var controller = new HomeController(); var result = controller.Index(); Assert.IsInstanceOfType(result, typeof(ViewResult)); } }
ASP.NET yazı dizisinin bu son yazısında unit testing'den bahsetmeye çalıştım, ASP.NET MVC'de kullanımı ile ilgili örnekler gösterdim. Başka bir yazı dizisinde daha görüşünceye dek şimdilik hoşça kalın.
Kaynaklar:
- Programming ASP.NET MVC 4 - O'Reilly
0 yorum :