• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 23.04.2016 00:55:33C programlama 2 oyun
  • 20.04.2016 16:34:41Local Database
  • 15.04.2016 14:26:15Fatura kayıt işlemi
  • 21.03.2016 01:55:30C# problem

Popüler Sorular

  • 27.05.2012 05:49:50Asp.Net ile Date time alana veri ekleyemiiyorum ?
  • 2.04.2012 00:45:18.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 12.05.2012 08:44:49Acil Yardım
  • 27.05.2012 13:46:51veri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LINQ
  • LibreOffice
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

WCF Servisleri için Unit Test

Yazdığımız programların belirli kriterlere göre test edilmesi proje süreçleri içerisinde önem arz eden konulardan birisidir. Bilindiği üzere pek çok test çeşidi vardır. Bunların bir kısmı standart haline gelmiş tekniklerden oluşmaktadır.

01.01.2013

Yazar: Burak Selim Şenyurt (Google+)

Kategori: WCF

4042

Merhaba Arkadaşlar,

Yazdığımız programların belirli kriterlere göre test edilmesi proje süreçleri içerisinde önem arz eden konulardan birisidir. Bilindiği üzere pek çok test çeşidi vardır. Bunların bir kısmı standart haline gelmiş tekniklerden oluşmaktadır. Örneğin web uygulamalarının beliri bir düzenle çalıştırılaran Request' ler ile test edilmesi. Stres testlerine tabi tutularaktan çok sayıda request sonrası web uygulamasının çalışmasının analiz edilmesi veya en basit anlamda bir programın çalışmasının ana parçalarından olan metodlarının, beklenen sonuçları verip vermediğinin araştırılması vb...

Nesne yönelimli programlama(Object Oriented Programming) dilleri ile geliştirilen uygulamalarda, özellikle metod bazında yapılan birim testlerini(Unit Test) WCF servislerine de uygulayabiliriz. Bu kısa yazımızda söz konusu işlemin Visual Studio ile birlikte gelen Test Tool' u yardımıyla nasıl gerçekleştirebileceğimizi incelemeye çalışacağız. Konu ile ilişkili olarak internette eğer araştırma yaparsanız, test amacıyla NUnit gibi araçlardan da faydalanabileceğimizi görebilirsiniz. Nitekim bazı durumlarda test yapan tarafta Visual Studio gibi bir araç olmayabilir ve NUnit aracı ile söz konusu analizler kolayca yapılabilir.

Şimdi elimizde kobay olarak kullanacağımız basit bir WCF servisi olduğunu düşünelim. Bu konu ile uğraşırken yaptığım araştırmalarda pek çok sitede,  dört işlemin ele alındığına şahid oldum. Geleneği bozmadan devam edelim :) Servisimizi Visual Studio 2008 Professional ortamında geliştirebiliriz. Sözleşme(Contract) ve uygulayıcı tip içeriklerimiz aşağıdaki kodlarda görüldüğü gibidir.

IAlgebraService arayüzü(Interface)

using System.ServiceModel;

[ServiceContract]
public interface IAlgebraService
{
    [OperationContract]
    double Toplama(double x, double y);

    [OperationContract]
    double Cikarma(double x, double y);

    [OperationContract]
    double Carpma(double x, double y);

    [OperationContract]
    double Bolme(double x, double y);
}

Uygulayıcı sınıf (AlgebraService.cs);

public class AlgebraService
    : IAlgebraService
{
    #region IAlgebraService Members

    public double Toplama(double x, double y)
    {
        return x + y;
    }

    public double Cikarma(double x, double y)
    {
        return x - y;
    }

    public double Carpma(double x, double y)
    {
        return x * y;
    }

    public double Bolme(double x, double y)
    {
        return x / y;
    }

    #endregion
}

Operasyonlarımızı AlgebraService.svc isimli servis üzerinden host ettiğimizi düşünecek olursak aşağıdaki web.config ayarlarını test amacıyla kullanabiliriz.

Görüldüğü gibi çok basit olarak BasicHttpBinding bağlayıcı tipini kullanan dolayısıyla HTTP bazlı hizmet veren bir servisimiz var. Böyle bir servis geliştirildiğinde developer' ların test etmek amacıyla ilk yapacağı iş servisin tarayıcı üzerinden erişilebilirliğidir. Ki bu sayede geliştirici kendini biraz iyi hisseder :) Ancak bizim amacımız servis metodlarının birim olarak test edilmesidir. Bu amaçla Solution içerisinde yeni bir Test Project açmak ilk adımımız olacaktır. (Test Project şablon olarak Unit Test için gerekli nitelikleri içeren assembly' ın referansını otomatik olarak içerir. Dolayısıyla işimiz kolaylaştıran bir şablondur.)

Test projesi içerisinde önemli olan noktalardan birisi, test edilmek istenen metodları kapsülleyen tipin bir servis sınıfı olmasıdır. Bir başka deyişle, test projesi söz konusu metodları deneyecekse eğer, AlgebraService isimli servise ulaşabiliyor ve metodlarını çağırabiliyor olmalıdır. Bu açıdan bakıldığında yapılan testin gerçekten birim testi olduğu açıktır.

İlerlemek için servisin, test projesine referans edilmesi yeterlidir. 

Şekildende görüleceği üzere amacıma ancak ikinci test projesinde ulaşabilmiş durumdayım :) Dikkat edilmesi gereken bir hususda proje referanslarında Microsoft.VisualStudio.QualityTools.UnitTestFramework assembly' ının var olmasıdır. Bu assembly içerisinde yer alan nitelikleri(attributes) birim testini yapacak sınıfı yazarken kullanıyor olacağız. Tahmin edileceği üzere bir Test Project oluşturulduğunda Wizard yardımıyla hızlı ve kolay bir şekilde ilerlenebilir. Ben örneğimizde Wizard kullanmadan ilerlemeyi denedim ve aşağıdaki test sınıfını oluşturdum.

using Microsoft.VisualStudio.TestTools.UnitTesting;
using TestProject2.Calculus;

namespace TestProject2
{
    [TestClass]
    public class CalculusUnitTest
    {
        private AlgebraServiceClient client = null;

        [TestInitialize]
        public void Baslat()
        {
            client = new AlgebraServiceClient();
        }

        [TestCleanup]
        public void Bitir()
        {
            if(client.State== System.ServiceModel.CommunicationState.Opened)
                client.Close();       
        }

        [TestMethod]
        [Description("Toplama testi")]       
        public void ToplamaTest()
        {
            Assert.AreEqual(3, client.Toplama(2, 1));
        }

        [TestMethod]
        public void CikartmaTest()
        {
            Assert.AreEqual(2, client.Cikarma(3, 2));
        }

        [TestMethod]
        public void BolmeTest()
        {
            Assert.AreEqual(5, client.Bolme(25, 5));
        }

        [TestMethod]
        public void CarpmaTest()
        {
            Assert.AreEqual(8, client.Carpma(2, 4));
        }
    }
}

İşte yazımızın en önemli kısmı bu sınıftır. Dikkat edileceği üzere sınıfımız TestClass isimli bir nitelikle imzalanmıştır. Diğer taraftan TestInitialize, TestCleanup, TestMethod isimli nitelikler yardımıyla imzalanmış olan metodlarda vardır. Nitelik kullanılması, çalışma zamanında yer alan bir ortamın, bir takım hazırlıklar yapacağı anlamına gelmektedir. Özetle bu nitelikler Visual Studio ortamında yer alan Test araçları tarafından çalışma zamanında değerlendirilmektedir. TestInitialize niteliği ile imzalanan metodlarda, test başlamadan önce yapılması gereken ön hazırlıklar yer almaktadır. Söz gelimi birim testlerine tabi olacak metodları içeren servis nesnesinin örneklenmesi gibi. TestCleanup niteliği ilede, testlerin bitmesi ile işletilmesi gereken kodları içeren metod imzalanmaktadır. Örneğin birim testleri için kullanılan servis örneğinin kapatılması burada yapılacak işlemlerden birisi olarak düşünülebilir.

TestMethod niteliği ile imzalanmış olan metod içerikleri ise, VS ortamındaki test aracı tarafından ele alınacak ve testleri yapılacak içeriklere sahiptir. Metod içeriklerine dikkat edilirse Assert tipine ait AreEqual fonksiyonlarının kullanıldığı görülmektedir. İlk parametre ile test sonucu beklenilen değer yazılırken, ikinci parametre ilede test edilecek fonksiyon çağrısı gerçekleştirilir. Cikarma metodunu test ettiğimiz yerde 2 sonucu beklenirken biz Cikarma metoduna (ki Cikartma olarak yazsam dilimize daha uygun olurmuş, hata yapmışım Frown ) 3 ile 2 parametrelerini göndermekteyiz. Yani aslında sonucun 1 olması gerekiyor. Bunu bilinçli olarak eklediğimi ve hata sonucu test aracının nasıl davrandığını görmek istediğimi belirteyim. Artık projemiz hazır. Build ettikten sonra çalıştırırsak, Visual Studio ortamında aşağıdaki görüntü ile karşılaşma ihtimalimiz yüksektir.

Görüldüğü gibi CikartmaTest isimli metod haricindeki tüm testlerde beklenen sonuçlara ulaşılmıştır. Yapılan testlere ait sonuçlar aynı zamanda trx uzantılı dosyalarda klasör bazlı olaraktan saklanmaktadır. Aşağıdaki ekran görüntüsünde olduğu gibi.

 

Not : Eğer servisi host eden uygulama (IIS, Windows Servisi veya diğer host seçeneklerinde yer alan uygulama çeşitleri olabilir) çalışmıyorsa, çok doğal olarak test gerçekleşmeyecek ve aşağıdaki ekran görüntüsü ile karşılaşılacaktır.

Burada .Net Remoting' den bu yana bildiğimiz meşhur hata mesajını alırız. "No connection could be made because the target machine actively refused it" Cool Hatta hata mesajlarından birisine çift tıklarsak aşağıdaki detaylı bilgi penceresinede ulaşma şansımız bulunmaktadır.

Peki Visual Studio yerine NUnit aracını kullanarak birim testi gerçekleştirmek istersek...

İlk olarak NUnit programının sistemimizde kurulu olduğunu göz önüne alıyoruz. Sonrasında ise aynen bir önceki projemizde olduğu gibi servis referansını eklememiz gerekiyor. Bunlara ek olarak, NUnit test programının çalışma ortamına bilgi vermek amacıyla kullanacağımız nitelikleri için, projeye nunit framwork' ununde (blog girişini yaptığım tarihlerde varsayılan olarak C:\Program Files\NUnit 2.5\bin\net-2.0\framework\nunit.framework.dll klasöründe yer almaktadır) referans edilmesi gerekir.

ServiceTestClass isimli sınıfın içeriği ise aşağıdaki gibidir.

using TestLib.Calculus;
using NUnit.Framework;

namespace TestLib
{
    [TestFixture]
    public class ServiceTestClass
    {
        private AlgebraServiceClient client=null;

        [TestFixtureSetUp]
        public void Ornekle()
        {
            client = new AlgebraServiceClient();
            client.Open();
        }

        [TestFixtureTearDown]
        public void Kapat()
        {
            if(client.State== System.ServiceModel.CommunicationState.Opened)
                client.Close();
        }

        [Test]
        public void ToplamaTest()
        {
            Assert.AreEqual(5, client.Toplama(2, 3));
        }

        [Test]
        public void CikartmaTest()
        {
            Assert.AreEqual(7, client.Cikarma(10, 3));
        }

        [Test]
        public void BolmeTest()
        {
            Assert.AreEqual(3, client.Bolme(9, 3));
        }

        [Test]
        public void CarpmaTest()
        {
            Assert.AreEqual(6, client.Carpma(2, 3));
        }
    }
}

İlk projemizdekine benzer olaraktan buradada çalışma zamanını ilgilendiren bir takım nitelikler bulunmaktadır. Teste tabi olacak metodlarımız için Test niteliği, testin başlamasından önce yapılması istenen ön hazırlıklar için TestFixtureSetUp, test sonrasında yapılması istenen işlemler içinse TestFixtureTearDown nitelikleri ele alınır. Yine beklenen değerleri tespit etmek amacıyla Assert tipinin AreEqual metodundan yararlanılmaktadır. Projenin çalıştırılması halinde genellikle NUnit aracının otomatik olarak başlatıldığına şahit oldum. Bu nedenle projenin özelliklerinde aşağıdaki ayarlamayı yapmamız yeterli olacaktır.

Görüldüğü gibi bu dll çalıştırıldığında NUnit tool' unuda başlatıyoruz. Command line arguments kısmında ise /run [dll adı] parametrelerini vererekten, NUnit aracının [dll adı] isimli assembly' daki testleri başlatmasını belirtiyoruz. Artık tek yapmamız gereken servise ait host uygulamanın çalıştığından emin olmak. Sonrasında TestLib.dll isimli assembly çalışıtırılırsa aşağıdaki ekran görüntüsünde olduğu gibi NUnit aracının çalıştığını ve testlerin yapıldığını görebiliriz.

İşte bu kadar. Hemen son bir noktayı daha aklıma gelmişken belirteyim. Visual Studio Test Tool' unu kullandığımız senaryoda istenirse debug işlemleride yapılabilir.

Umuyorumki yararlı bir yazı olmuştur. Tekrardan görüşmek dileğiyle...

WCFUnitTesting.rar (725,67 kb)

Yazar Hakkında

Burak Selim Şenyurt

Burak Selim Şenyurt

buraksenyurt.com

Yıldız Teknik Üniversitesi Matematik Mühendisliği mezunu olan Şenyurt, 1999 yılında profesyonel olarak adım attığı yazılım dünyasında, 2003 yılından beri Microsoft .Net teknolojileri ile ilgilenmektedir. Yazılım hayatına Assist Line isimli Call Center firmasında Delphi programcısı olarak başlayan Şenyurt sonrasında, sırasıyla Bizitek(Junior Developer), Netron(Master Trainer), Citibank(Outsource Senior Software Developer), Innova(Application Development Consultant), ve TCM(Software Architect) firmalarında görev almıştır. Su anda ING Bank bünyesinde Kıdemli Yazılım Danışmanı olarak görev yapmaktadir. 2006, 2007 yıllarında C#, 2008,2009,2010 yıllarında ise Connected System Developer kategorisinde Microsoft MVP seçilen Şenyurt, evli ve 1 çocuk babasıdır. C# diline olan düşkünlüğü, oğluna S(h)arp adının verilmesinde önemli bir etken olmustur.

Sosyal Medya

ORANLAR

  • 4042izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Merhaba, ellerinize sağlık çok yardımcı ol...
  • Merhaba Bu uygulama örneğinden ASP.net ...
  • Hocam Link başka sayfaya yönlendiriyor.
  • merhaba benim merak ettiğim bir konu var y...

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 122146
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 68381
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 50021
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ