| @@ -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 # 请求间的时间间隔 | |||
| ) | |||