From 53e6c19bfa1987ec7efe66f607506ddaa3f7ab22 Mon Sep 17 00:00:00 2001 From: Alexander Todorov Date: Wed, 8 Jan 2025 15:51:43 +0200 Subject: [PATCH] Add an example performance test written with Locust - a base class which can login into Kiwi TCMS (keeps cookies) and provides a helper method for JSON-RPC API calls - an example test case which GETs the Dashboard page and calls the User.filter API method! --- requirements/devel.txt | 1 + tests/performance/base.py | 50 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 tests/performance/base.py diff --git a/requirements/devel.txt b/requirements/devel.txt index 9dfc38d837..004aa84f71 100644 --- a/requirements/devel.txt +++ b/requirements/devel.txt @@ -4,6 +4,7 @@ doc8 isort==5.13.2 colorama black==24.10.0 +locust parameterized robotframework robotframework-seleniumlibrary diff --git a/tests/performance/base.py b/tests/performance/base.py new file mode 100644 index 0000000000..c5310e3d50 --- /dev/null +++ b/tests/performance/base.py @@ -0,0 +1,50 @@ +# Copyright (c) 2025 Alexander Todorov +# +# Licensed under GNU Affero General Public License v3 or later (AGPLv3+) +# https://www.gnu.org/licenses/agpl-3.0.html + +from locust import FastHttpUser, task, between +from requests.utils import dict_from_cookiejar + + +class LoggedInTestCase(FastHttpUser): + abstract = True + + username = "testadmin" + password = "password" + login_url = "/accounts/login/" + + def on_start(self): + with self.client.get(self.login_url, catch_response=True) as response: + cookies = dict_from_cookiejar(self.client.cookiejar) + csrf_middleware_token = cookies["csrftoken"] + + self.client.post( + self.login_url, + data={ + "username": self.username, + "password": self.password, + "csrfmiddlewaretoken": csrf_middleware_token, + }, + ) + + def json_rpc(self, rpc_method, rpc_args, **kwargs): + payload = { + "jsonrpc": "2.0", + "method": rpc_method, + "params": rpc_args, + "id": "jsonrpc", + } + return self.client.post("/json-rpc/", json=payload, **kwargs) + + +class ExampleTestCase(LoggedInTestCase): + wait_time = between(1, 5) + + @task + def rpc_user_filter(self): + self.json_rpc("User.filter", {}) + + @task + def visit_dashboard_page(self): + self.client.get("/")