Yazılım Test Otomasyonuna Yeni Bir Bakış Açısı

Kaliteli yazılım üretmenin en önemli yapı taşı, testi doğru ve etkili yapabilmektir. Her şeyi otomatikleştirmeye çalıştığımız günümüzde, manuel olarak bu testleri gerçekleştirmeye çalışmak; maliyeti, teste ayrılan süreyi ve daha önemlisi hata kaçırma riskini artırmaktadır. Manuel yapılan testleriyse mümkün olduğunca otomatikleştirmeye çalışıyoruz. Fakat burada da test otomasyonunun kendi iç zorlukları ile karşılaşıyoruz.

Test otomasyonu diyerek, aslında yaptığımız yeni yeni kodlar yazmak ve bir tür kuyruğunu yakalamaya çalışma durumunu yaşamak. Çünkü yazılan otomasyon kodlarının ne kadar doğru yazıldığı maalesef bir soru işareti.

Kuyruk yakalama kısmını göz ardı etsek bile, iyi yönetilmesi gereken alttaki zorluklar ile karşılaşıyoruz;

  • Kodlama bilmiyorsan test otomasyonu dünyasında barınamazsın.
  • Yazılan test otomasyon kodu, her test ile değişme potansiyeline sahip. Belki de baştan yazılmalı! Çünkü bakım yapmak bazen yeniden yapmaktan bile zor olabiliyor.
  • Kodu iyi yazarken testte kullanılacak veriyi iyi yönetmediysek işler yine oldukça zorlaşacaktır.
  • Test ortamlarının hazırlanması, dağıtık çalıştırma, sonuçların iyi bir şekilde kayıt altına alınması gibi konular da bizi uğraştıracak diğer konulardan bazıları.

Bu alanda uğraşan birçok uzman gibi biz de uğraştık ve bu sorunlar ile boğuşmaktansa, yönümüzü daha az sorunla karşılaşacağımız bir yola çevirdik. Bu çalışmalar sonucunda da TEDAM (Test Data and Automation Manager) isimli test aracını ortaya çıkardık.

Vakti kısıtlı olanlar için önce özet geçeyim. TEDAM web uygulamaları için uçtan uca test otomasyonunun hazırlanıp, bu otomasyon senaryolarının koşturulması ve yönetilmesini sağlar. Bunu yaparken de hiç kod yazmadan bunu yapmayı sağlar. Kullanıcı; sunduğumuz arayüz ile adım adım yapacağı işlemleri seçer, verisiyle ilişkilendirir ve çalıştırır. Üründe değişiklik mi oldu, gidip test adımını ve verisini güncelleyerek otomasyonunu çalıştırmaya devam eder. REST API üzerinden, testlerini CI/CD araçlarına entegre edebilir.

TEDAM’ın ana fonksiyon alanı ise test edilecek ürünün fonksiyonel testlerini otomatikleştirmektir. Tabi unutulmaması gereken; TEDAM’ın dinamik yapısı sayesinde, yük testlerinizi de yapmak mümkün olmaktadır.

Şimdi vakti olanlara her şeyi güzel ve detaylıca anlatalım.

Neden Test Otomasyonu?

Aslında buraya kadar geldiyseniz, test otomasyonuna zaten ihtiyacınız olmuş demektir. Bu ihtiyaçlar ile birlikte Genel olarak test otomasyonunun faydalarını alttaki şekilde düşünebiliriz.

  • Ensures that regression tests can be run more often than manual tests.
  • Compatible with agile software development methodologies.
  • Supports the preparing test scenarios.
  • Able to catch the details which the user may miss.
  • Increases the depth and scope of the tests.
  • Enhances the trust for the application’s working.

Karşılaşılan Sorun ve Zorluklar

Yazılım test otomasyonu kendi içinde bir yaşam döngüsüne sahiptir. Bu yaşam döngüsünde; döngünün kullanıcısı olan test uzmanı ve kullanılan araç seti, yapılan işin verimliliğini belirleyen en önemli etkenler denilebilir.

Genel bir test otomasyonunun çalışması için uygulanan yaşam döngüsü alttaki gibi olacaktır;

  1. Test senaryosunun yazılması,
  2. Kullanılan aracın kodlama diline uygun olarak kodlanması,
  3. Test ortamının ve verilerinin hazırlanması,
  4. Otomasyon senaryolarının koşulması,
  5. Koşu sonuçlarının değerlendirilmesi ve bakımlarının yapılması.

Test senaryosunun yazılması kısmını yazılım testi alanında çalışan herkes yapabilir diye düşünebiliriz. Hatta bir analist, ürün uzmanı belki destek uzmanı bile yapabilir. Fakat bu kişilerden kodlama yapmasını beklemek? Müşterinizin de versiyon güncelleme işleminde, kendi hazırladığı otomasyon senaryolarının olmasını isterseniz ne olacak?

Kaydet-Oynat araçları mı? Evet hiç kod yazmadan, yaptığınız işlemleri kayıt altına alıp, istediğiniz anda tekrar çalıştırabilen araçlar bulunuyor. Bunların da yaptığı şey, sizin yaptığınız işlemleri koda dönüştürmek. O kodun tekrar çalıştırıldığında çalışabilecek olması tamamen o testi yapan kişinin kodlama bilgisine bağlıdır. İyi bir metodoloji ile hazırlanmış test otomasyon altyapısı ancak kodlama bilgisine sahip test uzmanları ile sürdürülebilir olur.

Senaryolardaki verilerin; hazırlanan test otomasyon kodlarının içine gömülü olması, verilerin belli bir noktadan sonra kontrol altında tutulmasını oldukça zorlaştıracaktır. Data driven testing gibi yöntemler halihazırda bu sorunu çözmek için kullanılıyor. Burada amaç, veri ile kodu ayırmaktır. İyi ayrıştırılmış veri ile kod, daha bakım yapılabilir otomasyon anlamına gelmektedir.

Test otomasyon kodlarımızı ve verimizi doğru bir şekilde hazırladık. Haydi şimdi bunları çalıştıralım. Birkaç adetten oluşan test otomasyon senaryo seti, kısa bir sürede koşturulabilir. Ya yüzlerce hatta binlerce test otomasyon senaryo kodumuz varsa? Tek bir bilgisayar üzerinde koşması günler, haftalar mı sürecektir­?

İyi yapılandırılmış test otomasyon sürecinde, test otomasyon senaryolarımızı kısa süreler içinde çalıştıracak bir mekanizmamız olmalıdır. Bunun için dağıtık olarak testleri çalıştırabilmeli, ürünün hangi versiyonunda testin koşulduğu, hangi data ile koşulduğu gibi bilgiler de kayıt altında tutulabilmeli.


TEDAM’a giriş

“Test and Data Automation Manager”ın kısaltması olan TEDAM, otomasyonda karşılaştığımız sorunlara çözüm bulmak adına geliştirildi ve geliştirilmeye devam ediyor.

TEDAM’ı geliştirirken neleri çözmeye çalıştık;

  • Veriyi kod ile ayıracak bir yapının oluşturulması,
  • Senaryoların yazıldığı, otomasyon kodlarının hazırlandığı ve otomasyon senaryolarının çalıştırıldığı ortamların merkezileşmesi ve tek bir araç üzerinden takip edilmesi,
  • Kodlama yapmayı bilmeyen kişilerin de (test uzmanı, analist, destek uzmanı, ürün uzmanı ve hatta müşteri) otomasyon yapabilmesi.

Neden TEDAM tercih edilmeli?

Test otomasyon aracı diye araştırma yaptığınızda yüzlerce ürün ile karşılaşıyorsunuz. Tamamen ücretsiz olanlar, open-source olanlar, paralı olanlar, çok paralı olanlar, web, mobil, masaüstü, API vb. diye birçok kategori var.

TEDAM’ın hali hazırda sunduğu en belirleyici özellikleri listeleyelim.

Ücretsiz. Açık Kaynak. Evet, TEDAM tamamen ücretsiz ve açık kaynak bir ürün.

Kodsuz. Günümüz trendi olan tamamen kodsuz otomasyon yapılabilmekte.

Uçtan Uca (E2E). TEDAM ile test senaryolarınızı takip edebileceğiniz gibi, testlerin koşulacağı istemcileri dahi yönetebilirsiniz. Baştan sona tüm gereksinimlerinizi tek bir ürün altında yönetebilirsiniz.

Komut Çalıştırabilme (CLI). TEDAM ile istediğiniz her türlü komutu, istediğiniz zamanlarda, hatta otomasyon öncesi/sonrası tetikleyicileriyle çalıştırabilirsiniz. Örneğin; docker’ları mı ayağa kaldıracaksınız, database yedeğini geri mi getireceksiniz vb… Evet, hepsini yapabilirsiniz.

Bilgilendir (Notification). Test sonuçlarını excel ve mail olarak alabilirsiniz. Ayrıca Notification arayüzü ile ihtiyaç duyduğunuz her platformu dahil edebilirsiniz (Twitter, Slack, WhatsApp vb.…)

Özelleştirilebilir (Customizable). Test edilecek üründeki her türlü bileşeni, kendi kurallarınız ile tanımlayabilirsiniz. ID alanında textField olan tüm HTML bileşenlerini bir tek kural ile tanımlayabilirsiniz. Ya da daha genel olarak tüm input elementlerini tek bir kural yazarak tanımlayabilirsiniz. Esnek yapısı ile aynı ID’ye sahip bileşenlerin olduğu HTML kodlarında bile rahatça otomasyon yapabilirsiniz.

Bağımsız (Independent). TEDAM ile web ürünlerinin testlerini otomatikleştirebilirsiniz. Peki masaüstü uygulamanız varsa ne yapacaksınız? Tek yapmanız gereken Winium gibi bir framework seçerek, gerekli geliştirmeleri yapmak. Ya da Appium ile mobil otomasyona da entegre olabilirsiniz.


Nasıl Kullanılır?

Gelelim ortaya çıkan ürünün nasıl çalıştığına.

TEDAM Kullanım Şeması

TEDAM üzerinde süreç, kullanıcının test ettiği üründen snapshot dosyalarını toplamasıyla başlar. Peki snapshot nedir?

Snapshot; test edilmek istenen HTML sayfasında bulunan, kullanıcının etkileşime geçebileceği bileşenleri ve bu bileşenlere ait verileri tutan bir XML dosyasıdır.

Snapshot dosyasından küçük bir alıntı:

<Control tag='city' title='City Name' type='textfield' value='İstanbul'> <Control tag='phone' title='Phone' type='textfield' value='90245663223'> <Control tag='save' title='Save Form' type='button'>

Snapshot üretebilmek için öncelikle TEDAM Snapshot Generator isimli Chrome Extension’ın kurulması gereklidir. Ayrıca etkileşime geçilecek bileşenlerin ayırt edici özellikleri, rule tanımlaması ile TEDAM Snapshot Generator üzerinde tanımlanır. Her şey hazır olduğunda; istenen sayfada snapshot alınarak, tanımlı rule’lara bağlı ayrıştırma HTML sayfa üzerinde gerçekleştirilir ve uygun bileşenler XML dosyasına aktarılır.

Test edeceğimiz senaryo için, yaptığımız her etkileşime bağlı snapshot dosyasını bu şekilde kayıt altına almalıyız.

Sıra test senaryomuzu yazmaya geldi. Test case’lerimizi TEDAM Face olarak adlandırdığımız, veri giriş arayüzümüzle kayıt altına alıyoruz. Burada yapmamız gereken en önemli şey test adımlarını atomik olarak ayırabilmek. Ekranda bazı alanlara veri girişi, bazı alanlara ise tıklama işlemi yapıyoruz. Bunları bağımsız adımlar olarak kayıt altına almalıyız.

Senaryo adımlarımızı da girdikten sonra yapmamız gereken, kayıtlı snapshot dosyalarımızı ve ilgili test adımını ilişkilendirmek. Bu ilişki kurulduğunda; yapılacak işleme bağlı aksiyon tipi seçilerek, etkileşime geçilecek bileşen ve data seçimi de yapılır.

Örneğin ekranda bir butona tıklayacak isek “ButtonClick” adım tipi seçilir ve açılan pencerede listelenen button’lardan istenilen seçilir. Ya da ekranda bazı input’lar doldurulacaksa, “FormFill” seçilir ve açılan pencerede doldulacak alanlar, verileri ile birlikte seçilir.

Artık test senaryomuz tamamen hazır. Bir sonraki adım elimizde test senaryosunu Test Set’ler altında anlamlı gruplarla toplamak.

Test Set sadece senaryolar arası bir ilişki varsa; örneğin bir senaryoya ait precondition ve postcondition senaryolar olması durumunda, bu ilişkileri yönetmek için kullanılır.

Job’lar ise koşturulmak istenen test set’ler, test edilen ürüne ait test ortamı, koşunun yapılacağı tarih ve testlerin koşturulacağı TEDAM Agent’lara ait bilgileri tutar.

Sonunda her şeyi hazırladık. Şimdi yapılması gereken job’ların çalıştırılmasını tetiklemek. Daha doğrusu bu Job’ları TEDAM Manager katmanına iletip, kuyruğa alınmasını sağlamak. Bunu 3 şekilde yapabiliriz.

  • Job’ları TEDAM Face arayüzünden çalıştırdığımızda,
  • Planlanmış Job’ların çalışma vakti geldiğinde,
  • REST API üzerinden Job’lara çalıştırma talebi geldiğinde,Veriyi kod ile ayıracak bir yapının oluşturulması,

TEDAM Manager; kuyrukta sırası gelen Job içindeki Test Set’leri, uygun durumda olan TEDAM Agent’lara dağıtarak, çalışmayı başlatmış olur.

Otomasyon koşusu tamamlandığında ise yine TEDAM Manager katmanı, kendi notification arayüzü ile kullanıcının bilgilendirilmesini sağlar.


Kullanılan Teknolojiler

Java, Vaadin 8, Hibernate, SpringBoot, WebSockets, Chrome Extension, BeanShell Scripts ve tabi ki Selenium.

Burada BeanShell neden var diye bir soru gelebilir. Hemen açıklayalım. Şirket içinde, web dışında geliştirilmiş olan bir java applet ürününü de TEDAM ile otomatize etme hedefini, Selenium desteği olmadığından BeanShell ile yapabildik. Aslında burada önemli olan, web dışındaki ürünler de TEDAM üzerinde gerekli geliştirmeler yapılarak otomatikleştirilebilir. Örneğin masaüstü yazılımlarını test etmek için, Winium scriptleri hazırlanırsa, masaüstü ürünlerinin de testleri otomatikleştirilebilir.


Son Olarak…

Ortaya koymuş olduğumuz hedefleri büyük oranda gerçekleştirdik. Halihazırda şirketimizde 3 farklı üründe TEDAM kullanılarak, binlerce test senaryosu otomatikleştirilmiş şekilde koşabiliyor.

Elbette her ürün gibi TEDAM’ın da gelişmeye açık yönleri olacaktır. Biz aktif olarak geliştirmeye devam ediyoruz. İsteyenler alıp kullanabilsin ve hatta geliştirilebilsin diye projeyi tamamen open source olarak GitHub üzerinde konumlandırdık.

Belki işin içine biraz yapay zeka da katarak, kendini iyileştirebilme yetenekleri geliştirilirse; TEDAM alanında en iyi araçlardan birine dönüşebilir.

Gelişmek ve geliştirmek için herkesi bekleriz.

https://github.com/logobs/tedam

For English, press here! :)