From ce5470b7d7a55c44b66848a2cd1243e594e0d428 Mon Sep 17 00:00:00 2001 From: ZQ1 <929165370@qq.com> Date: Wed, 6 Dec 2023 10:45:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20'prac.py'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prac.py | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 prac.py diff --git a/prac.py b/prac.py new file mode 100644 index 0000000..a372762 --- /dev/null +++ b/prac.py @@ -0,0 +1,114 @@ +import random +import sys, os, queue +import time + +environment = 'pre' +sys.path.append('environment tag:{}'.format(environment)) +real_path = os.path.split(os.path.realpath(__file__))[0] +sys.path.append('{}{}..'.format(real_path, os.sep)) +from locust import HttpUser, between, task, TaskSet, events +from locust.runners import WorkerRunner, MasterRunner +from config.common_config import * +from biz import home_page, performance_biz +from lib.thread_logger import get_logger +from lib.edu_http_session import EduHttpSession +from lib.data_convert import string_to_base64 +from api.educoder import practices as _api_practices +from api.educoder import mypractices as _api_mypractices + +logger.to_html = False +stu_queue = queue.Queue() + + +@events.init.add_listener +def on_locust_init_testdata(environment, **_kwargs): + """worker启动时, 注册消息类型(stu_accounts), 用于接收master分发的学生账号""" + if isinstance(environment.runner, WorkerRunner): + environment.runner.register_message("stu_accounts", recv_stu_accounts) + + +@events.test_start.add_listener +def on_test_start(environment, **_kwargs): + """master开始测试时,根据worker数量将所有学生账号分发""" + if isinstance(environment.runner, WorkerRunner): + return + worker_count = environment.runner.worker_count + chunk_size = int(performance_biz.thread_num / worker_count) + # environment.runner.clients 是一个列表,里面放的是每个worker的ID + for i, worker in enumerate(environment.runner.clients): + # 根据数据拿到的下标,截取数据 + data = performance_biz.student_accounts[i * chunk_size:i * chunk_size + chunk_size] + # 发送消息给test_users,并且指定worker + index_info = {"worker": worker, 'data': data} + # 发送详情信息 + environment.runner.send_message("stu_accounts", index_info, worker) + + +def recv_stu_accounts(environment, msg, **kwargs): + """接收master分发的学生账号""" + global stu_list + for stu in msg.data['data']: + stu_queue.put(stu) + + +class TaskTest(TaskSet): + def on_start(self): + self.user_name = stu_queue.get() + self.client.logger = get_logger('{}'.format(self.user_name)) + self.client.logger.info('start test: {}'.format(self.user_name)) + self.my_code = string_to_base64(data=performance_biz.answer_code) + + def on_stop(self): + self.client.logger.info('stop test: {}'.format(self.user_name)) + stu_queue.put(self.user_name) + + @task + def test_practices(self): + # 登录 + my_header = default_headers.copy() + my_header['client'] = self.client + home_page.login_educoder(username=self.user_name, password='12345678', headers=my_header) + # 打开刷题页面(获取 identifier) + res = _api_practices.start(practices_identifier=performance_biz.practices_identifier, headers=my_header) + mypractices_identifier = res.get('identifier') + assert res.get('status') == 0 and mypractices_identifier, f"开始刷题失败:{res}" + mypractices_info = _api_mypractices.get_mypractices(headers=my_header, mypractices_identifier=mypractices_identifier, hidePopLogin=True) + assert mypractices_info.get('practice'), f"在线刷题-获取题目信息失败:{mypractices_info}" + # 提交代码、开始评测 + res = _api_mypractices.update_code(headers=my_header, + mypractices_identifier=mypractices_identifier, + language=performance_biz.language, + code=self.my_code) + assert res.get('status') == 0, f'{self.user_name} 提交代码失败:{res} ,{mypractices_identifier}, {time.time()}' + res = _api_mypractices.code_submit(headers=my_header, mypractices_identifier=mypractices_identifier) + assert res.get('status') == 0, f'{self.user_name} 开始评测失败:{res} ,{mypractices_identifier}, {time.time()}' + # 获取评测结果 + t_start = time.time() + flag = False + result = {} + while time.time() - t_start <= performance_biz.limit_time and flag is False: + time.sleep(1) + result = _api_mypractices.result(headers=my_header, mypractices_identifier=mypractices_identifier) + assert result.get('status') in [0, 1], f'获取评测状态异常:{result}' + if result.get('status') == 0: + flag = True + result_data = result.get('data') + assert result_data, f'{self.user_name} 获取评测结果异常:{result} ,{mypractices_identifier}, {time.time()}' + passed = result_data.get('passed') + assert passed is True, f'{self.user_name} 评测未通过:{result} ,{mypractices_identifier}, {time.time()}' + + +class ExercisePerformance(HttpUser): + host = host + wait_time = between(performance_biz.task_wait, performance_biz.task_wait) # 任务间的时间间隔 + tasks = [TaskTest] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.client = EduHttpSession( + base_url=self.host, + request_event=self.environment.events.request, + user=self, + pool_manager=self.pool_manager, + rest_time=performance_biz.request_wait # 请求间的时间间隔 + )