|
from typing import Optional |
|
|
|
import requests |
|
from locust import HttpUser, between, task |
|
|
|
API_BASE_URL = "http://localhost:8000" |
|
|
|
|
|
def login(username: str, password: str) -> Optional[str]: |
|
"""This function calls the login endpoint of the API to authenticate the user and get a token. |
|
|
|
Args: |
|
username (str): email of the user |
|
password (str): password of the user |
|
|
|
Returns: |
|
Optional[str]: token if login is successful, None otherwise |
|
""" |
|
url = f"{API_BASE_URL}/login" |
|
headers = { |
|
"accept": "application/json", |
|
"Content-Type": "application/x-www-form-urlencoded", |
|
} |
|
data = { |
|
"grant_type": "", |
|
"username": username, |
|
"password": password, |
|
"scope": "", |
|
"client_id": "", |
|
"client_secret": "", |
|
} |
|
response = requests.post(url, headers=headers, data=data) |
|
if response.status_code == 200: |
|
return response.json()["access_token"] |
|
else: |
|
return None |
|
|
|
|
|
class APIUser(HttpUser): |
|
"""Represents a user in the API.""" |
|
|
|
wait_time = between(1, 5) |
|
|
|
@task(1) |
|
def predict(self): |
|
"""Predicts an image using the model.""" |
|
token = login("admin@example.com", "admin") |
|
files = [ |
|
("file", ("dog.jpeg", open("stress_test/dog.jpeg", "rb"), "image/jpeg")) |
|
] |
|
headers = {"Authorization": f"Bearer {token}"} |
|
payload = {} |
|
self.client.post( |
|
"http://0.0.0.0:8000/model/predict", |
|
headers=headers, |
|
data=payload, |
|
files=files, |
|
) |
|
|