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ı...
|
|
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. |
|
|
"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

|
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...
|
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
|
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);
}
|
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.
|
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); } } }
|
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.
|
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
|
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.
|
Ö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.
|
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.
|
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); }
|
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); }
|
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.
|
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.
|
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.
|
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.
|