Web Uygulamasına Nasıl Test Yazılır ?

Web uygulamasını 3 katman olduğunu düşünürsek. Her katmanı tek bir test yöntemiyle test etmemiz mümkün değildir. Her katmandaki test hedefinizi belirleyerek buna göre testlerinizi yazmanız daha anlamlı olur. İlk önce katmanları tanıyalım.

  • Presentation Layer: Sunum katmanı, kullanıcıların veri girişi yaptığı ve verilerini listelediği, görüntülediği ekranların bulunduğu katman. Bu katman kullanılan ortamlara göre değişiklik gösterir.

— Desktop (Swing, MFC, AdobeAir vb..) — Browser (HTML, Javascript, CSS) — IOS (Objective C, Swift) — Android (Java) — Windows Phone (C#)

  • Business Logic Layer: Sunum katmanından kullanıcının girdiği verileri veya komutları mantıksal olarak işleyerek ne yapılacağına karar verir. Örneğin;

— I/O işlemini gerçekleştirir
— — Object Store (S3)
— — File — — Database
— — WebService
— — Queue
— — Cache — — Client

— Kontroller yapar. (Güvenlik, Veri formatı vb..) — Hesaplamalar yapar.
— İşletim sisteminden Shell çağrımlar yapar. — Veri birleştirmeleri yapar.
— Loglamalar yapar.

  • Database Layer: Bu katmanda veriyi bir disk belli tablo, kolon ve satır olarak kaydedilmesini sağlayan veritabanı araçlarından oluşur. MySQL, MSSQL, PostgreSQL, Oracle, DB2, MongoDB, Cassandra vb..

Nasıl Testler Yazmalıyız ?

Presentation Layer

Presentation Layer kısmında otomatik testlerin daha avantajlı olduğunu düşünüyorum. Kullanıcının Client tarafında girişini kodla taklit edecek şekilde kodlar yazarak olumlu ve olumsuz durumları test edebilirsiniz.

Browser’da çalışan uygulamaları otomatikleştirmek için Selenyum aracını kullanabilirsiniz. Selenyum testleri sırasında yapmanız gereken WebDriver kurup bu WebDriver üzerinden kullanıcının yaptığı inputları kodla yaptırmak. Biraz DOM yapısını ve Selection mantığını biliyorsanız Selenyum testlerini basit bir şekilde yazabilirsiniz.

Android ortamının testlerini otomatikleştirmek için Robotium, Calabash, Appium, UIAutomator, Espresso gibi araçlar mevcuttur. Biz uygulamalarımızda Expresso’yu tercih ediyoruz.

IOS ortamında Instruments altındaki UIAutomation kullanarak otomatik testlerinizi gerçekleştirebilirsiniz.

Detay: Yukarıda bahsettiğim UI Test Automation yöntemleri aslında hep aynı mantıkla çalışır. Black Box Testing dediğimiz bu yöntemlerde kullanıcının giriş yaptığı işlemlerin aynısı yapabilecek, kullanıcı girdisini simule edebilecek WebDriver ve NativeDriver üzerinden gerekli bileşenleri komutlar göndererek gerçekleştirilir.

Business Layer

Bu kısım veri dönüşümlerinin , kontrollerin, hesaplamaların veya servislerin çağrıldığı kısımlardır. Bu kısımda birim test yazmak en mantıklısıdır. JUnit ile birim testlerinizi kolay bir şekilde yazabilirsiniz. Amacımız integration test olmadığı için servis çağrımlarını Stub/Mock lama ihtiyacı duyarsınız. Bunun için öncelikle servisleri interface’ların arkasına almanızda fayda vardır. Java dünyasında bir çok Stub/Mock framework bulunmaktadır. Kolaylığı nedeniyle EasyMock veya Mockito kütüphanelerinden birisini seçebilirsiniz.

Database Layer

Veritabanı katmanında tabloların, kolonların ve ilişkilerin doğru şekilde olup olmadığını DAO katmanının üzerine yazacagımız bir entegrasyon testi ile gerçekleştirebiliriz. Bunun için AbstractTransactionalJUnit4SpringContextTest sınıfını kullanarak TestApplicationContext ile veritabanını ve istediğimiz sınıfları ayağa kaldırıyoruz.

Bundan sonraki kısım DAO’dan bir takım fonksiyonlar çağırarak INSERT/UPDATE/DELETE JOIN fonksiyonlarını Transactional olarak test etmektir.

Aşağıdaki test sırasında bellekte random bir kayıt oluşturuluyor. Sonra bu kayıt tabloya ekleniyor. Sonra tablodan çekiliyor doğru eklenmiş mi şeklinde. Daha sonrada bu kayıt tablodan siliniyor.

DB testinde en önemli şeylerden birisi test sırasında oluşturduğunuz kaydın silinmesi, test verileri ile veritabanının kirletilmemesidir. Bunun için test sırasında kullandığınız veritabanının belli süreler ile gerçeğinin kopyası alınarak oluşturulan test veritabanı olmasını öneririm.