/
servgri
/
interview
Обзор
Документация
Войти
/
servgri
/
interview
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
bot_api/test_runner.py
72 строки
2 KB
Seal
initial
27 ноя 2025, 03:03
27 ноя 2025, 03:03
447211e
Код
Авторство
О чём код?
import json import sys import traceback from tasks.models import Task def run_task_tests(task_id: int, user_code: str): try: task = Task.objects.get(id=task_id) except Task.DoesNotExist: return False, "Тесты не найдены — задача отсутствует." tests = task.test_cases or [] if not tests: return False, "Нет тестов для задачи." feedback = [] for i, test in enumerate(tests): try: # Получаем input и output test_input = test.get("input") expected_output = test.get("output") # Подготавливаем код для выполнения # Пример: если input = [1, 2, 3], то в коде создаём переменную `__input__ = [1,2,3]` # и передаём её в пользовательскую функцию/код local_vars = {} # Если вход — список, число или строка, создаём переменную `__input__` local_vars["__input__"] = test_input # Код для печати результата code_to_exec = f""" __result__ = None {user_code} if '__result__' in locals() and locals()['__result__'] is not None: print(locals()['__result__']) """ # Выполняем код from io import StringIO old_stdout = sys.stdout sys.stdout = mystdout = StringIO() try: exec(code_to_exec, {}, local_vars) finally: sys.stdout = old_stdout output_str = mystdout.getvalue().strip() # Для простоты сравнения, преобразуем оба в строки if isinstance(expected_output, (list, dict)): expected_str = json.dumps(expected_output, ensure_ascii=False) else: expected_str = str(expected_output) passed = output_str == expected_str feedback.append({ "passed": passed, "expected": expected_str, "output": output_str }) except Exception: feedback.append({ "passed": False, "expected": str(expected_output), "output": traceback.format_exc() }) success = all(f["passed"] for f in feedback) return success, feedback