Post Page Advertisement [Top]

   Merhaba,
   Bu yazımda Unit Test nedir , nasıl kodlarız? Konularına değinip basit örnekler yapacağız.
Unit test yazılımımızı parçalara bölerek ilgili kısımı test etmek için yazdığımız kodlardır. Belirli bir durum karşısında beklediğimiz sonucu alıp alamadığımızı bu sayede analiz etmiş oluruz.Test etmek istediğimiz birimin mantıksal olarak izole edilmiş olması gerekmektedir bu kural unit test yazmada oldukça önemlidir.İzole edilmiş parçalara ayırmak oldukça önemli bir noktadır bu parça bazen bir metod bazen bir servis,özellik olabilir.



Okurken ne dinlemeli ?


Unit testler üç aşamadan oluşur.
Arrange : Unit test metod için ilklendirme işlevi görür objeleri yaratma ve ilk değerlerini set etme adımıdır.Hazırlık aşamasıdır.

Act : ve işte başlıyoruz test metodlarımızın çağrıldığı aşama.

Assert : Test sonucundan bize dönen sonuçların beklediğimiz sonuçlar olup olmadığını karşılaştırdığımız adımdır.

Unit Test yazacağımız projeden genel hatları ile bahsetmek istersek : EndGameHelmetMessaging solution'ı üç projeden oluşuyor mesajları alıp gerekli doğrulamaları yaptıktan sonra mesaj servisine ileten ve geri dönen cevabı ekranda gösteren console uygulaması , mesajları alıp işleyen bir echo servis gibi davranan WCF servis ve unit testleri yazacağımız EndGameHelmetMessaging.Test projesi.

EndGameHelmetMessaging , EndGameHelmetMessaging Service projesini referans alır. Proje için gerekli olan modellerimiz MessageRequest,Response gibi sınıflar Model altında, Ana işleri yapan sınıf MessagingManager olup ana dizinde yer almaktadır. Validate eden sınıf ise Validators klasörü altında bulunur.Gerekli interfaceleri ise Aggregates 'de bulabiliriz.

 Aşağıdaki projemiz mesaj gönderen bir uygulama ve bazı veri giriş kontrolleri mevcut(validations) ,ayrıca mesajı gönderen bir WCF servis var. İşte bu biz bu iki modül için unit test yazacağız. Mesaj uygulamamız ile ilgili bazı bilgileri anlatacak olursam:  Mesaj göndermek için SenderId ve ReceiverId olmalıdır. Mesaj içeriği boş olmamalıdır. Mesajlarımız sadece yazı karakterlerinden oluşup rakam içermemelidir.

  Göndereceğimiz mesajı validate eden sınıf yukarıda anlattığımız özellikleri doğruluyor aslında:

using EndGameHelmetMessaging.Aggregates;
using System;
using System.Text.RegularExpressions;


namespace EndGameHelmetMessaging.Validators
{
   public class MessagingValidator: IMessagingValidator
    {
      
        public MessageValidateResult MessageValidation(MessageRequest request)
        {
            MessageValidateResult response = new MessageValidateResult();

            response.IsSuccess = true;
            response.ResponseCode = ErrorCodes.success_message;

            if (String.IsNullOrEmpty(request.Message)) 
            {
                response.IsSuccess = false;
                response.ResponseCode = ErrorCodes.error_Message_empty;

            }

            if (string.IsNullOrEmpty(request.SenderId) || string.IsNullOrEmpty(request.ReceiverId))
            {
                response.IsSuccess = false;
                response.ResponseCode = ErrorCodes.error_SenderId_ReceiverId_required;

            }

            Regex regex = new Regex("^[a-zA-Z]+$");

            if (!String.IsNullOrEmpty(request.Message))
                if (!regex.IsMatch(request.Message))
                {
                    response.IsSuccess = false;
                    response.ResponseCode = ErrorCodes.error_invalid_message_content;

                }
               


            return response;
        }

    }

}

Solution'a sağ tıklayıp Add->New Project vasıtası ile New ->Test Project ekliyoruz ve isimlendirmeyi de test edeceğimiz proje ile aynı olacak şekilde sonuna .Test yazarak isimlendiriyoruz. Test Metod'larımızı isimlendirirken de belli kurallara dikkat etmemiz gerektiğini göreceğiz.



Test projemizi oluşturduktan sonra test classlarımızı ve test metodlarımızı yazmaya başlayalım ilk olarak bu yazımızda MessagingValidator.cs sınıfımızı test edeceğimiz için ilk MessageValidateTest.cs isiminde bir sınıf yaratalım. İlk adımda mesaj içeriğinin boş gönderildiğini düşünüp hata almamız gereken senaryoyu simule edelim.

Arrange kısmında beklediğimiz- olması gerektiğini düşündüğümüz MessageResponse ve MessageRequest nesnelerini yaratıp ilk değerlerini setleyelim.

Act kısmında ise MessageValidaton ile MessageValidator.cs sınıfını çağıralım.

Assert aşamasında Are.Equal ile gerçekten beklediğimiz sonuçlar ile örtüşüp örtüşmediğini kontrol edelim.


[TestClass]
    public class MessageValidateTest
    {
        [TestMethod]
        public void SendMessage_With_Null_MessageText_Then_Send_Failed_Test()
        {
            var expected = new MessageResponse
            {
                IsSuccess = false,
                ResponseCode = ErrorCodes.error_Message_empty
            };

            var message_manager = new MessagingManager();

            var messageRequest = new MessageRequest
            {
                MessageId = 1,
                Message = "",
                SenderId = "tony_stark_0001",
                ReceiverId = "Steve_Rogers_0005"
            };

            var actual = message_manager.MessageValidation(messageRequest);

            Assert.AreEqual(expected.IsSuccess, actual.IsSuccess);
            Assert.AreEqual(expected.ResponseCode, actual.ResponseCode);
        }



Testimiz yazdıktan sonra  Visual Studio'dan Test sekmesinden Run 'ı seçerek All Test ya da aşağıdaki gibi testlerimizi çalıştırıp sonuçlarını ekranın sol tarafında görebiliriz.



İlk testimiz çalıştırıp başarılı olduğunu görelim :


Benzer mantıkla aşağıdaki test metodlarını çalıştırıp anlamaya çalışmanız sizin için faydalı olacaktır. Bir sonraki konumuz WCF servisimiz test etmek olacaktır. Bu servis için AutoMoq ve Moq kütüphaneleri ile servisi taklit edip test metodu yazacağız.

 SendMessage_With_Null_SenderOrReceiverId_Then_Send_Failed_Test()
 SendMessage_With_Incorrect_MessageText_Then_Send_Failed_Test()
SendMessage_With_Correct_Request_Parameter_Then_Send_OK_Test()

Kaynak :
https://docs.microsoft.com/en-us/visualstudio/test/unit-test-basics?view=vs-2017
https://smartbear.com/learn/automated-testing/what-is-unit-testing/

Projenin tam halini buradan bulabilirsiniz.Bir sonraki yazımızda görüşmek dileği ile.
Sağlıkla kalın,
Mutlu kalın.

Hiç yorum yok:

Yorum Gönder

Bottom Ad [Post Page]