AAA Test Patterni
AAA(Arrange Act Aspect) test patterni oldukça popüler hale gelmiş belki de çoğumuzun isimledirilmiş pattern olduğunu bilmeden zaten kullandığımız çok basit bir test patternidir.
Unit test dediğimizde yazılımın en küçük birimi olan, her bir fonksiyonun birbirinden bağımsız test edilmesi gibi düşünebiliriz. Kodumuzdaki fonksiyonların diğer bağımlı olduğu fonksiyonlardan bağımsız olarak kendi işini doğru yapıp yapmadığını test etmek için unit testler yazarız.
Unit testin temeli ” bizim kurguladığımız input’a karşılık fonksiyonumuz beklenen outputu veriyor mu? ” dur. Temelde belli parametreler seçersiniz, bu seçtiğiniz parametrelerle metotları çalıştırıp dönüşlerini beklediğiniz resultla kıyaslarsınız. Böyle bir durumda fonkiyonu test etmek için her parametreyle her inputla ve her case için tek tek test yazamayacağımızdan , doğru inputlar seçmeliyiz. (quality over quantity). Örnek vermek gerekirse, sayılar üzerinde işlem yapan bir fonksiyonu test ederken, geçerlilik (true test) inputları olarak uç sınırlardan birer tane, ortadan birtane seçmek yerinde olacaktır.
Unit test yazarken genelde süreç benzer ilerler. Test inputları belirlenir, bu test inputlarına karşılık beklediğimiz result belirlenir, metot test edilir ve gelen sonuç beklediğimiz sonuçla karşılaştırılır. Bu sürecin farkına varan yazılımcılar bu sürece uygun bir unit test patterni oluşturmuşlar. AAA(Arrange Act Aspect) Test patterni. Aslında bu pattern tam olarak az önce kurduğum cümlenin patternleştirilmiş halidir. Maksat unit test yazarken kafada belli bir kalıp oluşturmak ve bunu takip etmek 🙂 .
Arrange : Bu kısımda test edeceğimiz metot için test inputları, gerekli nesneler ve bu test inputları karışısında test edilen metottan beklediğimiz result hazırlanır.
Act : Bu kısım hazırladığımız inputlarla test edilecek metodun çağırıldığı kısımdır.
Assert : Test edilen metottan gelen resultla bizim beklediğimiz resultun .netin assertleriyle karşılaştırıldığı kısımdır.
Olay aslında bu kadar basit ve net
//arrange var repository = Substitute.For(); var client = new Client(repository); //act client.Save(); //assert mock.Received.SomeMethod();
Her seferinde arrange act ve assert ifadeleriniyorum satırı olarak yazmamıza gerek yok ancak belli bir structure uyulduğunu belirtmek ve anlaşılır kılmak adına ben koymayı tercih ediyorum. Somut ufak bir örnek verecek olursak..
[TestMethod] public void Add_TwoAndFive_ShouldReturn_Seven() { //Arrange const int expectedResult = 7; const int firstValue = 2, secondValue = 5; //Act int actualResult = _calculator.Add(firstValue, secondValue); //Assert Assert.AreEqual(expectedResult, actualResult); }