Gatling ile Performans Test Uygulaması - 1
Gatling nedir diye girmeden önce bu seride Github web sayfasına (affet bizi GitHub 🙌) sıfırdan bir yük tesit uygulaması nasıl yazılır, neye dikkat etmek gerek, başa bela olan Session kontrol nasıl yapılır, test sonuçlarını incelenmesi üzerine bir makale olacak.
Bu yazıya başlamadan önce belirtmek isterim ki yazıyı iki bölüm halinde tamamlamaya karar verdim, bu bölümde Gatling ve performans mühendisliği hakkında bilgi verip daha sonra ikinci bölümde maven ile Gatling ile yük testi nasıl hazırlanır 0 → 100 .
Performans Test sistemin belirli durumlarda, belirlenen beklentileri verip vermediğini kontrol etmek amacıyla yapılan testlerdir. Uygulamanın normal şartlar altında tepki süresinin ölçülmesidir
Stres Test sistemin belli yoğun günlerde(black Friday) maksimum kullanıcı sayısında anlık olarak yüklenmektir. Sonrasında sistemin ne kadar sürede toplandığını gözlemlemektir.
Yük Testi sisteme aşamalı bir şekilde kullanıcı sayısını artan bir şekilde yüklenmesi ile sistemin darboğazlarını sınırlarını belirlemektir.
Performans değerlendirme kısımında google mühendislerinin söylediklerine göre kullanıcıların yarısından fazlası site 3 saniyeden daha fazla sürede yükleniyorsa siteden çıkış yaptığını söylüyor. Sitelerimizi mümkün olduğunca daha hafif yapıp amaca yönelik olması gerektiğini düşünüyorum. Canlı Tv amacı olan bir sitede ve birde anlık 5K kullanıcının sisteme dahil olacağını biliyorsan mantık aslında çok basit olmalı kullanıcının temel akışı Anasayfa → Login → Canlı Tv → Logout ama siteyi siz bu amacın dışında kullanıp her yerde yüksek kalitede resim yada gereksiz css kullanırsanız performans diye birşey beklemek yanlış olur. Web sitesini performansını ölçerken online kullanılabilecek araçlar;
Gtmetrix ile github.com ve hürriyet.com yapmış olduğum performans değerlendirmelerinin sonuçlarına baktığımızda github.com için sayfanın boyutu 2.03 MB, 3 saniye altında yüklenmiş ama rapora baktığımızda sayfada kullanılan resimlerin boyutu büyük olmasından dolayı PageSpeed puanı düşüktür, hürriyet.com için sayfanın boyutu 5.40 MB, 10 saniye civarında yüklendi sonuç olarak önerilere baktığımızda hürriyet.com için performans açısından yapılması gerekenler çok sayıda gözükmektedir ama unutulmaması gereken bize sunduğu rapordaki herşey yaptığınızda herşey çok iyi olacak diye birşey yok. Web sitesinin performansını etkileyen dolaylı faktörler Available bandwith, Client yada Server gibi dış etkenler bulunmaktadır.
Bir web sayfasının performansı aşağıdaki sebeplerden kaynaklı olabilmektedir.
- Öncelikle resimleri optimize edin ve öncelikle png uzantılı minify edilmiş resimler kullanın
- Bu sayede HTML sayfanın boyutu küçülür daha hızlı şekilde kullanıcıya servis edilir.
- Kullanılmayan Javascript ve CSS kodlarını kaldırın
- Belikide önemlisi Javascript ve CSS minify etmek
- Tarayıcı cache mekanizmasını kullanmak
- Lazyload yöntemini benimsemek
- HTTP 2.0 kullanmak daha fazla paralel bağlantı demek
- CDN seçiminde daha mantıklı karar verin
Gatling kendi sitesinde yük ve performans test uygulaması diye tanıtıyorlar aslında bence fonksiyonel, nonfonksiyonel, performans, yük yada stres test uygulaması diye tanıtsak yanılmayız herhalde 😃 Gatling başta web uygulamaları olmak üzere bir çok servisi test edip performans incelemesi yapabileceğimiz OpenSource(beleş 😝 ) yük testi uygulamasıdır. Gatling tabanında Scala, Akka Netty dayanmaktadır. Akka actor modelde herkes aktördür. Scala zaten JVM üzerinde çalıştığı için OS tipi önemli değil ve Gatling çok başarılı bir şekilde kendi DSL( Domain Specific Language) sahiptir. Bence Gatling’in en büyük avantajı en azından kendim için :) bir araç değilde yazılım tabanlı olması geliyor.
Gatling’in en büyük rakibi olan jmeter XML tabanlı olması ve herşey thread mantıkında çalışması dezavantaj olarak karşımıza çıkmaktadır. Gatling avantajları ise; 1K ~ 20K kullanıcı sayısına rahatça çıkabilmektedir, Burada kullanıcılar thread değil ama aktör sistemde bulunurlar, Birden fazla kullanıcıyı tek bir thread ile simule ederiz, yüksek JVM performansı ve düşük CPU kullanımı rakiplerine kıyasla gerçekten çok büyük avantaj, aynı zamanda test yaptınız testin sonucunu otomatik olarak HTML formatında oluşturup size URL döndürmektedir, Continuous integration deneyimi Maven, SBT ve Jenkins sahiptir, Herhangi bir işletim sistemine bağımlı değildir. Gatling kabuk yapısına bakıldığında ise;
İkinci bölümde baştan sona bir projeyi hazırlığı olacak fakat kısa bir dokunuşla mimari yapıya bakamaya devam ederim. Öncelikle projemizi gatling’in sunduğu Simulation methodundan kalıtım alarak başlıyoruz sonrasında hangi web uygulamasına test yapılacağı url adresi base url methoduna set ediyoruz ve simdi can alıcı nokta senaryo hazırlığı başlıyor bir senaryo içinde n tane http isteği oluşturabiliriz yada n tane senaryo hazırlanabilir ve son olarak setup diyerek projemize kullanıcıların nasıl sisteme dahil edileceğini hazırlıyoruz sonra run run :) . Merak etmeyin ikinci bölümde daha çok uygulama üzerinden konuşacağız.
Gatling DSL yapısının sunduğu en çok kullanılan özellikler;
- Feeder dosya okuma işlemi esnasında kullanılır ve okuduğu önemli dosya tipleri “csv, json, redis” ve bunları okuma yöntemi “circular, random,queue” seçebiliriz. Circular dediğinizde dosyanın okuma yöntemidir ve dosyadaki bütün değerler kullanıldı ama o sırada yeni kullanıcılar geldiği için tekrar baştan okuma işlemi yapar.
private val userDocumentation = csv("user.csv").circular
- HTTP checks bu işlem neticesinde response objesini kontrol etmek gelir. Web sitesinden dönen response kodunu bizim beklentimizle eşleşiyor mu? Aslında en çok kullanılan özelliklerden biri ve iyi anlaşılması gereken bir özellik aşağıdaki blok bize web sayfasından dönen http status kodunu kontrol ediyor eğer beklentimiz dışında bir değer dönerse o senaryo fail eder.
HTTP Durum Kodları
1xx = Bilgi
2xx = Başarılı istek
3xx = Yeniden yönlendirme
4xx = İstemci kaynaklı hata
5xx = Sunucu kaynaklı hata Check kullanımı
1. Check (status is 200)//Response kod 200 bekliyor
2. Check (status.in(200,301)//200 yada 301 bekliyor
- Check özelliğini en çok kullandığımızı yer bize dönen response body’nin içeriğini kontrol etmek, Örnek olarak kullanıcı login isteğinde bulundu ve bize sayfadan bir body döndü bu dönen body json ise jsonpath ile gerekli check işlemi yapılabilir yada doğrudan HTML dönüyorsa o zamanda regex yada css selector kullanmak gerek bence css selector daha başarılı işlemler yapabiliriz.
Check(jsonPath(“$.status”).saveAs(“SessionName”))Check(regex(“<status>(.*?)</status>”).saveAs(“SessionName”))Check(css(“input”,”value”).saveAs(“SessionName”))
- Injection profil yani ne demek kullanıcı davranışı çizmek ee yani söyle anlatmak gerek; atonceuser(userCount) sisteme bir anda userCount kadar kullanıcıyı dahil eder. Simdi tutup 20K kullancıyı sisteme bir anda dahil ederseniz herhalde site yerlerde olur 😃, rampuser(userCount) ise sisteme kullancıları belirli bir süre içinde dahil eder ve constantusersPersec (userCount) ise sisteme saniyede bu kadar kullanıcı dahil eder. Test sonuçlarına assertion yani istatistiksel datalar tanımlayabiliriz. Aşağıda kullandığım assertion bloğunun anlamı test genelinde fail yani patlayan request testin genelinin %5'den fazla ise test başarısız olsun
//Bu yapı hakkında detaylı bilgi ikinci bölümde olacak
setUp(
loginScn.inject(atOnceUsers(nbUsers))).protocols(baseUrl) .assertions(global.failedRequests.percent.lt(5) )
Evet bu yazı benim medium çatısı altında ilk kez yazdığım yazı olarak karşınızda umarım beğenerek okursunuz, ikinci bölümün yayın tarihi 24 Nisan da sizlerle bu arada konu başlıkları ise söyle olacak;
- Gatling projesi oluşturma
- Dinamik HTML raporunu inceleme
- Biz digiturk bünyesinde Gatling nasıl kullanıyoruz
İkinci Bölüm Yayınlandı
Bana buradan yada aşağıdaki linkten ulaşabilirsiniz
LinkedIn: www.linkedin.com/in/korhan-hergüner
Mail: korhanherguner@gmail.com
Twitter:https://twitter.com/kherguner2