From c10a638d9ce0ce3050771a15514e9dcbd0ad3972 Mon Sep 17 00:00:00 2001 From: noO0oOo0ob <38344038+noO0oOo0ob@users.noreply.github.com> Date: Thu, 12 Oct 2023 10:50:33 +0800 Subject: [PATCH] add e2e performance test (#795) * add e2e performance test * remove error import * change request num * change request num * change by review * fix review * remove unsed value * fix review --- e2e_tests/assets/checker.py | 9 ++++ e2e_tests/assets/serve.py | 10 ++++- e2e_tests/conftest.py | 2 + e2e_tests/test_performance.py | 83 +++++++++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 e2e_tests/assets/checker.py create mode 100644 e2e_tests/test_performance.py diff --git a/e2e_tests/assets/checker.py b/e2e_tests/assets/checker.py new file mode 100644 index 000000000..2ae8ce083 --- /dev/null +++ b/e2e_tests/assets/checker.py @@ -0,0 +1,9 @@ +from lyrebird import event +import time + +TITLE = 'test_encoder_decoder' +CHECKER_TIME = 0.5 + +@event('flow') +def test_checker(flow): + time.sleep(CHECKER_TIME) diff --git a/e2e_tests/assets/serve.py b/e2e_tests/assets/serve.py index 800fd5332..70bc8fbfc 100644 --- a/e2e_tests/assets/serve.py +++ b/e2e_tests/assets/serve.py @@ -1,8 +1,10 @@ from flask import Flask, request import hashlib import sys +import time app = Flask(__name__) +CORE_TIME = 0.6 @app.route("/e2e_serve", methods=["POST"]) @@ -10,7 +12,7 @@ def e2e_test(): req_body = request.get_data() if request.files and "file" in request.files: - req_body = request.files['file'].read() + req_body = request.files["file"].read() return hashlib.md5(request.url.encode() + req_body).hexdigest() return hashlib.md5(request.url.encode() + req_body).hexdigest() @@ -20,6 +22,12 @@ def status(): return "OK" +@app.route("/long_time_service", methods=["GET"]) +def long_time_service(): + time.sleep(CORE_TIME) + return "OK" + + if __name__ == "__main__": port = 5000 if sys.argv: diff --git a/e2e_tests/conftest.py b/e2e_tests/conftest.py index fef45c56d..6f444de3f 100644 --- a/e2e_tests/conftest.py +++ b/e2e_tests/conftest.py @@ -46,6 +46,7 @@ def _init_port(self): self.port = 5000 self.api_status = f'http://127.0.0.1:{self.port}/status' self.api_post = f'http://127.0.0.1:{self.port}/e2e_serve' + self.api_long_time_service = f'http://127.0.0.1:{self.port}/long_time_service' def start(self): self.mock_server_process = subprocess.Popen( @@ -78,6 +79,7 @@ def _init_port(self): self.api_status = f'http://127.0.0.1:{self.port}/api/status' self.uri_mock = f'http://127.0.0.1:{self.port}/mock/' self.uri_extra_mock = f'http://127.0.0.1:{self.extra_mock_port}/' + self.api_flows = f'http://127.0.0.1:{self.port}/api/flow' def _find_free_port(self): with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: diff --git a/e2e_tests/test_performance.py b/e2e_tests/test_performance.py new file mode 100644 index 000000000..e4fbfd45f --- /dev/null +++ b/e2e_tests/test_performance.py @@ -0,0 +1,83 @@ +import os +import requests +from concurrent.futures import ThreadPoolExecutor, as_completed +import time + + + +current_path = os.path.abspath(os.path.dirname(__file__)) +checker_path = f'{current_path}/assets/checker.py' +modifier_path = f'{current_path}/assets/flow_editor.py' +REQUEST_NUM = 60 +AVU_DURATION = 2 +ALL_DURATION = 15 + + +def fetch_url(req_url): + response = requests.get(req_url) + return response.text + + +def send_request(url): + with ThreadPoolExecutor() as executor: + futures = [executor.submit(fetch_url, url) for i in range(REQUEST_NUM)] + for future in as_completed(futures): + try: + res = future.result() + except Exception as e: + print(f"Request Error:{e}") + + +def test_performance(lyrebird, mock_server): + start_time = time.time() + send_request(lyrebird.uri_mock + mock_server.api_long_time_service) + end_time = time.time() + duration = end_time - start_time + r = requests.get(url=lyrebird.api_flows).json() + sum_time = sum(flow['duration'] for flow in r) + assert len(r) == REQUEST_NUM + assert sum_time/len(r) < AVU_DURATION + assert duration < ALL_DURATION + lyrebird.stop() + + +def test_performance_with_checker(lyrebird_with_args, mock_server): + lyrebird_with_args.start(checker_path=[checker_path]) + start_time = time.time() + send_request(lyrebird_with_args.uri_mock + mock_server.api_long_time_service) + end_time = time.time() + duration = end_time - start_time + r = requests.get(url=lyrebird_with_args.api_flows).json() + sum_time = sum(flow['duration'] for flow in r) + assert len(r) == REQUEST_NUM + assert sum_time/len(r) < AVU_DURATION + assert duration < ALL_DURATION + lyrebird_with_args.stop() + + +def test_performance_with_modifier(lyrebird_with_args, mock_server): + lyrebird_with_args.start(checker_path=[modifier_path]) + start_time = time.time() + send_request(lyrebird_with_args.uri_mock + mock_server.api_long_time_service) + end_time = time.time() + duration = end_time - start_time + r = requests.get(url=lyrebird_with_args.api_flows).json() + sum_time = sum(flow['duration'] for flow in r) + assert len(r) == REQUEST_NUM + assert sum_time/len(r) < AVU_DURATION + assert duration < ALL_DURATION + lyrebird_with_args.stop() + + +def test_performance_with_checker_and_modifier(lyrebird_with_args, mock_server): + lyrebird_with_args.start(checker_path=[checker_path, modifier_path]) + start_time = time.time() + send_request(lyrebird_with_args.uri_mock + mock_server.api_long_time_service) + end_time = time.time() + duration = end_time - start_time + r = requests.get(url=lyrebird_with_args.api_flows).json() + sum_time = sum(flow['duration'] for flow in r) + assert len(r) == REQUEST_NUM + assert sum_time/len(r) < AVU_DURATION + assert duration < ALL_DURATION + lyrebird_with_args.stop()