paint-brush
QA Test Uzmanları için Python Destekli Performans Testi: Yeni Başlayanlar İçin Bulut API Yük Testi Kılavuzuile@shad0wpuppet
27,067 okumalar
27,067 okumalar

QA Test Uzmanları için Python Destekli Performans Testi: Yeni Başlayanlar İçin Bulut API Yük Testi Kılavuzu

ile Konstantin Sakhchinskiy8m2024/01/19
Read on Terminal Reader
Read this story w/o Javascript

Çok uzun; Okumak

Bulut uygulaması API'lerinde yük testi gerçekleştiren QA test uzmanlarına yönelik Python komut dosyalarını keşfedin. Makale, eşzamansız ve çoklu işlem yaklaşımlarını kapsamakta olup özelleştirme, metodoloji seçimi ve pratik izleme ipuçlarına ilişkin bilgiler sunmaktadır. Kapsamlı performans analizi için Python'un teknik yeteneklerinden yararlanın.
featured image - QA Test Uzmanları için Python Destekli Performans Testi: Yeni Başlayanlar İçin Bulut API Yük Testi Kılavuzu
Konstantin Sakhchinskiy HackerNoon profile picture
0-item
1-item


Kapsamlı programlama uzmanlığına ihtiyaç duymadan performans testine dalmaya istekli bir QA testçisi misiniz? Bu makalede, programcı olmayanların Python kullanarak bulut uygulamaları API'leri üzerinde bir tür yük testi yürütmesinin ulaşılabilir bir yolunu keşfedeceğiz. Karmaşık kodlamaya ihtiyaç duymadan yük testi - Sıradan QA test kullanıcılarının bile ciddi hataları bulmak ve potansiyel performans darboğazlarını ortaya çıkarmak için Python'u nasıl kullanabileceğini keşfedin.


Performans testi, uygulamalarınızın gerçek dünya taleplerini karşılayabilmesini sağlamanın kritik bir yönüdür. Tarayıcıları yöneten bir bulut hizmetinin yük testi için tasarlanmış yaklaşımımı ve Python betiklerini açıklamaya çalışacağım.


Yük Testi Senaryosu Tarayıcı profillerini (web hurdaya çıkarmak için kullanılan tarayıcılar) yönetmekten sorumlu bir bulut hizmeti düşünün. Kullanıcılar profil oluşturmak, başlatmak, durdurmak, silmek vb. için API aracılığıyla hizmetle etkileşime girer. Python betiğim bu senaryoyu simüle ediyor ve bu eylemleri tekrar tekrar gerçekleştirerek bulut hizmetine yük uyguluyor.


 # Dependencies import asyncio import httpx # Configuration API_HOST = 'https://cloud.io' API_KEY = 'qatest' API_HEADERS = { "x-cloud-api-token": API_KEY, "Content-Type": "application/json" } CYCLES_COUNT = 3 # Browser profile configuration data_start = { "proxy": "http://127.0.0.1:8080", "browser_settings": {"inactive_kill_timeout": 120} }

Eşzamansız işlevler: Yük testlerimin kalbi

  • Tarayıcı Profillerini Getirme: get_profiles işlevi, kullanıcıların bilgi talep ettiği bir senaryoyu simüle ederek mevcut tarayıcı profillerini hizmetten alır.
 async def get_profiles(cl: httpx.AsyncClient): resp = await cl.get(f'{API_HOST}/profiles', params={'page_len': 10, 'page': 0}, headers=API_HEADERS) return resp.json()


  • Tarayıcıları Başlatma: Komut dosyası, her biri tarayıcı profillerinin eşzamansız olarak başlatılmasını içeren döngüleri başlatır. Bu, bir kullanıcının aynı anda birden fazla tarayıcı oluşturduğu ve tarayıcı profillerini kullandığı bir senaryoyu taklit eder.
 async def start_profile(cl: httpx.AsyncClient, uuid): resp = await cl.post(f'{API_HOST}/profiles/{id}/start', json=data_start, headers=API_HEADERS) if error := resp.json().get('error'): print(f'Profile {id} not started with error {error}')


  • Tarayıcıları durdurma ve profilleri silme: Profilleri başlattıktan sonra, komut dosyası etkin profilleri getirir ve durdurur, ardından tüm profiller silinir. Bu yük senaryosu, bulut hizmetinin dinamik değişikliklere yanıt verme yeteneğini ve kaynak temizlemedeki verimliliğini değerlendirir.
 async def stop_profile(cl: httpx.AsyncClient, uuid): resp = await cl.post(f'{API_HOST}/profiles/{id}/stop', headers=API_HEADERS) if error := resp.json().get('error'): print(f'Profile {id} not stopped with error {error}') async def delete_profile(cl: httpx.AsyncClient, uuid): resp = await cl.delete(f'{API_HOST}/profiles/{id}', headers=API_HEADERS) if error := resp.json().get('error'): print(f'Profile {id} not stopped with error {error}')


  • Bağlantıların izlenmesi: yük etkisinin anlaşılması Komut dosyası, etkin bağlantıların kontrol edilmesi ve raporlanmasıyla tamamlanır. Bu adım, yük etkisini anlamak ve izlemeyle ilgili olası sorunları belirlemek için çok önemlidir.
 for conn in cl._transport._pool.connections: if conn._connection._state.value != 1: continue print(f'Connection in progress: {conn}')

Yük testi iş başında

Ana işlev, profiller arasında yineleme yaparak ve eşzamansız görevleri yürüterek yük testi döngülerini düzenler. Her döngü, tarayıcı profillerinin oluşturulması, kullanılması ve silinmesi gibi simüle edilmiş bir kullanıcı etkileşimini temsil eder.


 async def main(): async with httpx.AsyncClient(timeout=httpx.Timeout(timeout=300)) as cl: for _ in range(CYCLES_COUNT): profiles = await get_profiles(cl) start_tasks = [asyncio.create_task(start_profile(cl, profile['id'])) for profile in profiles] await asyncio.gather(*start_tasks) active_browsers = await get_active_profiles(cl) stop_tasks = [asyncio.create_task(stop_profile(cl, active_browser['id'])) for active_browser in active_browsers['data']] await asyncio.gather(*stop_tasks) profiles = await get_profiles(cl) del_tasks = [asyncio.create_task(delete_profile(cl, profile['id'])) for profile in profiles] await asyncio.gather(*del_tasks) # Monitor active connections for insights into load impact

Yük testlerini ihtiyaçlarınıza göre uyarlama

Bu komut dosyası, QA'ların yük testi senaryolarını uygulamalarına göre uyarlamalarına yönelik bir temel gösterir. Test uzmanları, döngü sayısını özelleştirerek, kullanıcı etkileşimlerini ayarlayarak ve komut dosyasını belirli API uç noktalarına uyacak şekilde değiştirerek, uygulamalarının farklı yükler altındaki performansına ilişkin değerli bilgiler edinebilir. Burada sunucu durumları hakkında bilgi edinmek, sunucu yükünü değerlendirmek ve kaynak kullanımını ve günlükleri izlemek için temel izleme araçlarına ihtiyacınız olacak. Kapsamlı izleme için Grafana, Kibana, Prometheus vb. araçları kullanın. Ek olarak, komut dosyanızın aldığı yanıtları yakından takip ederek uygulamanızın performansının kapsamlı bir şekilde değerlendirilmesini sağlayın. Bu yaklaşım, etkili yük testinizde ve performans analizinizde çok değerlidir.


Ayrıca daha gerçekçi bir yük simülasyonu için tarayıcınızda belirli sayfaları açmayı düşünün. Ben kişisel olarak tarayıcılarımda bir başlangıç sayfası kullansam da, birden fazla sekme açmak ve çeşitli sayfalar arasında gezinmek için Pyppeteer veya Playwright gibi seçenekleri de keşfedebilirsiniz. Bu yaklaşım, uygulamanızla kullanıcı etkileşimlerine çok benzer şekilde yük testi senaryonuzun orijinalliğini artırır.


 # Attempt to connect to the browser using the provided profile URL try: browser = await connect({'browserWSEndpoint': browser_url, 'defaultViewport': None}) except Exception as e: # Handle connection errors and print a message print(f'Error occurred when connecting to the browser: {str(e)}') return # Create a new page in the connected browser page = await browser.newPage() # Introduce a brief delay to ensure the page is ready await asyncio.sleep(2) # Set the viewport dimensions for the page width, height = 1920, 1080 await page.setViewport({'width': width, 'height': height}) # Try to navigate to a specific URL try: await page.goto('https://{your_website}') # Wait for 10 seconds to simulate user interaction await page.waitFor(10000) # Introduce another delay for additional stability await asyncio.sleep(5) except pyppeteer.errors.PageError as e: # Handle page navigation errors and print a message print(f'Error occurred during page navigation: {str(e)}') # Attempt to take a screenshot of the page try: await page.screenshot(path='screen.png', fullPage=True) # Print a success message if the screenshot is captured successfully print('Screenshot taken successfully.') except Exception as e: # Handle screenshot capture errors and print a message print(f'Error occurred during taking a screenshot: {str(e)}')

Python'un eşzamansız yetenekleri, HTTP kitaplıklarıyla birleştiğinde, onu bulut tabanlı sistemlerin yük testi için çok yönlü bir araç haline getirir. Bu örnek, yük testi girişimlerinde Python'un gücünü öğrenmek isteyen QA mühendisleri için bir başlangıç noktası görevi görüyor.


NOT

Benim senaryomda anlatılan betiğin sağlam ve etkili olduğu ortaya çıktı. Çok sayıda sorunun belirlenmesinde ve ele alınmasında yararlı bir araç olarak hizmet etti. Komut dosyasının agresif doğası, kritik sorunları tespit etmede, etkili hata ayıklamayı kolaylaştırmada ve sorunsuz ve gelişmiş bir kullanıcı deneyimine öncülük etmede iyiydi; bu da bir QA için oldukça iyi.



Devamında Python'un çoklu işlem modülünü kullanan başka bir scriptten kısaca bahsedeceğim. Bu yaklaşım, test komut dosyasının birden çok örneğini eşzamanlı olarak yürüterek yük oluşturmayı geliştirmeyi amaçlamaktadır. Çoklu işlemenin temel amacı, bir betiğin yürütülmesini paralel hale getirerek hizmetle eş zamanlı etkileşime olanak sağlamaktır. Bu yaklaşım, daha önce tartışılan, görevlerin sırayla yürütüldüğü ancak eşzamanlı olarak yönetildiği eşzamansız yaklaşımla çelişmektedir. Bu daha çok aynı isteklere sahip spam/ddos'a benzer, ancak aynı zamanda çok yararlı da olabilir.

Anahtar bileşenler

  • Profilleri alma işlevi: Eşzamansız komut dosyasına benzer şekilde, yine de mevcut tarayıcı profillerini bulut hizmetinden almamız gerekiyor.
 def get_profiles(): response = requests.get(url=f"{api}", params=PARAMS, headers=headers) return response


  • İşlevler: Betiğin özü iki işlev etrafında döner: start_profiles ve stop_profiles. Bu işlevler sırasıyla tarayıcı profillerini başlatır ve sonlandırır.
 def start_profiles(list_of_profiles_uuids): for uuid in list_of_profiles_uuids: # ... (API request to start profile) def stop_profiles(internal_uuids): for uuid in internal_uuids: # ... (API request to stop profile) def run_script(): start_profiles(get_profile_ids()) stop_profiles(list_of_ids)


  • Çoklu işlem yürütme: Betik, yük testi döngüsünü paralel olarak birden çok kez çalıştırmak için çoklu işlem modülünü kullanır. Her döngü için yeni bir süreç oluşturulur ve run_script işlevi eş zamanlı olarak yürütülür.
 if __name__ == "__main__": for runs in range(0, 5): processes = [] for i in range(20): p = multiprocessing.Process(target=run_script) processes.append(p) p.start() for p in processes: p.join()


Çoklu işlemle yük nasıl oluşturulur?

  1. Paralel yürütme: Çoklu işlem modülü tarafından oluşturulan her işlem bağımsız olarak çalışır ve run_script işlevini aynı anda yürütür. Bu paralelleştirme, eş zamanlı olarak hizmete gönderilen istek sayısını önemli ölçüde artırır.
  2. Kullanıcı etkileşimlerini simüle etme: Komut dosyasının birden çok örneğini paralel olarak çalıştırarak, bulut hizmetiyle aynı anda etkileşime giren daha yüksek kullanıcı hacmini simüle ederiz. Bu yaklaşım, gerçek dünya kullanımının çok sayıda eşzamanlı kullanıcıyı içerdiği senaryolar için özellikle kullanışlıdır.

Doğru yaklaşımı seçmek

Çoklu işlem, yük testi uygulamaları için bir strateji sağlar. QA mühendislerinin, uygulamalarının benzersiz özelliklerine göre farklı metodolojileri denemelerine olanak tanır. Asenkron test, eşzamanlı görevlerin yönetilmesinde verimlilik sağlarken, çoklu işlem, tüm test sürecini paralelleştirmede üstünlük sağlar. Özel yük testi hedeflerine ve uygulama gereksinimlerine en uygun yaklaşımı seçebilirsiniz.


Kısa bir hatırlatma:

Bu demo, performans testine girişen QA test uzmanları için Python'un basitliğini vurgulayarak temel kavramları yeni başlayanlara uygun bir formatta tanıtmayı amaçlamaktadır.

Programlama konusunda zorluk yaşıyorsanız, Google'da arama yapmaktan ve meslektaşlarınıza sormaktan çekinmeyin, ChatGPT veya benzer araçları kullanın ve yük testi komut dosyalarınızı yazarken ekstra yardım için GitHub Copilot'u kullanın.


Burada da yayınlandı.