Locust là một công cụ mã nguồn mở cho phép bạn thực hiện kiểm tra tải (load testing) cho các hệ thống web.
pip install locust
Bạn cần tạo một file Python để định nghĩa các hành vi của người dùng mà bạn muốn mô phỏng. Ví dụ, tạo một file có tên locustfile.py:
from locust import HttpUser, TaskSet, task, between class UserBehavior(TaskSet): @task(1) def index(self): self.client.get("/") @task(2) def about(self): self.client.get("/about") class WebsiteUser(HttpUser): tasks = [UserBehavior] wait_time = between(1, 5)
Trong kịch bản trên:
Sau khi đã viết xong kịch bản test, bạn có thể chạy Locust bằng lệnh sau trong terminal:
locust -f locustfile.py
Locust sẽ khởi động một server web trên cổng 8089 (mặc định). Bạn có thể truy cập vào giao diện người dùng của Locust bằng cách mở trình duyệt và đi đến địa chỉ http://localhost:8089.
Giao diện của Locust sẽ hiển thị các thông số như số lượng yêu cầu đã được gửi, số lượng yêu cầu bị lỗi, thời gian phản hồi trung bình, và nhiều thông tin khác giúp bạn phân tích hiệu suất của hệ thống.
import os import rsa import uuid import base64 import json import time from locust import HttpUser, task, between, constant from colorama import Fore, Back, Style, init # locust -f test.py --csv=locust_report class VerifyInfoTestAPI(HttpUser): #wait_time = between(1, 5) # Khoảng thời gian ngẫu nhiên giữa các tác vụ wait_time = constant(0.1) # Chờ 1 giây giữa các yêu cầu host = "https://example.vn" @task def verify_info(self): with open('private_key.pem', 'rb') as privateKeyFile: privateKeyContent = privateKeyFile.read() privateKey = rsa.PrivateKey.load_pkcs1(privateKeyContent, 'PEM') requestId = str(uuid.uuid4()) partnerId = 'OKBZG0NX42' amount = 30000 payload = requestId + "|" + partnerId + "|" + str(amount) msg = payload.encode("utf-8") signature = rsa.sign(msg, privateKey, 'SHA-1') signature = base64.b64encode(signature) url = '/service/test' payload = { 'request_id': requestId, 'partner_id': partnerId, 'amount': amount, 'signature': signature } print("Params: " + str(payload)) with self.client.post( url, data = payload ) as response: if response.status_code == 200: print(Fore.WHITE + "Response Status (" + requestId + "): " + str(response.status_code) + Style.RESET_ALL) responseContent = response.json() banks = responseContent['data']['banks'] if len(banks) > 0: print(Fore.WHITE + "Response bank (" + requestId + "): " + str(banks) + Style.RESET_ALL) else: print(Fore.RED + "Response bank (" + requestId + "): is empty!" + Style.RESET_ALL) else: print(Fore.RED + "Response Status (" + requestId + "): " + str(response.status_code) + Style.RESET_ALL)
Spawn rate là một thông số quan trọng trong việc kiểm tra tải với Locust. Nó xác định tốc độ mà các người dùng ảo (virtual users) được tạo ra và bắt đầu mô phỏng hành vi người dùng thực.
Khi bạn bắt đầu một phiên kiểm tra tải từ giao diện web của Locust, bạn sẽ thấy hai thông số cần thiết lập:
Ví dụ, Giả sử bạn thiết lập:
Điều này có nghĩa là Locust sẽ tạo ra 10 người dùng ảo mỗi giây cho đến khi đạt tổng số 100 người dùng. Tức là, quá trình tạo ra toàn bộ người dùng sẽ mất 10 giây (100 users / 10 users per second = 10 seconds).
Spawn rate cho phép bạn kiểm soát quá trình tăng tải lên hệ thống một cách từ từ thay vì tạo ra toàn bộ người dùng ảo ngay lập tức. Điều này quan trọng vì:
Khi bạn chạy Locust và truy cập giao diện web tại http://localhost:8089, bạn sẽ thấy hai ô nhập liệu để thiết lập số lượng người dùng và spawn rate. Dưới đây là các bước cụ thể:
Giả sử bạn muốn kiểm tra tải một API tại http://api.example.com với tổng số 200 người dùng và bạn muốn tăng tải với tốc độ 20 người dùng mỗi giây, bạn sẽ:
Với thiết lập này, Locust sẽ tạo ra 20 người dùng mỗi giây và quá trình tạo ra toàn bộ 200 người dùng sẽ mất 10 giây.