Locust.io İle Yük Testi Nasıl Yapılır?

Ahmet Demirel
AhmetDemirel-blog
Published in
4 min readMar 29, 2019

Selamlar bu yazımda sizlere Locust.io ile nasıl yük testi yapabileceğimizden bahsedeceğim. Öncelikle locust nedir? Sorusuna cevap vererek başlayalım. Locust Python ile geliştirilmiş açık kaynaklı bir yük test aracıdır. Locust yük test scriptlerini python dili ile hızlı ve kolay bir şekilde yazabilmemize olanak sağlar. Locust HTTP isteklerini desteklediği için testlerimizde HTTP istekleri ile ilerliyoruz.

Örnek bir test scripti oluşturup nasıl olduğunu görelim. Test için gittigidiyor.com sitesini kullanacağız. Sitede ana sayfaya gitme, ürün arama, aranan ürünlerden ürün sayfasına gitme, ürünü sepete ekleme ve sepete gitme işlemlerini yapacağız.

İlk başta bahsettiğim gibi locust python ile geliştirildiği için öncelikle kurulu değil ise bilgisayara python kurmalıyız. Locust python 2.7 ve 3+ desteği var istediğinizi yükleyebilirsiniz ben bu yazıda python 3.7.0 kullandım.

Python yükleme işlemi sonrasında sıra pip kurulumu var. Pip python için paket yükleme aracıdır.

Python2.7 için:

python get-pip.py

Python3 için:

python3 get-pip.py

Pip kurulumu tamamlandıktan sonra sırada locust yükleme işlemi var.

Python 2.7 için:

$ python -m pip install locustio

Python 3 için:

$ python3 -m pip install locustio

Kurulum işlemleri tamamlandığına göre artık test sctripti yazabiliriz.

Öncelikle gittigidiyor.com sitesine get metodu ile istekte bulunuyoruz.

class GittiGidiyor(TaskSet):

@task
def home(self):
self.client.get("https://www.gittigidiyor.com/")

Daha sonra kullanıcı davranışlarında kullanmak için TaskSet ile bir sınıf oluşturmalıyız. Oluşturduğumuz sınıfın içerisine @task bilgi notu ile test adımları için gerekli methodları yazıyoruz. “self.client.get(“https://www.gittigidiyor.com/”) adımı ile siteye get isteğinde bulunabiliyoruz.

@task
def search(self):
search_key_list = ['telefon', 'bilgisayar']
search_key = random.choice(search_key_list)
response = self.client.get("https://www.gittigidiyor.com/arama/?k=" + search_key + "")

pq = BeautifulSoup(response.content, "html.parser")
for link in pq.find_all("ul", attrs={"class": "catalog-view clearfix products-container"}):
list.append(link.li.a["href"])

global product_link
product_link = random.choice(list)

search methodu ile sitede istediğimiz ürün aramasını yapıyoruz. search_key_list listesinden rastgele arama yapmak için bir ürün seçiyoruz ve “https://www.gittigidiyor.com/arama/?k=" + search_key + “” bu urle get isteğinde bulunuyoruz. İstek sonunda dönen sayfadaki ürünlerden birinin sayfasında gidebilmek için url bilgisi gerekli ve bu bilgiyi sayfayı incelediğimizde <a href=’….’ > tagi içerisinde bulabiliyoruz.

HTML kodlarını işleyip sadece bize lazım olan kısmı alabilmek için BeautifulSoup kütüphanesini kullanacağız. BeautifulSoup yükleme işlemini terminale pip3 install beautifulsoup4 yazarak yapabilirsiniz. Kurulum ve kullanım ile ilgili detaylı bilgiyi buradan ulaşabilirsiniz.

pq = BeautifulSoup(response.content, "html.parser")
for link in pq.find_all("ul", attrs={"class": "catalog-view clearfix products-container"}):
list.append(link.li.a["href"])

Sayfaki tüm <ul class=”catalog-view clearfix products-container”> taglerini find_all ile getirdik.For döngüsü yardımı ile bu taglerde dolaşarak taglerin altındaki li ve a taglerine gittik ve sonunda href değerine ulaştık. Bunları ürün sayfalarında gitme işleminde kullanacağımız için bu işlem çok önemli. Ulaştığımız ürün linklerini “list” adındaki bir listeye ekledik ve bu liste içerisinden rastgele bir linki aldık. Daha sonra bu link ile ürün sayfasına get isteğinde bulunduk.

@task
def product_page(self):
response = self.client.get("https:" + product_link)
pq = BeautifulSoup(response.text)
global productId, productNumber
productId = pq.find('input', attrs={'name': 'id'}).get('value')
productNumber = pq.find('input', attrs={'name': 'adet'}).get('value')

Başarılı bir şekilde ürün sayfasına gittik peki ürünü sepete nasıl ekleyeceğiz. Bu konuda kod yazmaya başlamadan browserda networkü inceleyerek POST methodunda bize nelerin gerekli olduğunu bulmalıyız.

Ekran görüntüsünde gördüğünüz gibi post isteği için bize id ve adet bilgisi gerekli. Bu bilgileri ürün sayfasından alacağız. Ürün sayfasında “Sepete Ekle” butonu üzerinde incele dersek eğer bizi <Form … tagi içerisine götürecektir.

Bu form tagi içerisinde gerekli olan id ve adet bilgisine ulaşmış olacağız. Alttaki adımlar ile id ve adet bilgisine ulaştık şimdi sırada bu bilgiler ile post isteğini yapmakta.

productId = pq.find('input', attrs={'name': 'id'}).get('value')
productNumber = pq.find('input', attrs={'name': 'adet'}).get('value')
@task
def add_to_cart(self):
self.client.post("https://www.gittigidiyor.com/sepete-ekle", {"id": productId, "adet": productNumber})
response = self.client.get("https://www.gittigidiyor.com/sepetim/")

Ürün sayfasından ulaştığımız bilgiler ile “https://www.gittigidiyor.com/sepete-ekle” adresine post isteğinde bulunduk ve sonrasında “https://www.gittigidiyor.com/sepetim” adresine get isteği yaparak sepetimize gitmiş olduk. Şimdi sırada TaskSet’lerini belirteceğimiz HttpLocust sınıfını oluşturma işlemi var.

class Gittigidiyor(HttpLocust):
task_set = GittiGidiyor
min_wait = 5000
max_wait = 9000

task_set alanına oluşturduğumuz sınıfı belirtiyoruz. min_wait ve max_wait ise isteğimizin kaç saniye aralığında beklemesini istiyorsak onu belirtiyoruz.

Test adımlarımız için yazdığımız tüm methodlar şu şekilde oldu.

Kodlarımız yazdık peki testi nasıl çalıştıracağız.

locust -f GittiGidiyorLoadTest.py --host=

terminale bu komutu yazdığımızda testimizi çalıştırmış olacağız. “GittiGidiyorLoadTest.py” dosyamızın ismi ne ise onu yazıyoruz. Benim bu şekilde . Eğer yazdığımız test içerisinde url bilgisi vermemişsek --host=”https://www.gittigidiyor.com” şeklinde kullanabiliriz.

Testi çalıştırdığımızda http://localhost:8089/ adresi üzerinde çalışan bir arayüz ile testimizi başlata biliriz. Açılan arayüzde karşımıza böyle bir ekran çıkacak. Burada saniyede kaç kullanıcı, toplamda kaç kullanıcı ile test yapcağımız bilgilerini gireceğiz. Ben kendi testimde saniyede 2 kullanıcı ile toplanda 10 kullanıcı olacak şekilde belirttim.

Kullanıcı sayısını verdikten sonra testi başlatabiliriz.

Yük testimizi böylelikle tamamlamış olduk. Umarım yardımcı bir yazı olur. Projeyi github hesabımdan inceleyip kendi bilgisayarınızda çalıştırabilirsiniz. Proje linki https://github.com/Ahmetdemirel1/Locust-load-testing

--

--