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