AAA Pattern (Arrange, Act, Assert)
Geliştirdiğimiz birimler, modüller veya uygulamalar birer matematik formülü gibidir. Her formül bir hipotez olarak ortaya çıkar. Bu hipotezler çeşitli sağlamalar sonucunda bir teoriye dönüştürülür. Doğruluğu her senaryoda kanıtlanmış teoriler birer kural olarak hayatımıza girer.
2*2=4
Çarpma işlemi içinde gizli bir toplama işlemi barındırır. Onluk sayı sisteminde bu işlem bir hipotezdir. Toplama işlemi ile sağlaması yapıldığında bir teori haline gelir. Ardından yapılan testler sonucunda artık bir kanun olur ve herkes tarafından kabul edilir.
Yazılımlar matematik formülleri gibidir. Eğer uygun sağlamalar ile harmanlanmaz ise birer hipotez olarak kalır. Unutmayın ki hipotezlerin doğruluğu kesin değildir. Sadece öyle olduğu varsayılır. Ancak yazılımda kesinlik önemli bir parametredir. Geliştirdiğimiz kodların doğruluğunu varsaymamalıyız. Geliştirdiğimiz her birim için uygun sağlamalar yapmalıyız.
Birçok geliştirici bu kısmı hafife alıyor. Hatta birçok organizasyon geliştirdiği ve binlerce insana kullandırdığı uygulamaların testlerinin olmamasını normal karşılıyor. Hadi gelin bu algıyı kıralım. 🥸
Hadi kenara bir not alalım. Testler üretimi yapan kaynak koddan bile daha net yazılmalıdır. Umarım buradaki espriyi anlamışsınızdır. Sadece test yazmak da bir çözüm değildir. Yazdığımız testler kaynak kodumuzdan bile daha net olmalıdır.
Çünkü geliştirdiğimiz kodların doğru yürütülmesi bizim ilk amacımızdır. Ancak testler ile geliştirdiğimiz kodların davranışını belgelemiş oluruz. Bu nedenle, testlerin ilk tüketicileri geliştiricinin kendisidir.
Geliştirdiğimiz koddan daha net testler yazmak da bizi nihai hedefimize ulaştırmaz. Geliştirdiğimiz testlerin de okunabilir olması gerekir. İşte tam bu noktada AAA Pattern
hayatımıza giriyor. Arrange, Act ve Assert yani Düzenle, Harakete Geç ve İddia Et kalıbı hayatımızı daha eğlenceli bir hale getirecek.
C# üzerinde bazı örnekler ile bu konuyu özetleyebiliriz.
En ilkel bakış açısı ile “Testler pass olduğu sürece sorun yok” diyebiliriz.
Evet, test pass olur, ancak okumanız ve anlamanız gerektiğinde her şey daha az anlaşılır hale gelir.
Bu nedenle, testin bölümlerini açıkça ayırmak daha iyidir. Unutmayın, bu sadece bir okunabilirlik meselesi.
Hadi tartışalım. Neden AAA Pattern?
Arrange, Act, Assert her birinin önemli bir anlamı ve tanımı olduğunu tekrar hatırlayalım. Düzenle, Harekete Geç, İddia Et.
Arrange
Bu bölümde testler için gerekli tüm ön koşulların sağlanması gerekiyor. Test edilecek değerler, mock objelerin konfigürasyonu ve gereken her şey bu bölümde bulunmalıdır.
Act
Test edeceğimiz birimi çalıştırdığımız bölümdür.
Assert
Test için tanımlanan başarı kriterleri bu bölümde bulunur. Her test senaryosunda tek bir Assert
deyiminin bulunmasını önerilir.
Testleri fizik deneyleri olarak düşünün: önce ortamı kuruyorsunuz, ardından testi çalıştırıyorsunuz ve son olarak sonucun beklediğiniz gibi olup olmadığını kontrol ediyorsunuz.
AAA Pattern bize testlerin daha okunaklı ve daha kolay değiştirilebilmesini sağlayacaktır.
Son olarak en son yazdığım endpoint testini aşağıya bırakıyorum. Bakalım AAA Pattern size detayı ile ilgili hiçbir bilginiz olmadığı bir senaryoyu okunaklı kılacak mı?
Yazdığınız kodlar production ortamında hatasız çalışsın. Testler sizi korusun. 🙏
What is Unit Testing? Definition from WhatIs.com (techtarget.com)
What Is Unit Testing? | SmartBear
Unit Testing and Coding Best Practices for Unit Tests | Toptal
Unit Testing and the Arrange, Act and Assert (AAA) Pattern | by Paulo Gomes | Medium
The Arrange, Act, and Assert (AAA) Pattern: A Functional Approach | Mews Developers
Making Better Unit Tests: part 1, the AAA pattern — Manning
Utilize Arrange, Act, Assert (AAA) Pattern — Telerik JustMock
Fundamentals of Unit Testing: Understand AAA in Unit Testing (c-sharpcorner.com)
Clean Code Tip: AAA pattern for tests: why is it important? — Code4IT