| 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, |
| ) |
|
|