Performans Testine İlk Adım/JMeter ile Yük Testi
Herkese merhaba,
Bu yazımda sizlere performans testinin ne olduğunu, bir yazılımın neden performans testine ihtiyacı olduğunu ve performans testi türlerinden biri olan yük testinin detaylarından bahsedeceğim.
Keyifle ve ilgiyle okumanız dileğiyle☺
Hadi başlayalım!
Performans Testi Nedir?
Performans Testi, yazılım uygulamalarının belirlenen senaryolarda beklentileri karşılayıp karşılamadığını kontrol etmek amacıyla yapılan fonksiyonel olmayan bir test türüdür.
Performans Testinin Amacı Nedir?
Yazılım uygulamalarında performans testinin yapılmasındaki amaç, belirlenen kıstaslar ölçüsünde uygulanan yük altında, sistemde ortaya çıkabilecek darboğazları bulmaktır.
- Performans testlerinde amaç sistemin bir açığını bulmak değildir. Asıl amaç sisteme yapılan girdilerden alınan dönüşlerle olması gereken sonuçların uygunluğunu tespit etmektir.
Performans testi için aşağıda tanımlanan soruların bilinmesi önemlidir.
Uygulama Yanıt Süresi : Bir görevi tamamlamak ne kadar zaman alır?
Kabul: Sistem canlıya çıkabilecek kadar sağlam mı?
Regresyon: Yazılımın yeni bir sürümünün çıkartılması yanıt süresini olumsuz etkiliyor mu?
Güvenilirlik: Sistem ağır bir iş yükü altında nasıl çalışıyor?
Darboğaz Tanımlama: Performanstaki düşüşün sebebi nedir?
Ürün Değerlendirme: 100 kullanıcı bazında en iyi sunucu hangisidir?
- Performans testlerinin güvenilir sayılabilmesi için test uygulanacak ortamın stabil halde olması gerekmektedir. Tutarsız bir ortamda yapılacak olan performans testlerinin sonuçları da tutarsız olacaktır.
Performans testi genel olarak aşağıdaki üç kavrama odaklıdır:
- Hız: Uygulamanın hızlı yanıt verip vermeyeceğini belirler.
- Kararlılık: Uygulamanın değişen yükler altında kararlı olup olmadığını belirler.
- Ölçeklenebilirlik: Yazılım uygulamasının işleyebileceği maksimum kullanıcı yükünü belirler.
Performans Testinin Türleri
Fonksiyonel olmayan performans testi türlerini aşağıdaki gibi katagorize edebiliriz.
Yük Testi : Yazılım uygulamasına giderek artan sayıda kullanıcı ile yüklenerek sistemin sınırlarını ölçer. Sistemin ne kadar yüke tahammül edebildiğini anlamak için yapılır.
- Yük testi aslında performans testinin bir türevi olarak kabul edilebilir. Temel farkı; yük testlerinin uygulamaya dönük açık ya da hata gibi normal şartlarda ortaya çıkmayan, ağır yüklenmeler sonucunda meydana gelen sonuçlar oluşturmaktadır.
Yük testinde otomotize araçlar kullanılmaktadır. Sınırsız kullanıcı sayısı sunduğundan en bilinen ve kullanışlı olan araç Apache JMeter olmakla birlikte LoadRunner, Gatling, SoapUI ve AppLoader da yük testi için kullanılan araçlardandır. Yük testi yaparken JMeter kullandığım için yazımın devamında JMeter’dan detaylı olarak söz edeceğim.
Stres Testi: Yüksek trafik ve ya veri işlemeyi nasıl işlediğini görmek için bir uygulamayı aşırı iş yükü altında tutarak yazılımın nasıl davrandığını test etmektir. Amaç aşırı yük altında kırılma noktasını belirlemektir. Yani, performans testinde belirlenen maksimum kapasitenin üzerinde bir yüke çıkarak, sistemin hangi noktada kırıldığını ve sistemdeki yükün normal değerlere döndürüldüğünde sistem fonksiyonlarının kararlı ve doğru bir şekilde çalışıp çalışmadığını test eder.
Stres testini yapabilmek için önce yük testi yapıp optimum sonuçları elde etmek gerekir. Çünkü stres testinde yük sürelerinin, yüklerin üstüne çıkılması gerekir.
Dayanıklılık Testi: Sistemin sürekli beklenen kullanıcı yükünü ne kadar devam ettirebileceğini belirlemek için yapılır.
Hacim Testi: Değişen veritabanı hacimleri altında yazılım uygulamasının performansını test etmektir. Amaç anlık yük artışında sistem nasıl davranıyor? Sorusuna cevap bulabilmektir.
Ölçeklenebililik Testi: Yazılım uygulamasının kullanıcı yükünde bir artış gözlemlendiğinde gerçekleştirilen test türüdür. Kapasite arttırımı hakkında planlama yapılmasına yardımcı olur.
Spike Test: Bir yazılım uygulamasının yükte ani ve aşırı bir artış ya da azalış aldığı performans testi türüdür.
Yaptığım yük testi sonucunda aşağıdaki kavramların bilinmesinde fayda olduğunu düşünmekteyim:
Önemli Kavramlar
- Throughput (Verimlilik): Uygulamanın saniyede aldığı istek (request) sayısıdır.
- Response Time (Tepki Süresi): Sistemin isteğe ne kadar sürede cevap verdiğidir.
- Bandwidth (Band Genişliği): Network’de saniye başı kullanılan bit sayısıdır.
- Concurrent User: Sistemde eş zamanlı bulunan kullanıcı sayısıdır.
- Think Time: Kullanıcının iki görev arasında bekleyeceği süredir.
Performans testlerinde özellikle müşteri memnuniyeti açısından gerçek zamanlı kullanıcıların simüle edilmesi çok önemlidir. Bu yüzden yük testi için en uygun aracı seçmek sağlıklı test yapabilmek adına önemlidir.
JMeter’a Giriş
Apache JMeter, bir web uygulaması üzerinde yazılımın performansını analiz ve test etmek için kullanılan açık kaynak test yazılımlarından biridir.
Apache JMeter, Java dili ile yazılmış bir araç olduğundan Java Runtime Environment (JRE) ve ya Java Development Environment (JDK) kurarak Windows, Linux veya Mac gibi işletim sistemine sahip herhangi bir bilgisayarda sorunsuz olarak çalıştırılması mümkündür.
JMeter Özellikleri
- Sınırsız kullanıcı sağlayan açık kaynak kodlu bir uygulamadır.
- Java kullanarak Swing GUI (Graphical User Interface) framework ile geliştirilmiştir.
- Multi-thread çalışabilen bir uygulamadır.
- Birçok performans testini yapabilmeyi sağlar.
JMeter kullanarak kullanıcı senaryoları simüle edilir. Web uygulaması tarafından istenilen girdiler farklılaştırılarak yük miktarı ayarlanıp sistemin tepkisi ölçülür. JMeter test edilmek istenilen uygulamayı sanal kullanıcı gibi varsayarak test eder. JMeter’da açılan bir test planı, web sitesindeki hangi sayfanın ne zaman ve hangi bilgilerle çağrıldığını belirler. HTTP protokolü kullanarak girdi olarak verilen URL linkleriyle web sitesindeki sayfaları gezer.
JMeter Çalıştırma Aşamaları
JMeter kurulumu yapıldıktan sonra uygulama açılır. JMeter java temelli bir yazılım uygulaması olduğundan kurulan bilgisayarda JRE ya da JDK’nın da kurulmuş olduğu kontrol edilmelidir.
- JMeter açıldıktan sonra Test Plan başlığı test edilecek siteye uygun bir isim ile değiştirilir. Test Planı kısmına sağ tıklayarak Add>Threads>Thread Group’u seçilir. Var olan bir test senaryosu ise File>Open>Browse ile açılır.
- Thread Group kısmında kullanıcı sayısı, test saniye aralığı, tekrarlama sayısı, örnekleyici hata alanları ayarlanır. Thread Group’un name ve comment kısmının doldurulması test sonucunda elde edilen raporun daha düzenli ve anlamlı durması açısından önemlidir.
- Thread Group üzerinde sağ tıklayarak Add>Config Element>HTTP Request Default seçilir.
HTTP Request Default, istek yapılacak tüm sayfalarda aynı ayarın kullanılmasını sağlayan bir elementtir. Protocol, Server Name ve Port Number alanları doldurulur.
- Thread Group üzerinde sağ tıklayarak Add>Config Element>HTTP Defined Variables seçilir. Bu element ise aynı ayarı kullanacak olan sayfalara girdi yazılmasını sağlar.
- Thread Group üzerinde sağ tıklayarak Add>Sampler>HTTP Request seçilir. HTTP Request sayfaya istek yapmak için kullanılan bir elementtir. Eğer HTTP Request Default elementinde server name bilgileri doldurulmuş ise bu alanda bulunan server name kısmı boş bırakılır. Yapı olarak ${SERVER_NAME} şeklindedir.
- İstek yapılacak olan sayfada bir veri göndermeyip sadece sayfada bir şeylerin görüntülenmesi bekleniyorsa method kısmı“GET” seçilir. Path kısmına ise gidilmesi istenilen sayfanın url adresi yazılır.
- İstek yapılacak olan sayfaya veri gönderilecek ise method kısmı “POST” seçilmelidir. Path kısmına ilgili sayfanın url adresi yazılmalıdır.
- Çalıştırılan Thread Group’un sonucunu görmek adına sonuç takip elementleri eklenmelidir.
- Thread Group üzerinde sağ tıklayarak Add>Listener>View Results Tree seçilir. Özet halini görmek için Summary report da isteğe göre eklenebilir. Browse alanından daha önceden koşulmuş bir Thread Group’un sonucu incelenebilir.
- Thread Group üzerinde sağ tıklayarak Add>Listener>View Results in Table seçilir. Tablo halinde olan sonuçlar listelenir.
- Kullanıcıya işlem süresi tanımak adına gerekli senaryo steplerinin sonuna “Think Time” elementi koyulur. Her stepin sonunda girilen değer kadar time outa düşmeden beklenilmesi sağlanır.
- JMeter’da senaryonun gerçekleşip gerçekleşmediğini kontrol etmek için “Assertion” elementi koyulur. HTTP Request>Add>Assertion>Response Assertion
Örnek vermek gerekirse GET ile gönderilen bir anasayfa url linki için gerçekten uygulamanın anasayfasına erişip erişmediği kontrol etmek istenirse Response Assertion elementinde “Patterns to Test” alanında ilgili sayfada ayırt edici olan bir text ya da kelime parametre olarak gönderilmelidir.
CSV Data Seti Ayarlaması
Tek senaryoyu farklı kullanıcı bilgileri ile koşmak istediğimizde test senaryomuza csv dosyasını ekleyebiliriz. Örnek olarak bir web sitesinin anasayfasına giriş yapacak olan kişilerin mail adrelerini ve şifrelerini liste halinde verebiliriz:
şifre | |
123456 | |
654321 | |
666666 |
CSV dosyasını sağlayabilmemiz için Jmeter’da senaryoya CSV Data Set Config elementinin eklenmesi gerekir.
- Özetle, Thread ifadesi koşulacak olan senaryo, thread in içine eklenen HTTP Request ise senaryonun steplerini ifade eder. Birden fazla senaryoyu aynı anda çalıştırmak için istenilen thread grupları enable hale getirilir.
JMeter Kullanım Pratikleri
- Yüklü kullanıcı sayısı ile test koşumu yapılacak ise GUI üzerinden değil NonGUI modda testlerin koşulması gerekir.
- View Result Tree gibi listener elementler CPU ve RAM kullanımını artırdığı için test koşumu esnasında disable hale getirilmelidir.
- Assertionlar da CPU ve RAM kullanımını artırdığı için olabildiğince az kullanılmalıdır.
Yük Testinde Karşılan Hatalar ve Çözümleri
- Connection Time Out Hatası
Çözüm: JMeter uygulamasında HTTP Request içinde default tanımlanan time out süresi 20 sn’dir. Senaryo çalıştırılıp connection time out hatası alınmış ise bu hata ilgili sayfaya gitmekte geç kalınmış, bağlantı kopmuş anlamına gelir. Connect alanında default olarak tanımlanan 20 sn süre artırılırsa bu hata ortadan kalkacaktır.
- Read Time Out Hatası
Çözüm:Bu hatanın çözümü connection time out hatasının çözümüne benzerdir. Default atan response time alanındaki sayı artırılırsa hata ortadan kalkar.
- Out of Memory Hatası
Çözüm: Hafızanın yetersiz olduğu durumlarda alınan bir hatadır. Bunun için JMeter uygulamasının yüklü olduğu klasöre gidilmelidir. Uygulama Windows’da çalışıyor ise “jmeter.bat”, Linux ya da Mac’de çalışıyor ise”jmeter.sh” dosyasında bulunan değer artırılmalıdır.
Yük testi için JMeter üzerinden iki farklı şekilde koşum gerçekleştirebiliriz:
- GUI Üzerinden Koşum
- NonGUI (CLI) Üzerinden Koşum
Daha fazla kullanıcı ile test yapabilmeye olanak sağladığı için CLI üzerinde test koşumu daha verimli olacaktır. JMeter’ın kullanıcıya sunduğu user sayısı 5.000 civarındadır. NonGUI üzerinden yüklü sayıda kullanıcı ile testler gerçekleştirilebilir.
NonGUI Mod Çalıştırma Komutları
jmeter -n -t projectdirectory\testPlan.jmx -l projectdirectory\result.csv -e -o projectdirectory\HTMLReports
Yazılan komuttaki parametrelerin ne olduğunu aşağıda açıklayalım:
-n : Jmeter’ın NonGUI modda çalışacağını ifade eder.
-t: Koşulacak olan test planını ifade eder.
-l: Test sonuçlarının yazılacağı dosyayı ifade eder.
-e -o: Test sonuç raporunun nereye oluşturulacağını ifade eder.
NonGUI Mod Örnek Komut: jmeter -Jthreads=50000 -Jrampup=5000 -Jloops=1 -n -t C:\Users\TestUser\Documents\haberturkakademi\HaberturkAkademiDijiDemiTestPlanson.jmx -l C:\Users\TestUser\Documents\haberturkakademi\finalreport.csv -e -o C:\Users\TestUser\Documents\haberturkakademi\HTMLReports
Yazılan komutların çalışabilmesi için Jmeter’ın yer aldığı dizinde “bin” klasörünün altında yer alan “user.properties” dosyasının içine “jmeter.save.saveservice.output_format=csv” satırının eklenmesi gerekir.
GUI modda test senaryosunu koşmak için Jmeter’da Thread Group’ a bazı parametreler verilir. Test koşumunu NonGUI modda koşmak istersek bu parametreleri farklı formda komut içinde yazmalıyız. Aşağıda iki farklı koşum modunda eklenmesi gereken parametre formları yer almaktadır:
JMeter Mod Kullanımı | NonGUI Mod Kullanımı |
${__P(threads,)} | -Jthreads |
${__P(rampup,)} | -Jrampup |
${__P(loops,)} | -Jloops |
${__P(duration,)} | -Jduration |
JMeter Raporlama
HTML Reports
Koşulan test senaryosunun test raporunu oluşturmak istiyorsak aşağıdaki komut satırını kullanarak test sonucunu görebiiliriz:
jmeter -n -t “location of the jmeter script” -l “location of result file”
-e -o “location of the output folder”
Komut satırını çalıştırdıktan sonra HTML Reports klasörünün içinde yer alan “index.html” dosyasına tıklandığında aşağıdaki ekran görüntüsünde yer alan içinde grafiklerin olduğu bir sayfa açılacaktır:
Testler Sırasında CPU,RAM Kullanımının İzlenmesi
Testlerin koşumu sırasında JMeter uygulamasının, test edilen uygulamanın ve varsa veritabanın ne kadar CPU ve RAM kullandığının izlenmesi gerekmektedir. Belirlenmiş olan CPU ve RAM kullanımının üzerine çıkıldığında uygulamaların beklenen hızda olmadığı yani yavaşladığı, bazı durumlarda çöktüğü görülmüştür. Bu tarz durumların analiz edilebilmesi önemlidir. Yük testi sonrasında iyileştirme yapılabilmesi adına sorunun kaynağının bilinmesine yardımcı olur. Network izleyen araçlara PRTGNetwork, Perfmon, Eventviewer ve VisualVM’ i örnek olarak verebiliriz.
Referans
https://jmeter.apache.org/
Faydalı olacağını umuyorum. Konuyla ilgili sorularınız için [email protected] iletişim adresine e-posta atarak ulaşabilirsiniz..
Sağlıkla Kalın,
Sibel KURT