From 415603318366eb1b60ba1da5c5ab5844b44c8bbb Mon Sep 17 00:00:00 2001 From: sumit_chaturvedi Date: Tue, 3 Jun 2025 10:21:06 +0530 Subject: [PATCH] test(performance): Added resources performance tests --- api/tests/performance/scenarios/resources.py | 33 ++++++++++++++++++++ api/tests/performance/utils/helpers.py | 21 +++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 api/tests/performance/scenarios/resources.py diff --git a/api/tests/performance/scenarios/resources.py b/api/tests/performance/scenarios/resources.py new file mode 100644 index 0000000000..2ac967364d --- /dev/null +++ b/api/tests/performance/scenarios/resources.py @@ -0,0 +1,33 @@ +from locust import HttpUser, task, events +from utils.helpers import get_api_token, get_auth_headers, get_random_resource_id + +GLOBAL = { + "token": None, + "resource_ids": [] +} + +@events.test_start.add_listener +def on_test_start(environment, **kwargs): + GLOBAL["token"] = get_api_token(environment.host) + +class ResourceUser(HttpUser): + def on_start(self): + self.token = GLOBAL["token"] + self.headers = get_auth_headers(self.token) + + with self.client.get("/resources", headers=self.headers, name="/resources", catch_response=True) as response: + if response.status_code == 200: + json_data = response.json() + GLOBAL["resource_ids"] = [item["id"] for item in json_data.get("data", [])[:10]] + else: + response.failure("Failed to load /resources") + + @task(3) + def list_resources(self): + self.client.get("/resources", headers=self.headers, name="/resources") + + @task(2) + def get_single_resource(self): + if GLOBAL["resource_ids"]: + resource_id = get_random_resource_id(GLOBAL["resource_ids"]) + self.client.get(f"/resources/{resource_id}", headers=self.headers, name="/resources/:id") diff --git a/api/tests/performance/utils/helpers.py b/api/tests/performance/utils/helpers.py index 999a2d55c8..7ef7495f83 100644 --- a/api/tests/performance/utils/helpers.py +++ b/api/tests/performance/utils/helpers.py @@ -166,3 +166,24 @@ def get_sort_value(sort_values: list) -> str: str: A formatted sort query string (e.g., "sort=created_at,-severity"). """ return f"sort={','.join(sort_values)}" + +def get_random_resource_id(resource_list): + """ + Selects and returns a random resource ID from the provided list. + + Args: + resource_list (list): A list of resource IDs. + + Returns: + Any: A randomly selected resource ID from the list. + + Raises: + ValueError: If the provided list is empty. + + Example: + resource_id = get_random_resource_id(GLOBAL["resource_ids"]) + """ + if not resource_list: + raise ValueError("The resource list is empty.") + return random.choice(resource_list) + \ No newline at end of file