Haz 3
Digg
Stumbleupon
Technorati
Delicious

CRUD u Projeler

Gereksinim Mühendisliği grubundan Sayın Kasım Şen in blog dünyasına ilk merhabası CRUD'u projeler.
Uzun zamandır CRUD a karşı olan düşüncelerimi özetler gibi bir yazı...
May 19
Digg
Stumbleupon
Technorati
Delicious

Yazılım Proje Yönetimi Semineri

Yazılım Proje Yönetimi Semineri

CETURK, Yazılım Proje Yönetimi konulu bir seminer etkinliği gerçekleştiriyor. Katılımın ücretsiz olduğu seminer, Yıldız Teknik Üniversitesi Bilişim Kulübü ve NBA'nın katkıları ile 21 Mayıs Pazartesi günü 16:00-17:30 saatleri arasında Yıldız Teknik Üniversitesi Konferans salonununda gerçekleştirilecektir.

Konuşmacı : Yazılım dünyasının bilinen ismi ve dört kez üst üste Microsoft'tan MVP ödülü kazanan; Aykut TAŞDELEN olacak.
Seminer Yeri :
Yıldız Teknik Üniversitesi Konferans Salonu ( Barbaros Bulvarı 34349 Yıldız-İstanbul)

Kayıt olmak için : http://www.ceturk.com/etkinlikkayit.asp?id=23



ETKINLIK IÇERİĞİ
Bu seminerde katılımcılar öncelikle proje kavramını öğrenecek beraberinde ise proje yönetiminin incelikleri hakkında bilgi sahibi olacaklardır. Bu bilgiler gelecekte bilişim sektöründe yönetici ünvanı elde etmek isteyen her pofesyonel'in ihtiyaç duyacağı detaylardır. Sözgelimi :
Gant Diyagramları
Risk Analizi
Proje Planlaması
6 sigma
SWOT Analizi
Proje Yönetiminde Temel Yaklaşımlar
CMMI
MSF (Microsoft Solutions Framework)
eXtreme Programming
Proje Yönetiminde Microsoft Teknolojileri
Microsoft Project
Visual Studio Team System
Visual Source Safe


ETKİNLİK SPONSORUMUZ
50 Katılımcıya etkinlik sponsorumuz Netron Bilişim Akademisi'ndeki tüm eğitimlerde geçerli olacak %30 'luk indirim kuponları ve 3 katılımcıya çekiliş ile Aykut Taşdelen'in kitaplarından hediye edilecektir.
Katkılarından dolayı etkinlik sponsorumuz Netron Bilişim Akademisi (NBA) 'ne çok teşekkür ediyoruz.

ETKİNLİK HEDİYEMİZ
3 katılımcıya çekiliş ile Aykut Taşdelen'in kitaplarından hediye edilecektir.
Bu kitap .NET ile birlikte duyurulan ADO .NET veri tabanı erişim teknolojisini tüm yönleri ile öğrenmek isteyen okuyucular için hazırlanmıştır.
Bu kitap, .NET dil ailesinin programcılardan en çok ilgi gören iki üyesini (Visual Basic .NET, C#) ileri düzeyde incelemektedir. Bu noktada amaç; .NET programcılarının kurumsal düzey uygulamalar geliştirirken ihtiyaç duyacakları konu başlıklarını toplu halde okuyucuya sunmaktır.
Mar 24
Digg
Stumbleupon
Technorati
Delicious

TFS Permission Manager

"TFS Permission Manager" for managing Team Foundation Server permissions in an easier fashion.

Here are some benefits in the tool:

"Using this tool you can:

  • Add or remove TFS group membership, Reporting Services role membership and SharePoint role membership
  • Set Server and Project-level permissions
  • Set AreaPath and Source Control permissions
  • Create new TFS users with permissions identical to those of specified existing user
  • Save user permissions as template and use it later to create new or update existing users.

Download

Ara 13
Digg
Stumbleupon
Technorati
Delicious

Bir Türlü Bulunamayan UML Tool

UML vazgeçilmez olunca en iyi dostlarınızdan biride bir UML tool oluyor.Tabi ki neredeyse her .Net Developer için vazgeçilmez olan Visio benimde en büyük favorim.Ama nedense bu aralar aramız pek iyi değil ve beni başka arayışlar içine sokmayı başardı.Aslında bu arayış sürecinin fazla zahmetli olacağını pek tahmin etmiyordum ama hiçde öyle olmadı.
Bir uml tool seçimi bu kadarmı zor olur? Eğer benim gibi onun kılı bunun bilmem neyi derseniz olur.İşte macera başlıyor.
İlk olarak tabiki saygı duyduğumuz büyük şahsiyet, yüce insan, ulu bilge google amcaya bi danışıyoruz bize ne tür uml araçları önereceği konusunda.Birkaç linkden sonra bir liste ile bizi selamlıyor google amcam ve bir kenara çekiliyor.http://www.objectsbydesign.com/tools/umltools_byCompany.html  link de neredeyse tüm uml araçlarının linkleri verilmiş.İyi peki diyip kolları sıvıyoruz hedef doğru düzgün bir uml tool bulmak.Tabi önce bir kriterimiz var onu gerçeklemeyenleri baştan eleyelim ki zaten extra bir durumu daha da uzun bir süreç haline getirmeyelim.İlk kriter Visual Studio entegrasyonu veya bir şekilde herhangi bir .Net diline(C#,Vb.Net,C++.Net...) kod dönüşümü yapabilsin bunlar dışında birde yeni gözdemiz Ruby e destek verirse süper olur diyoruz ama bunuda opsiyonel olarak bırakıyoruz.Görsellik de ikinci kriterimiz oluyor ama tabiki önem derecesi olarak ikinci plana atıyoruz.İşlevsellik, kullanım kolaylığı, işte bu nokta neredeyse benim için ilk kriter kadar önemli diyip bunuda yüksek öncelikli olarak işaretliyoruz ve start...

İlk hedef Altova UModel.Firma olarak Altova ya olan güvenim, fiyatının uygun oluşu, görsel olarak vasatı aşması ve c# desteği vermesi ona denenmek için bir fırsat tanıyor.Başlangıç olarak programın açılış performansı iyi sayılabilir.İlk olarak bir class diagramı ile code generation desteğini test etmek istiyorum ve bunu için hemen basit bir diagram oluşturuyorum ev hemen işlemi başlatayım diyorum ki oda ne c# yooookk.Listede sadece Java görünüyor.Biraz daha karıştırıyorum, dökümantasyona bakıyorum ama yokk.Ve UModel daha ilk aşamada kendini ele veriyor ve listeden çıkarılıyor.

Sparx System Enterprise Architect Professional ürünü sitesindeki bilgiler, screenshot larına dayanarak denenmeyi hakediyor.Ama daha hiçbir işleme başlamadan kullanıcı ile pek dost olmadığını belli ediyor.Yetersiz arayüz-kullanıcı kolaylığı ilişkisi yüzünden o da tozlu program arşivi klasörüne doğru yolculuğuna başlıyor.

ArgoUML open source olması hem rubyi hem de c# desteklemesi açısından hemen göze çarpıyor ama görsellik yüzünden kullanımdan kaldırılmasa da daha iyisini bulamazsam diye bir kenara itiliyor(Benim gibi görsel takıntınız yoksa kesinlikle deneyin)

Muhteşem, Office 2007 arayüzüne sahip çok etkileyici diagramlar hazırlayabileceğiniz SmartDraw  da testten geçiyor fakat görselliği kadar kullanılabilirliği yok code generation zaten yok onunda yeni mekanı arşiv oluyor.

Sadece Use Case kullanımı için bile olsa gerçekten mükemmel ve use case oluşturmayı bu kadar zevkli bir hale getiren yazılım heralde yoktur.Visual Use Case alanında en iyisi olduğunu söyleyebilirim ama isteklerimi tam olarak karşılamaması ve fiyatının çok pahalı olması onu trial süresinin bitimine kadar ancak elimde tutmama neden olacak. 

Bunlar dışında birkaç yazılım daha var fakat adlarını bile hatırlatamayacak kadar zayıf kalmaları buraya alınmamalarının bir sebebi olabilir belkide...

Sonuç mu? Evet Visio 2007 kullanmaya başlayana kadar bir araç buldum ;
  • Ücretsiz versiyonu mevcut
  • Görsellik tatmin edici
  • Performası açılışta zorlansada tatmin edici
  • Code generation ücretli versiyonunda mevcut
  • Database için çözümleri mevcut

eğer Visio ya ya bir alternatif(ücretsiz) arıyorsanız bence mutlaka deneyin.Ne adı mı hmmmm ... Evet cengaverimizin adıııı Visual Paradigm. Denemeye değer...


Ara 9
Digg
Stumbleupon
Technorati
Delicious

Lesson 1: You are the headlights of the project

Tester
Test Manager

"Lesson 1: You are the headlights of the project.

A project is like a road trip. Some projects are simple and routine, like driving to the store in broad daylight. But most projects worth doing are more like driving a truck off-road, in the mountains, at night. Those projects need headlights. As the tester, you light the way. You illuminate the road ahead so that the programmers and managers, however they bicker over the map, can at least see where they are, what they're about to run over, and how close they are to the cliff. The detailed mission of the testing group varies from company to company. Behind those details, though, is a common factor. Testing is done to find information. Critical decisions about the project or the product are made on the basis of that information."*

*Cem Kaner, James Bach, and Bret Pettichord, Lessons Learned in Software Testing
Ara 8
Digg
Stumbleupon
Technorati
Delicious

ASP.NET Birim Testi Oluşturma

Web projenizi açın ve test etmek istediğiniz methodun bulunduğu class da sağ tıklayıp Create Unit Test i seçin.Çıkan pencereden teste dahil edilecek olan methodları seçin ve işlemi tamamlayın.Projeniz solution içinde ayrı bir proje olarak oluşturulacak ve gerekli attribute ler de eklenecektir.

Not: Asp.Net birim testleri gerçekleştirebilmek için test edilecek methodların bulunduğu class ların App_Code klasöründe bulunması gerekmektedir.

TestContext nesnesi Asp.Net testleri için RequestedPage  property isini kullanımımıza sunmaktadır.RequestedPage, web projeniz için System.Web.UI.Page sınıfının bir örneğidir.Bunu yerel bir değişkene bağlıyarak sayfa içindeki bir kontrolü rahatlıkla erişim sağlayabilirsiniz.
Sayfada ki kontrolleri erişim sağlama,değer atamak veya almak için Page sınıfının FindControl methodu kullanılır.Sayfa içinde nonpublic olmayan kontroller için -ki buton kontrolünün submit methodu bunların içindedir- PrivateObject sınıfının Invoke methodu ile istenilen method çağrılabilir.

[TestMethod]
[HostType(“ASP.NET”)]

[AspNetDevelopmentServerHost(“%PathToWebRoot%\\StockTicker”, “/StockTicker”)]
[UrlToTest(“http://localhost/StockTicker”)]

public void VerifyCompanyTickerLookup()
{
Page page = TestContext.RequestedPage;
TextBox stockName = (TextBox)page.FindControl(“txtStockSymbol”);
stockName.Text = “MSFT”
PrivateObject po = new PrivateObject(page);
Button getCompanyName = (Button)page.FindControl(“cmdGetCompanyName”);
po.Invoke(“cmdGetCompanyName_Click”, getCompanyName, EventArgs.Empty);
Label result = (Label)page.FindControl(“lblResults”);
Assert.AreEqual(“Microsoft”, result.Text);
}
Ara 8
Digg
Stumbleupon
Technorati
Delicious

ASP.NET Uygulamalarında Birim Testi

Etkin bir biçimde Asp.Net uygulamalarını test etmek için bir web ortamı simüle emek gerekmektedir.
NUnitASP gibi bazı frameworkler de bu işlem hala çok zor ve Visual Studio ya entegre edilememektedir.
Fakat Team System test için aktif olan Asp.Net context ine erişim sağlayabilmektedir.Asp.Net testleride diğerlerine
benzerlik göstermekle birlikte ek olarak birkaç attribute daha almaktadır.

HostType



Testin yapıldığı hostun tipi.Genellikle bu ASP.NET olacaktır.

UrlToTest



İsteğin gerçekleştiği url.

AspNetDevelopmentServerHost



ASP.NET Development Server kullanıldığı zaman belirtilir.İki parametre alır
ilki web uygulamasının bulunduğu fiziksel yol,ikincisi ise uygulama kök dizini

Bu attribute ler Microsoft.VisualStudio.TestTools.UnitTesting.Web namespace i altında bulunmaktadır.


Ara 6
Digg
Stumbleupon
Technorati
Delicious

Test içinde NonPublic üyelere erişim

Class ınızda ki bir member ı test etmek istiyorsunuz?Fakat o da ne member public değil.
Unit testlerin ilk kurallarından biri olarak test edilecek methodun public olarak işaretlenmesi gerekiyordu.
Bu konuya ilişkin  3 ana yaklaşım var;
  • Test edeceğiniz private methodları public yapın.
  • private methodun bir public method içinden erişilebilir olduğu durumda testi public method üzerinden yapın.
  • .NET reflection kullanın.

Team System ile birlikte son aşama sizin için soyutlanmaktadır.

        private member lara ulaşmak için PrivateObject 

Farzedelim ki aşağıdaki gibi bir private field ve methodu test etmemiz gerek. 

public class Example
{
public Example() {}
private string password = “murat”
private bool VerifyPassword(string password)
{
return (String.Compare(this.password, password, false) == 0);
}
}

örnekte field ve method private işaretlendiği için unit test bunlara ulaşamayacaktır.
Peki bu durumda ne yapmalıyız? VerifyPassword methodunun çalıştığından nasıl emin olacağız?

Bu durumda Team System yardımımıza koşuyor ve PrivateObject class ını private methodları test etmek için
hizmetimize sunuyor.
Methodları;

GetArrayElement private array den seçilen nesneyi döndürür.Çok boyutlu dizileri de destekler.
GetField hedef field ın değerini döndürür.
GetFieldOrProperty hedef field veya property nin değerini döndürür.
GetProperty hedef property nin değerini döndürür.
Invoke hedef methodu invoke eder.
SetArrayElement private array de belirtilen nesneye verilen değeri atar.
SetField hedef field a nesne atar
SetFieldOrProperty hedef field veya property e nesne atar
SetProperty hedef property e nesne atar

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Explorations
{
[TestClass]
public class ExampleTest
{
private PrivateObject privateObject;
const string PASSWORD = “murat”
[TestInitialize]
public void TestInitialize()
{
privateObject = new PrivateObject(typeof(Example));
}
}
}


ilk önce PrivateObject  nesnesinin bir örneğini oluşturmamız gerekir.
Daha sonra da çalşacağınız class ı tip olarak bu nesneye geçirmelisiniz.

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Explorations
{
[TestClass]
public class ExampleTest
{  
private PrivateObject privateObject;
const string PASSWORD = “murat”
[TestInitialize]
public void TestInitialize()
{
privateObject = new PrivateObject(typeof(Example));
}
[TestMethod]
public void ComparePrivatePassword()
{
string password = (string)privateObject.GetField(“password”);
Assert.AreEqual(PASSWORD, password);
}
[TestMethod]
public void TestPrivateVerifyPassword()
{
bool accepted = (bool)privateObject.Invoke(“VerifyPassword”, PASSWORD);
Assert.IsTrue(accepted);
}
}
}

Ara 5
Digg
Stumbleupon
Technorati
Delicious

Unit Test Framework - ExpectedException

Normal olarak birim test başarısız oldupu zaman bir exception fırlatacaktır ve

bizde fırlatılan bu exception ın ne olduğunu bilmek isteyeceğizdir.
ExpectedException attribute ü teste ancak belirtilen exception fırlatıldığı zaman testin başarı ile sonuçlanmasını sağlar.
Eğer hiçbir exception fırlatılmaz ya da belirtilenin dışında bir exception oluşursa test başarısız olur.

[TestMethod]
[ExpectedException(typeof(ObjectDisposedException))]
public void ReadAfterDispose()
{
CustomFileReader cfr = new CustomFileReader(“dosya.txt”);
cfr.Dispose();
string contents = cfr.Read(); // ObjectDisposedException exception ı fırlatılmalı
}

ExpectedException ikinci opsiyonel bir string parametre daha alır.
Eğer bir exception tipinin iki farklı örneği ile çalışıyorsanız bu özelliği aktif hale getirmelisiniz.
Örneğin methodunuz birden fazla dosya için
FileNotFoundException fırlatmaktadır.

[TestMethod, ExpectedException( typeof ( FileNotFoundException ) ) ]
public void ut1()
{
   throw new FileNotFoundException ();
}
[TestMethod, ExpectedException( typeof( FileNotFoundException ), "foo" )]
public void ut2()
{
   throw new FileNotFoundException ("bar");
}

bu durumda eğer fırlatılan exception FileNotFoundException değil ve de onun mesaj property isi eşleşmiyorsa test başarısız olacaktır.

Ara 5
Digg
Stumbleupon
Technorati
Delicious

Unit Test Framework - StringAssert

CollectionAssert sınıfı gibi text tabalı testler içinde StringAssert sınıfı oluşturulmuştur.

StringAssert sınıfı methodları;

Contains Dönen değerde verilen string ifadeyi arar.
DoesNotMatch Dönen değerde Regular expression ile pattern aranması.Bulursa hata verir
EndsWith Eğer dönen değer verilen string ifadeyle bitmiyorsa hata verir
Matches Dönen değerde Regular expression ile pattern aranması.Bulamazsa hata verir
StartsWith Eğer dönen değer verilen string ifadeyle başlamıyorsa hata verir

[TestMethod]
public void TextTests()
{
StringAssert.Contains(“Arama yapılacak cümle”, “cümle”);
StringAssert.EndsWith(“Bu ifade ne ile bitiyor”, “bitiyor”);
StringAssert.Matches(“Bu cümle içinde boşluk var mı?”, new System.Text.RegularExpressions.Regex(@”\s+”));
StringAssert.DoesNotMatch(“Burdahiçboşlukyokki”, new System.Text.RegularExpressions.Regex(@”\s+”));
StringAssert.StartsWith(“Başlangıç kelimesi”, “Başlangıç”);
}

Matches ve DoesNotMatches methodları string bir ifade ve  System.Text.RegularExpressions.Regex in bir örneğini kabul etmektedir

Ara 5
Digg
Stumbleupon
Technorati
Delicious

Unit Test Framework - CollectionAssert

Microsoft.VisualStudio.TestTools.UnitTesting namespace i koleksiyon tiplerinin içerik ve davranışlarını test etmek için CollectionAssert sınıfına sahiptir.

CollectionAssert sınıfının methodları;

AllItemsAreInstancesOfType      Tüm elementlerin beklenen tipten olması 
AllItemsAreNotNull      Koleksiyon içinde herhangibir item ın null değere sahip olmaması
AllItemsAreUnique      Koleksiyondaki tüm item ları tarar ve birbirinin kopyası koleksiyon üyeleri varsa hata döndürür.
AreEqual      Beklenen ve dönen koleksiyondaki üyelerin aynı referansı işaret etmeleri(reference-equivalent)
AreNotEqual      Beklenen ve dönen koleksiyondaki üyelerin aynı referansı işaret etmemeleri
AreEquivalent      Beklenen ve dönen koleksiyondaki üyelerin değer eşitliği(value-equivalent) olması
AreNotEquivalent      Beklenen ve dönen koleksiyondaki üyelerin değer eşitliği(value-equivalent) olmamaları
Contains      Koleksiyon içinde verilen nesneyi arar.Bulamazsa hata verir
DoesNotContain      Koleksiyon içinde verilen nesneyi arar.Bulursa hata verir
IsNotSubsetOf      İlk koleksiyondaki üyelerin ikinci koleksiyonda bulunmamaları
IsSubsetOf      İlk koleksiyondaki üyelerin ikinci koleksiyonda bulunması

[TestMethod]
public void CollectionTests()
{
CustomCollection list1 = new CustomCollection();
list1.Add(“alpha”);
list1.Add(“beta”);
list1.Add(“delta”);
list1.Add(“delta”);
CollectionAssert.AllItemsAreInstancesOfType(list1, typeof(string));
CollectionAssert.AllItemsAreNotNull(list1);
CustomCollection list2 = (CustomCollection)list1.Clone();
CollectionAssert.AreEqual(list1, list2);
CollectionAssert.AreEquivalent(list1, list2);
CustomCollection list3 = new CustomCollection();
list3.Add(“beta”);
list3.Add(“delta”);
CollectionAssert.AreNotEquivalent(list3, list1);
CollectionAssert.IsSubsetOf(list3, list1);
CollectionAssert.DoesNotContain(list3, “alpha”);
CollectionAssert.AllItemsAreUnique(list3);
}

örnekteki hiçbir assertion hata başarısız olmayacak ve test başarı ile sonuçlanacak.

Ara 5
Digg
Stumbleupon
Technorati
Delicious

Unit Test Framework - Assert Methodları > Assert.Fail ve Assert.Inconclusive

Örneğin koşullu bir durumunuz var ve bunun test aşamasında çalışmadığını farkediyorsunuz.
Bu durumda Assert.Fail methodunu çağırıp AssertFailedException ile fırlatılan hatayı yakalayıp sorunun nerede olduğunu bulabilirsiniz.
Assert.Inconclusive test sonucunun başarılı olup olmadığı belli olmadığı durumlarda geçerlidir.Test tamamlanana kadar geçici bir durumdur.
Test tamamlanmadan yapılması ihtiyaç duyulan işlerde kulanılır.

Assert.Fail ve Assert.Inconclusive bir string ve birde opsiyonel argüman alabilmektedirler.
Bu string değişken Test Results ekranında neden hiçbir sonuç dönmediğinin açıklaması olarak kullanılabilir. 

Ara 4
Digg
Stumbleupon
Technorati
Delicious

Unit Test Framework - Assert Methodları > Assert.IsInstanceOfType ve Assert.IsNotInstanceOfType

IsInstanceOfType basitçe verilen nesne ile methoddan dönen nesnenin tiplerinin aynı olup olmadığını kontrol eder.

[TestMethod]
public void CollectionTest()
{
UntypedCollection untyped = new UntypedCollection();
untyped.Add(new Item(“Added”));
untyped.Add(new Person(“Murat”));
untyped.Add(new Item(“Another”));
object entry = untyped[1];
Assert.IsInstanceOfType(entry, typeof(Person));
}

örnekte her türlü tipi kabul eden bir koleksiyon var ve test olarak verdiğimiz koleksiyonun ikinci elemanı olan Person nesnesinin eklendikten sonra gerçekten Person nesnesi olarak dönüp dönmediğinin kontrolü yapılıyor.
IsNotInstanceOfType de IsInstanceOfType ın  tam tersi işlevle çalışmaktadır.


Ara 4
Digg
Stumbleupon
Technorati
Delicious

Unit Test Framework - Assert Methodları > Assert.IsNull ve Assert.IsNotNull

IsTrue ve IsFalse ile benzerlik gösterirler.Verilen nesnenin null olup olmadığını kontrol ederler.

[TestMethod]
public void CollectionTest()
{
CustomCollection cc = new CustomCollection();
cc.Add(new Item(“Added”));
Item item = cc[0];
Assert.IsNotNull(item);
}


Ara 4
Digg
Stumbleupon
Technorati
Delicious

Unit Test Framework - Assert Methodları > Assert.IsTrue ve Assert.IsFalse

Bu iki methodu basit olarak boolean bir değer döndüren methodların testlerinde kullanabiliriz.

[TestMethod]
public void IsPrimeTest()
{
const int FACTOR = 5;
Assert.IsTrue(MathLib.IsPrime(FACTOR), “{0} asal bir sayı değildir. ”, FACTOR);
}



Ara 4
Digg
Stumbleupon
Technorati
Delicious

Unit Test Framework - Assert Methodları > Assert.AreSame ve Assert.AreNotSame

Davranış olarak Assert.AreEqual ve Assert.AreNotEqual methodları ile benzerlik gösterse de onlardan ayıran
en önmeli nokta parametre olarak verilen argümaların değerlerini değil reference larının eşitliğini kontrol eder.
Eğer parametre olarak verilen iki argümanda aynı nesneyi işaret ediyorsa test başarılı olacaktır.
Bu iki method(Equal ve Same) object.Equals ve object.ReferenceEquals ile aynı tutumu göstermekdirler.

[TestMethod]
public void CollectionTest()
{
CustomCollection cc = new CustomCollection();
Item original = new Item(“Expected”);
cc.Add(original);

Item actual = cc[0];
Assert.AreSame(original, actual);
}

örnekte koleksiyonumuza bir item ekliyoruz ve koleksiyondan dönecek nesnenin bizim eklediğimiz nesne ile
aynı referans noktasını işaret edip etmediğini test ediyoruz.

Ara 4
Digg
Stumbleupon
Technorati
Delicious

Unit Test Framework - Assert Methodları > Assert.AreEqual ve Assert.AreNotEqual

Birim testte sonuca ulaşmak için en etkin yol asıl değerleri, beklenen değerin karşılaştırılmasıdır.Bu tür karşılaştırmaları yapmak içinde Assert nesnesi işimiz kolaylaştıracak birçok methoda sahiptir.

Assert.AreEqual ve Assert.AreNotEqual

Assert nesnesinin enşok kullanılan iki methodu AreEqual ve AreNotEqual dır.Adlarından da anlaşılacağı gibi beklenen veri ile test edilen method dan,
dönen değer eşit olup olmadığı bakımından karşılaştırılmaktadır.Bu iki method aldıkları beklenen ve asıl değer dışında üçüncü bir parametre daha alabilirler.
Test boyunca hata mesajlarını göstermek amacıyla string bir değişken atayabilirsiniz.

[TestMethod]
public void IsPrimeTest()
{
const int FACTOR = 5;
const bool EXPECTED = true; //beklenen sonuç
bool actual = MathLib.IsPrime(FACTOR);  //test edilen method dan dönen sonuç
Assert.AreEqual(EXPECTED, actual, “{0} asal bir sayı değildir. ”, FACTOR);
}

Burda kullandığımız IsPrime() methodu kendisine verilen ir sayının asal olup olmadığını döndürmektedir.

Assert.AreEqual ve AreNotEqual methodları birçok parameter overloads a sahiptir.
Örneğin
string,double, int, float, object, ve generic tipleri parametre olarak kabul eder.

Eğer bu iki methodla iki string değeri karşılaştıracaksanız opsiyonel olarak üçüncü bir parametre daha kullanabilirsiniz.
ignoreCase boolean bir ifadedir.Test sırasında karşılaştırmanın case-insensitive olarak yapılmasının sağlar default olarak case-sensetive dir.

double,float gibi verilerle çalışırken beklenen ve asıl veride çok küçük oranlarda değişiklikler yüzünden testinizin başarısız çıkmasını istemiyorsanız
üçüncü bir değişkenle aradaki farkı pas geçebileceğiniz bir delta noktası belirliyebilirsiniz.

[TestMethod]
public void SquareRootTeset()
{
const double EXPECTED = 3.1622;
const double DELTA = 0.0001;
double actual = MathLib.SquareRoot(10);
Assert.AreEqual(EXPECTED, actual, DELTA, “Kök kabul edilebilen bir aralıkda değil”);
}

burda beklenen ile asıl veri arasında çıkabilecek 0.0001 kadar artı veya eksi değer doğru kabul edilmektedir.

Ara 3
Digg
Stumbleupon
Technorati
Delicious

Unit Test Framework - Initialization ve cleanup

Bu yazıda Visual Studio içinde birim testleri yapmamızı sağlayan Microsoft.VisualStudio.TestTools.UnitTesting namespace inin method ve özellikleri üzerinde durucam.

Initialization ve cleanup

Projenizde paylaşılan bir kaynağı configure etmeniz gerekmektedir(database bağlantısı,log dosyası veya paylaşılan bir nesne) dolayısıylada test işlemi sırasında da yapılan işlemleri geri almak veya temizlemeniz kaçınılmazdır.Unit test framework bu tür durumlar için attribute lere sahiptir.Üç aşamada gruplanmış olarak Test,Class ve Assembly.
Bu 3 aşama methodların kapsamlarını ve uyuglama zamanlarını belirtmektedir.

Attributes Frequency and Scope
TestInitialize, TestCleanup Birim test işlemine tabi olan her class için Initialize ve Cleanup işleminde çalışırlar.
ClassInitialize, ClassCleanup Test kapsamındaki class boyunca sadece birkez
AssemblyInitialize AssemblyCleanup Assembly içindeki classlarda sadece bir kez

*class ve/veya Assembly seviyesinde initialize ve cleanup attribute leri Asp.Net testlerinde tavsiye edilmemektedir.
Asp.Net içinde bu testlerin sadece bir kez çalışması garanti edilmemektedir.Static method olmalarından dolayı test sonuçları yanlış çıkabilir.

 

            TestInitialize ve TestCleanup attribute leri

TestInitialize attribute ü ile oluşturulan method , testin gerçekleşeceği class içinde her test için  sadece bir kez çalışması istendiğinde kullanılır.
Benzer olarak da TestCleanup her test sonunda çalışmasını istedğimiz methodlar için kullanılır.
Unit test lerin temelinde olduğu gibi bu iki attribute ile işaretlenmiş methodlar public ve nonstatic olmalı, parametre almamalı ve değer döndürmemelidir.

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class ShoppingCartTest
{
private ShoppingCart cart;


[TestInitialize]
public void TestInitialize()
{
cart = new SomeClass();
cart.Add(new Item(“Test”);)
}


[TestCleanup]
public void TestCleanup()
{

cart.Dispose();

}


[TestMethod]
public void TestCountAfterAdd()
{
int expected = cart.Count + 1;
cart.Add(new Item(“Yeni Nesne”);)
Assert.AreEqual(expected, cart.Count);
}


[TestMethod]
public void TestCountAfterRemove()
{
int expected = cart.Count - 1;
cart.Remove(0);
Assert.AreEqual(expected, cart.Count);
}
}

testi çalıştırdığınızda herbirim birim testi için TestInitialize ve TestCleanup ın birer kez çalıştığını göreceksiniz.Test başladığında ve bittiğinde.

            ClassInitialize ve ClassCleanup attribute leri

Test seviyesinden farkı methodların class kapsamınca sadece ama sadece bir kez çalışacağını garantilemesidir ki kaç adet birim testin olduğu önemli değildir.Test seviyesinde her test methodu için Initialize ve Cleanup birer kez çalışmıştı.Diğer bir fark ise static olarak işaretlenmeleri ve TextContext(ilerleyen yazılarda bı sınıfdan bahsedilecektir) sınıfını parametre olarak almalarıdır.

private System.IO.File logFile;


[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
// logFile nesnesini aç
}


[ClassCleanup]
public static void ClassCleanup(TestContext context)
{
// logFile nesnesini kapat 
}

artık logFile nesnesini referans alarak testlerinizde kullanabilirsiniz.Class seviyesinde işaretlenerek de artık bu nesnenin test boyunca class seviyesinde yalnızca bir kez Initialize ve Cleanup methodu çalışacaktır.

class ve test seviyesi için basit bir hiyerarşik gösterim,

ClassInitialize
  TestInitialize
      TestCountAfterAdd
  TestCleanup
  TestInitialize
      TestCountAfterRemove
  TestCleanup
ClassCleanup

            AssemblyInitialize ve AssemblyCleanup attribute leri

Static olarak işaretlenmeli ve TextContext sınıfını parametre olarak almalıdır.Eğer assembly de çok fazla sayıda class seviyesinde initialize ve cleanup methodunuz varsa bunları assembly seviyesine refactor edebilirsiniz.

[AssemblyInitialize]
public static void AssemblyInitialize(TestContext context)
{
// initialization code
}


[AssemblyCleanup]
public static void AssemblyCleanup(TestContext context)
{
// cleanup code
}

Not: Gelecek yazıda unit test lerin kalbinde yer alan  Assert nesnesi ve methodları incelenecektir.

Ara 3
Digg
Stumbleupon
Technorati
Delicious

Visual Studio Team System ile Unit Test

Visual Studio Team System(VSTS) kendi bünyesinde barındırdığı unit test framework
ile geliştiricilere başka bir third-party
araca(NUnit vb.) ihitiyaç duymadan birim testleri yapma imkanı sağlamaktadır.
Birim testimizi gerçekleştirmek için öncelikle bir Class Library projesi oluşturalım.

using System;
namespace MathLib
{
public static class Functions
{
public static int Fibonacci(int factor)
{
if (factor < 2)
return (factor);
int x = Fibonacci(--factor);
int y = Fibonacci(--factor);
return x + y;
}
}
}

Birim testi oluşturmak için


ve oluşturulan test sınıfımız

burda Visual Studio bizim için gerekli ortamı hazırlamaktadır.Dikkat edilmesi gerekenler Class ın [TestClass] attribute ile işaretlenmesi, method ların [TestMethod] ile işaretlenmesi ve scope unun public olmasıdır.Unit testlerin kalbinde ise Assert nesnesi yer almaktadır.
Kodumuzu testimize uygun hale getirmek için Visual Studio tarafında olulşturulan kodda değişikliğimizi yapalım.

[TestMethod]
public void FibonacciTest()
{
const int FACTOR = 8;
const int EXPECTED = 21;
int actual = ExtendedMath.Functions.Fibonacci(FACTOR);
Assert.AreEqual(EXPECTED, actual);
}

Kullanılan Assert nesnesinin AreEqual methodu iki değeri karşılaştırmak için kullanılır.Örneğimizde bizim oluşmasını beklediğimiz sayı ile Fibonacci methodundan dönen değer karşılaştırılmaktadır.Eğer iki değer eşit çıkmaz sa test başarısız olacaktır.ve projemizi F5 ile debug ediyoruz.

testimiz başarı ile geçmiştir.Peki eğer hatalı bir veri girişi yapsaydık ne olacakdı.
test methodumuzdaki EXPECTED ı 21 den 22 ye çevirip sonucu görelim.

ve sonuç...
Failed FibonacciTest MathLibTest2 Assert.AreEqual failed. Expected:<22>, Actual:<21>.
beklediğimiz değerin 22 olmasına karşın methoddan 21 değeri dönmüş ve test başarısız olmuştur.
temel olarak Visual Studio Team System içinde nasıl Unit Test gerçekleştirebileceğinizi anlatmaya çalıştım.Görüldüğü gibi çok az bir eforla proje dahilindeki bug ları bulmak mümkün.