Makale Özeti

Unit testler, developer'ın yazdığı kodu test edecek kodu yazarak, bu yazdığı kodları bir engine ile birlikte çalıştırarak, yazılan programın doğruluğunu test etmesidir. Unit testler Agile development yöntemlerinden biridir. Bir projenin yaşam döngüsüne baktığımızda developer testleri önemli bir yer tutmaktadır. Ama genellikle bu safha, çeşitli nedenlerden dolayı atlanır. Daha önceleri NUnit gibi toollar ile Unit testleri yazabiliyorduk. Ama artık Visual studio içerisinde entegre bir tool'umuz var. Unit testlerin yazılmadığı durumlarda developer kendi kodunu, manuel olarak test etmektedir. Fakat bu işlem, kodun çalıştırılması ve bir kullanıcı gibi test edilmesi şeklinde olmaktadır. Bu işlem aslına bakıldığında bir developer testi değildir. Bu daha çok bir test kullanıcısı şeklinde olmaktadır. Bu yöntemle test süreleri daha uzun olacak ve testin doğruluğu kesin olmayacaktır.Unutmamalıyız ki manuel yapılan testlerde gözden kaçan durumlar oluşabilecektir. Unit testler bize otomatik olarak kod testleri yapmamızı sağlayacaktır. Projenin realize olduktan sonraki güncellemelerinde unit testlerin önemi daha da önem kazanmaktadır. Çünkü modüller içerisindeki güncellemelerin projenin bütünü üzerindeki etkileri görülebilmektedir. Böylelikle projenin içerisindeki yapılan değişikliklerin doğruluğundan kesinlikle emin olabiliriz.

Makale

VSTS ile Unit Testlere Giriş
 
Unit testler, developer'ın yazdığı kodu test edecek kodu yazarak, bu yazdığı kodları bir engine ile birlikte çalıştırarak, yazılan programın doğruluğunu test etmesidir. Unit testler Agile development yöntemlerinden biridir.
 
Bir projenin yaşam döngüsüne baktığımızda developer testleri önemli bir yer tutmaktadır. Ama genellikle bu safha, çeşitli nedenlerden dolayı atlanır. Daha önceleri NUnit gibi toollar ile Unit testleri yazabiliyorduk. Ama artık Visual studio içerisinde entegre bir tool'umuz var.
 
Unit testlerin yazılmadığı durumlarda developer kendi kodunu, manuel olarak test etmektedir. Fakat bu işlem, kodun çalıştırılması ve bir kullanıcı gibi test edilmesi şeklinde olmaktadır. Bu işlem aslına bakıldığında bir developer testi değildir. Bu daha çok bir test kullanıcısı şeklinde olmaktadır. Bu yöntemle test süreleri daha uzun olacak ve testin doğruluğu kesin olmayacaktır.Unutmamalıyız ki manuel yapılan testlerde gözden kaçan durumlar oluşabilecektir. Unit testler bize otomatik olarak kod testleri yapmamızı sağlayacaktır.
 
Projenin realize olduktan sonraki güncellemelerinde unit testlerin önemi daha da önem kazanmaktadır. Çünkü modüller içerisindeki güncellemelerin projenin bütünü üzerindeki etkileri görülebilmektedir. Böylelikle projenin içerisindeki yapılan değişikliklerin doğruluğundan kesinlikle emin olabiliriz.
 
Şimdi örnek bir sınıf oluşturup, bu sınıf için Unit testlerimizi yazmaya başlıyalım.
 
“Invoice” adında bir sınıf oluşturalım.
 
Invoice.cs
public class Invoice
    {
        private decimal _amount;
        private bool _isPaid;
        public Invoice(decimal amount)
        {
            this._amount = amount;
            this._isPaid = false;
        }
 
        public bool Pay(decimal amount)
        {
            if (amount != this._amount)
            {
                throw new Exception("Ödeme tutarı fatura tutarıyla aynı olmalıdır.");
            }
            else
            {
                this._isPaid = true;
            }
            return true;
        }
        public bool IsPaid
        {
            get { return this._isPaid; }
        }
    }
 
 
 
Bu Invoice.cs dosyamız üzerinde sağ-klik ile açılan menüden “Create Unit Tests..” menüsünü tıklayalım.
 
 
 
Menüyü tıkladığımızda aşağıdaki pencere açılacak ve bize hangi metod ve property'ler için, test yazmak istediğimizi soracaktır. Ayrıca “Output project” ile test projemizi seçmemiz istenecektir. Daha önce solutionumuzda bir unit test projesi yok ise, bizden unit test projesi için isim girmemizi isteyecektir. Uygun bir isim girip OK’ e basalım. Bu şekilde yeni bir unit test projesi solutionumuza eklemiş olduk.
 
 
VSTS bizim için bir InvoiceTest.cs dosyası oluşturup, içerisine uygun kodları yazdı ve bize de değiştirmemiz gereken yerleri TODO' lar ile belirtti. Oluşturulan test kodu aşağıdadır.
 
InvoiceTest.cs
// The following code was generated by Microsoft Visual Studio 2005.
// The test owner should check each test for validity.
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Text;
using System.Collections.Generic;
using UnitTestDemoLib;
namespace UnitTest
{
    /// <summary>
    ///This is a test class for UnitTestDemoLib.Invoice and is intended
    ///to contain all UnitTestDemoLib.Invoice Unit Tests
    ///</summary>
    [TestClass()]
    public class InvoiceTest
    {
 
 
        private TestContext testContextInstance;
 
        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }
        #region Additional test attributes
        //
        //You can use the following additional attributes as you write your tests:
        //
        //Use ClassInitialize to run code before running the first test in the class
        //
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //Use ClassCleanup to run code after all tests in a class have run
        //
        //[ClassCleanup()]
        //public static void MyClassCleanup()
        //{
        //}
        //
        //Use TestInitialize to run code before running each test
        //
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //Use TestCleanup to run code after each test has run
        //
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion
 
 
        /// <summary>
        ///A test for Pay (decimal)
        ///</summary>
        [TestMethod()]
        public void PayTest()
        {
            decimal target_amount1 = 0; // TODO: Initialize to an appropriate value
 
            Invoice target = new Invoice(target_amount1);
 
            decimal Pay_amount2 = 0; // TODO: Initialize to an appropriate value
 
            bool expected = false;
            bool actual;
 
            actual = target.Pay(Pay_amount2);
 
            Assert.AreEqual(expected, actual, "UnitTestDemoLib.Invoice.Pay did not return the expected value.");
            Assert.Inconclusive("Verify the correctness of this test method.");
        }
 
    }
 
 
}
 
 
Bu sınıfımız içerisindeki PayTest metodumuzu değiştirmeden, üst menüden “Test à Start Selected  Test Project with debugger” ile test projemizi çalıştıralım. Projemizi debug etmek istemezsek, “without debugger” menüsünü tıklayarabiliriz.
 
 
Bu şekilde çalıştırdığımızda testimizin fail ettiğini göreceğiz. Şimdi gerekli düzenlemeleri “PayTest” metodumuz içerisinde yapalım.
 
 
 
 
  [TestMethod()]
        public void PayTest()
        {
            decimal target_amount1 = 100; // TODO: Initialize to an appropriate value
 
            Invoice target = new Invoice(target_amount1);
 
            decimal Pay_amount2 = 100; // TODO: Initialize to an appropriate value
 
            bool expected = false;
            bool actual;
 
            actual = target.Pay(Pay_amount2);
 
            Assert.AreNotEqual(expected, actual, "Ödeme hatalı çalışıyor.");
 
        }
 
Kodumuzu test etmek için “Assert” sınıfının metodlarını kullanmaktayız. Bu sınıfı detaylı olarak daha sonraki makalelerde belirteceğim. Ama şimdilik “Assert.AreNotEqual” ve “Assert.AreEqual” metodlarını kısaca açıklayayım.
 
Assert.AreNotEqual
“expected” değerin “actual” değere eşit olmaması durumu bizim için doğru ise kullanabiliriz. “expected” ve “actual” birbirine eşit ise yazılan mesajı verecektir.
Assert.AreEqual
“expected” değerin “actual” değere eşit olması durumu bizim için doğru ise kullanabiliriz. “expected” ve “actual” birbirinden farklı ise yazılan mesajı verecektir.
 
 
Kodumuzu çalıştırdığımızda “Test Results” ekranında “Passed” yazısını göreceğiz.
 
 
Şimdi “Pay_amount2” değişkenimizin değerini 90 yapalım ve bir daha çalıştıralım. Aşağıda gördüğümüz gibi kodumuz hata alacak ve hata mesajını yanında belirtecektir.
 
 
Şimdi Invoice class'ımızdaki  IsPaid property si  için de test metodları oluşturalım. Bunun için de aynı unit testlerimizi yeni oluştururken yaptığımız gibi “Invoice.cs” dosyasını açalım ve sağ-klik ile “Create Unit Tests..” menüsünü tıklayalım. Açılan pencereden “IsPaid” i tıklayalım. Eğer ki Pay metodunu bir daha seçersek, “PayTest1” adıyla yeni bir metod oluşturacaktır. Ok butonuna tıkladığımızda IsPaidTest adı ile test metodumuz oluşturulacaktır. IsPaidTest metodumuz içerisinde uygun değişiklikleri yaptıktan sonra metodumuz aşağıdaki şekilde olacaktır.
 
 
[TestMethod()]
        public void IsPaidTest()
        {
            decimal amount = 50; // TODO: Initialize to an appropriate value
 
            Invoice target = new Invoice(amount);
            decimal payAmount = 50;
            target.Pay(payAmount);
            bool val = true; // TODO: Assign to an appropriate value for the property
 
 
            Assert.AreEqual(val, target.IsPaid, "IsPaid metodu hatalı çalışıyor.");
        }
 
Bu şekilde çalıştırdığımızda kodumuzun testten geçtiğini göreceğiz.
 
 
 
Unit testler tabiki bu kadar değil. Unit testlerinin detayına ve çeşitlerine ileriki makaleler ile  devam edeceğiz.