Playwright ve Artillery.io ile Yük Testi Süreçleri
Yük testi yapmak istiyorsunuz fakat:
jMeter
,K6
,Gatling
gibi araçlar üzerinde uzmanlaşacak vaktiniz mi yok? 🤷🏻
Veya
Swagger
dosyaları,Postman
koleksiyonları, Request, Response’lar arasında kayıp mı oluyorsunuz? 🤔
Dahası
- Testi otomatikleştirmek için ayrı efor, yük testi için ayrı efor harcıyorum. Yok mu bir taşla iki kuş vurabileceğim bir çözüm? diyorsanız.
Artillery.io
bu problemlere çözüm olabilir.
Playwright ❤️ Artillery.io
Playwright
ile yazmış olduğumuz testi, Artillery.io
kullanarak zahmetsiz biçimde yük testine dönüştürebiliyoruz. Nasıl mı? Birlikte inceleyelim:
Bilgisayarınızda:
Node.js yüklü olmalı
Artillery.io yüklü olmalı
node -v
ve artillery -v
komutlarını terminal ekranından çalıştırıp ekteki gibi tepki alabiliyorsanız önemli bir aşama katettik demektir 👍
Örnek Playwright Projesinin Oluşturulması
Örnek Playwright projesini 👉 bu linkteki 👈 gibi oluşturuyorum. PW’nin sorduğu sorulara ekteki gibi cevap veriyorum:
Her şey yolunda gittiyse Playwright
bizim için tests
→ example.spec.ts
dosyası altında has title
isminde örnek test senaryosu oluşmuş olmalı.
import { test, expect } from '@playwright/test';
test('has title', async ({ page }) => {
await page.goto('https://playwright.dev/');
await expect(page).toHaveTitle(/Playwright/);
});
Not: ben örnek projede, örnek test senaryosu üzerinden konuyu anlatıyorum. Tahmin edebileceğiniz üzere örnek test senaryosu yerine kendi yazmış olduğunuz daha karmaşık test senaryosu da olabilir.
Kısaca, bu test ne yapıyor anlamaya çalışalım:
browser ayağa kaldırıyor
https://playwright.dev/ sayfasına yönleniyor
Sayfa başlığı Playwright mı? şeklinde doğrulama yapıyor.
Buraya kadar anlatılan her şey, asıl konuya gelebilmek için hazırlık aşamasıydı. Şu an örnek test senaryosunu, yük testi olarak çalıştırmaya sadece iki adım uzaktayız.
Birinci Adım:
PW
test senaryosunu, fonksiyona dönüştür.İkinci Adım: Yük testinin biçimini (kaç dk sürecek, kaç kullanıcı oluşturulacak vb.) belirten
.YAML
dosyası oluştur.
Birinci Adım: PW Test Senaryosunun Fonksiyona Dönüştürülmesi
Artillery.io
arka planda yük testi için Playwright engine kullanıyor olsa da doğrudan test(‘…‘)
senaryolarını çalıştıramıyor. Bu nedenle test(‘…‘)
senaryolarını manuel biçimde async function
'lara dönüştürmek gerekiyor. Bu işlem örnek senaryo için 10 saniye civarında sürdü.
Artık yük testim aşağıdaki şekilde görünüyor:
// loadTest.ts
import { expect, Page } from "@playwright/test";
export default async function (page: Page) {
await page.goto('https://playwright.dev/');
await expect(page).toHaveTitle(/Playwright/);
}
test(‘..‘)
şeklinde yazdığımız halinden ne farkı var şimdi bunun diyenler için amme hizmeti:
Aradaki fark tam olarak bu:
İkinci Adım: .YAML Dosyası Oluşturulması
Playwright
testlerini, Artillery.io
v2.0.22
versiyonunda iki şekilde yük testi olarak çalıştırabiliyoruz:
TypeScript dosyası oluşturarak (güncel versiyon
v2.0.22
ile tanıtıldı).YAML dosyası oluşturarak
Ben, ikinci yöntem olan .YAML
dosyası oluşturarak devam edeceğim.
# artillery.yml
config:
target: "https://playwright.dev/"
engines:
playwright: {} # Bunun bir PW testi olacağını belirt
phases:
- duration: 10 # Test süresi (saniye)
arrivalRate: 1 # Saniyede oluşturulan kullanıcı sayısı
processor: "./tests/loadTest.ts" # yük testi için hangi dosyayı çalıştıracak?
scenarios:
- engine: playwright
testFunction: "default" #dosya içindeki hangi async function'u çalıştıracak?
name: "has title test"
Yük Testini Çalıştırmak
Her şey hazır, sıra yük testini çalıştırmaya geldi. Oluşturduğum .YAML
dosyasının adı artillery.yml
'dı. Siz farklı bir isim kullanabilirsiniz. Testi çalıştırmak için proje dizinine gidip aşağıdaki komutu kullanabilirsiniz:
artillery run artillery.yml
Her şey yolunda gitmişse Terminal ekranında şuna benzer bir sonuçla karşılaşmış olmalısınız:
zaferdu@ZAFERDU pw-artillery-demo % artillery run artillery.yml
Test run id: ta9xp_3rz4betpadttrddjtgttrzcgfta3w_63f8
Bundled Typescript file into JS. New processor path: /Users/zaferdu/Desktop/pw-artillery-demo/tests/dist/loadTest.js
Phase started: unnamed (index: 0, duration: 10s) 13:21:11(+0300)
Phase completed: unnamed (index: 0, duration: 10s) 13:21:21(+0300)
--------------------------------------
Metrics for period to: 13:21:20(+0300) (width: 7.254s)
--------------------------------------
All VUs finished. Total time: 11 seconds
--------------------------------
Summary report @ 13:21:23(+0300)
--------------------------------
browser.http_requests: ......................................................... 182
browser.page.FCP.https://playwright.dev/:
min: ......................................................................... 165.1
max: ......................................................................... 837.2
mean: ........................................................................ 507.7
median: ...................................................................... 391.6
p95: ......................................................................... 837.3
p99: ......................................................................... 837.3
browser.page.TTFB.https://playwright.dev/:
min: ......................................................................... 59.4
max: ......................................................................... 232.2
mean: ........................................................................ 162
median: ...................................................................... 156
p95: ......................................................................... 232.8
p99: ......................................................................... 232.8
browser.page.codes.200: ........................................................ 182
vusers.completed: .............................................................. 10
vusers.created: ................................................................ 10
vusers.created_by_name.has title test: ......................................... 10
vusers.failed: ................................................................. 0
vusers.session_length:
min: ......................................................................... 967
max: ......................................................................... 5178.9
mean: ........................................................................ 2702.4
median: ...................................................................... 1826.6
p95: ......................................................................... 4231.1
p99: ......................................................................... 4231.1
zaferdu@ZAFERDU pw-artillery-demo %
Test Sonuçlarının Yorumlanması
Genel Bakış:
Test Süresi: Toplam 11 saniye süren bir yük testi gerçekleştirilmiş.
Sanal Kullanıcılar (VUs): Toplam 10 sanal kullanıcı oluşturulmuş ve hepsi başarıyla tamamlanmış. Hiçbir sanal kullanıcı başarısız olmamış.
HTTP İstekleri: Toplam 182 HTTP isteği gerçekleştirilmiş ve hepsi 200 (başarılı) durum kodu dönmüş.
First Contentful Paint (FCP):
FCP, bir web sayfasının içeriğinin ilk kez görüntülenme süresini ölçer. Bu, kullanıcıların sayfanın yüklenmeye başladığını hissettiği andır.
Min: 165.1 ms
Max: 837.2 ms
Median (Ortanca): 391.6 ms
Time to First Byte (TTFB):
TTFB, sunucunun ilk byte'ı göndermesi için geçen süreyi ölçer. Bu, sunucunun ne kadar hızlı yanıt verdiğini gösterir.
Min: 59.4 ms
Max: 232.2 ms
Median (Ortanca): 156 ms
Dürüst olmak gerekirse sonuçlar iyi görünüyor üzerine konuşulabilecek çok bir şey yok. Tabi sonuçların iyi olmasında yük testini küçük çapta yapmamızın katkısı büyük.
Estetik Bir Yük Testi Raporu İçin
Yük testi raporunu görsel anlamda daha tatmin edici hale getirmek için report
komutu vardı. Son versiyonda bu komut kaldırılmış Artillery Cloud’u kullanmanız teşvik ediliyor. Ücretsiz alternatif plugin’lerin çıkacağına şüphem yok. Daha da olmadı, raporu kaydedip eski versiyona geri dönüp raporu generate ettirebilirsiniz 🤓
Artillery.io’nun Avantajları Üzerine
Fark ettiyseniz az önce yük testi yaptık 😀 yeni bir yük testi aracı öğrenmek ve üzerinde uzmanlaşmak için zaman harcamadık. Bu bence önemli bir zaman kazanımı.
UI üzerinde koşan(UI-centric) yük testi senaryosu yazdık. Bu nedenle
Swagger
,Postman
koleksiyonları arasında kaybolmadıkSon kullanıcıya daha yakın yük testi yaptık (bunu biraz açalım)
Artillery.io
Playwright engine testleriheadless browser
üzerinde çalıştırır. UI-centric yük testi yapmanın bize şöyle katkıları vardır:Test edeceğim end-pointleri tek tek çıkarmadım.
Request, Response parse etmek için fazladan efor sarf etmedim.
İstek atarken header’da onu mu yollasam, bunu mu yollasam derdinden kurtuldum.
Yük testi sadece
server side
API’lerin performansını ölçümlemek değildir,client side
tarafta neler olup bittiğine de bakmak gerekir. Dolayısıyla sayfa yüklenme süreleri hesaplanırkenHTML
,CSS
,JS
,HAR
dosyalarının yüklenme hızını da hesaba katmalıyım. Netice itibariyle son kullanıcı sadece API çağırımı yapmaz, siteyi görüntülemek için browser kullanır. Browser ise sayfanın açılabilmesi için bahsettiğim dosyaların yüklenmesini bekler.Kısaca UI-centric load test yaptığım için
HTML
,CSS
,JS
,HAR
dosyalarını taklit etmekle de uğraşmadım.
Sadece Playwright engine kullanmak zorunda değilsin.
HTTP
,WebSocket
,Socket.io
,gRPC
,Kinesis
ve daha fazlası üzerinde yük testi yapabilirsin.Dağıtık test koşturabilirsin (bu tüm yük testi araçlarında olmalı zaten 😀)
Cloud üzerinde test koşturabilirsin (bu da tüm yük testi araçlarında olmalı zaten 😀)
Artillery.io’nun Dezavantajları Üzerine
Playwright engine ile yük testleri sadece chromium tabanlı browser üzerinde koşturabiliyoruz.
Testler, headless bile olsa browser üzerinde koşuyor. Dolayısıyla bir miktar fazla kaynak tüketebilir.
Aklıma başka bir dezavantaj gelmedi 🤷🏻
Ezcümle
Artillery.io
’nun işleri epey kolaylaştırdığına inanıyorum.Son kullanıcıya yakın(UI-centric) yük testi yapmanın önemli olduğunu düşünüyorum (projeye göre değişir)
Yük testi süreçlerinin tamamı olmasa bile bir kısmına
Artillery.io
eklenebilir ve diğer yük testi araçlarının sonuçlarıyla karşılaştırılıp iyileşme noktaları tespit edilebilir diye düşünüyorum.
Beni okuduğun için teşekkürler, bir sonraki yazıda görüşmek üzere 👋👋