Locust ile Performans&Yük Testi

Merhabalar, bugünkü yazımda açık kaynak kodlu Locust performans ve yük testi aracından bahsedeceğim. Locust, en çok bilinen Apache firmasının yapmış olduğu JMeter uygulamasına göre biraz farklı bir araç. JMeter ile neredeyse herşey arayüzden yapılıyor ama Locust çoğu işlemi kod ile hallediyor. Kod ile yapılabilmesinin hem avantajı hemde dezavanatajları var tabii… Gelelim şimdi Locust kurulumuna.

Ben kurulumu windows makine için anlatacağım. İlk önce makinenize Python’ın 3.6 ve sonrası bir sürümünü kuruyoruz. Bu kısmı anlatmıyorum, internetten arayıp bulabilirsiniz. Python ile gelen pip3 paket yükleyicisi ile Locust kurulumunu aşağıdaki şekilde yapıyoruz.

> pip3 install locust

Eğer pip3 komutu tanınmıyor hatası alıyorsanız Python ve pip’ın yerini sistem değişkenleri path kısmında belirtmelisiniz. Kurulum yapıldıktan sonra kontrolünü aşağıdaki şekilde sağlayalım.

> locust -V
locust 2.1.0

Locust, python tabanlı bir kütüphane olduğu için kodları python dili ile yazmak gerekiyor. Python kod yazmak içinde en uygun editörlerden bir tanesi de PyCharm. PyCharm’ı bu adresten indirip kuruyoruz. Şimdi PyCharm’da önce proje sonra bir tane python dosyası oluşturalım.

Evet ilk locust örneğimizi yapmaya başlayalım. Örneğimizde https://reqres.in sayfasındaki test API servislerini kullanacağım. Sizde kendi denemelerinizde farklı adresleri kullanabilirsiniz. Şimdi aşağıdaki kod ile https://reqres.in altındaki /api/login ve /api/users API servislerine istek gönderme testini yapmış oluyoruz.

from locust import HttpUser,task,between
class MyUser(HttpUser):
    host = "https://reqres.in"
    wait_time = between(1,5)
    @task(4)
    def login_test(self):
        self.client.post("/api/login", json={
            "email": "eve.holt@reqres.in",
            "password": "cityslicka"
        })
    @task(2)
    def get_user_list(self):
        self.client.get("/api/users?page=2")

Şim yukarıdaki kodumuzu parça parça açıklamaya çalışayım.

from locust import HttpUser,task,between

from locust import … ile, locust kütüphanesinin altındaki kullanacağımız metodları belirtmiş oluyoruz.

class MyUser(HttpUser):
    host = "https://reqres.in"
    wait_time = between(1,5)
  • MyUser(HttpUser) ile HttpUser sınıfından türetilmiş ve test yapacak her bir kullacımızı temsil eden sınıfımızı oluşturmuş oluyoruz.
  • host: Test yapılacak adres bilgisini öndeğer belirtmiş oluyoruz.
  • wait_time = between(1,5): Her bir test arasındaki en düşük ve en fazla olan bekleme süresini belirliyor. Yani bu örnekte her bir test arası en düşün 1, en fazla 5 saniye bekletilir.
    @task(4)
    def login_test(self):
        self.client.post("/api/login", json={
            "email": "eve.holt@reqres.in",
            "password": "cityslicka"
        })
    @task(2)
    def get_user_list(self):
        self.client.get("/api/users?page=2")

@task ile kullanıcının yapacağı görevleri belirlemiş oluyoruz. Bu örneğimizde kullanıcıya iki tane görev tanımladık. Bir tanesi login_test diğeri get_user_list. @task notasyonundan sonra parantez içindeki değerler ile iki görevin çağrılma ağırlıklarını belirlemiş oluyoruz. Yani bu örneğimizde get_user_list görevi 2 kez çağrılırken, login_test‘i 4 kez çağrılacak anlamına geliyor. Eğer hiç değer girilmez ise eşit miktarda çağrılır. Bu şekilde görevlerinizin kullanımına göre testlerinizde ağırlık verebilirsiniz.

self.client.get() ve self.client.post() ile test yapacağımız api servislerimize get veya post isteği göndermiş oluyoruz.

Şimdi gelin bu testi nasıl başlatıyoruz onu görelim. PyCharm altında ki terminal tabından yada powershell, komut satırı ekranında aşağıdaki komutu çalıştırıyoruz.

> locust -f apitest.py

-f parametresi ile dosyanın yerini belirtmemiz gerekiyor. Sadece locust komutu ile çalışması istenirse, komut çalıştırılan yerde locustfile.py isimli bir dosya olması gerekiyor. Komutu çalıştırdıktan sonra browserımızın adres çubuğuna http://localhost:8089 yazarak locust web_ui ekranını açalım. Sayfayı açtığımızda aşağıdaki gibi bir ekran ile karşılaşıyoruz.

  • Number of users: Test yapılacak toplam kullanıcı sayısını belirtir. Bizim örneğimizde 1000 kullanıcı testi olacak.
  • Spawn rate: Her bir saniyede eklenecek kullanıcı sayısını belirtir. Bizim örneğimizde her bir saniyede 100 kullanıcı artarak 1000 kullanıcı testi olacak.
  • Host: Buradaki bilgi dolu geldi çünkü bu bilgiyi kod kısmında öndeğer belirtmiştik. Eğer kod kısmında belirtilmez ise burası boş gelecek ve elle girerekte testimizi başlatabiliriz.

Şimdi bilgilerimizi girdikten sonra Start swarming butonuna basalım. Aşağıdaki ekran ile karşılaşıyoruz.

Yukarıdaki sayfada sırası ile yanıt süresi gibi bilgilerin gösterildiği Statistics, grafiksel gösterimlerin olduğu Charts, hataların gösterildiği Failures ve Exceptions, verilerin bir cvs dosyasına aktarılabileceği Download Data sayfaları yer almaktadır.

Şimdi Statistics sayfasındaki tablo kolonlarının ne anlama geldiğini kısaca anlatmaya çalışayım.

  • Type: Yapılan isteğini türünü gösteriyor. Bizim örneğimizde get ve post istekleri vardı.
  • Name: İstek atılan adresin endpoint ismi.
  • # Requests: Toplam request sayısını ifade eder.
  • # Fails: Toplam hata sayısını ifade eder.
  • Median (ms): Yapılan isteklerin milisaniye cinsinden median’ını yani ortanca değerini gösterir.
  • 90%ile (ms): Yanıt sürelerinin %90 kısmındaki en büyük değerini gösterir. Ortalama süre değerinin doğru olmadığı düşünüldüğü durumlarda bu tarz yüzdelik dilimlere bakıldığı için buraya eklenmiş.
  • Average (ms): Ortalama yanıt süresi(ms).
  • Min (ms): Minimum yanıt süresi(ms).
  • Max (ms): Maksimum yanıt süresi(ms).
  • Average size (bytes): İndirilen ortalama içerik değeri.
  • Current RPS: Anlık saniyedeki istek sayısı.
  • Current failures: Anlık saniyedeki hata sayısı.

Charts sayfasında da aşağıdaki gibi herbir saniyedeki toplam istek sayısı, istek süresi ve kullanıcı sayılarını grafiksel olarak göstermektedir.

Testimizi aynı zamanda web arayüzü olmadan da çalıştırabiliriz. Bunun için komut satırında aşağıdaki komutu çalıştıralım.

> locust -f apitest.py --headless --only-summary -u 1000 -r 100 -t 25s
  • –headless: Arayüz olmadan çalıştırmayı sağlıyor.
  • –only-summary: özet bir console çıktı vermesini sağlıyor.
  • -u: Toplam kullanıcı sayısını belirler.
  • -r: Her bir saniyede eklenecek kullanıcı sayısını belirler.
  • -t: Testin ne kadar süre çalışacağını belirler. Yani bu örnekte 25 saniye sonra test sonlanacaktır.

Komut çalıştırıldıktan sonra komut satırı ekranında aşağıdaki gibi bir görüntü çıkacaktır.

Bu terminal çıktısında, web arayüzü statistics sayfasındaki bilgilerin benzeri bilgiler gösterilmektedir. İstenirse bu bilgiler bir dosyaya yazdırılabilir. Bunu da aşağıdaki komut ile yapabiliriz.

> locust -f apitest.py --headless --only-summary -u 1000 -r 100 -t 25s --csv=example

Bu komut çalıştırıldığında 4 farklı cvs dosyası oluşur. Bunların isimleri sırası ile example_exceptions.cvs, example_failures.csv, example_stats.csv ve example_stats_history.csv. İsimlerinden anlaşılacağı gibi hata, istisna ve istatistiki bilgileri ayrı ayrı gösteren dosyalar bunlar.

Son olarak ta master ve worker kullanımını anlatıp bu yazımı sonlandırmak istiyorum. Test koşulan makinelerin donanım özellikleri yapılan test yükünü kaldırmadığı durumlarda yükü birden fazla makineye dağıtmak için Locust master/worker ayrımına gitmiş.

Master, worker’lar üzerindeki datayı bir yerde toplayan makine o yüzden 1 tane olmalı. Worker, testlerin koşulacağı birden fazla olabilecek makineler.

Bir makinenin master çalışabilmesi için aşağıdaki gibi çalıştırılması gerekir.

locust -f apitest.py --master

Worker olarak çalışması için de aşağıdaki şekilde çalıştırılması gerekir.

locust -f apitest.py --worker --master-host=192.168.x.x

Burada dikkat edilmesi gereken husus çalıştırılan python dosyasının her iki makinede de aynı olması gerekir. Böylece master makine üzerinde worker makineler üzerindeki datalar toplanarak gösterimi sağlanabilir.

Faydalı olması dileği ile…



Leave a comment