Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
4 / 3 / 1
Регистрация: 17.08.2020
Сообщений: 50

Тестирование .py файлов

17.09.2020, 08:44. Показов 1945. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, я столкнулся с проблеммой. Нужно быстро оттестировать большое кол-во .py файлов. Имеються: .py файлы написанные учениками для олимпиады. Также имеються файлы "1" и "1.а" и подобные в каждом вайлике "1" есть вопросы к программе, а в "1.а" ответ(который должен получиться через print(), если ли какой то способ быстро протестировать, без изменения кода учеников?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.09.2020, 08:44
Ответы с готовыми решениями:

[Intellij IDEA] Как усовершенствовать локальное тестирование(несколько версий файлов классов)?
У меня есть классы в проекте, где значение переменных достается из кэша, который доступен только при полном разворачивании приложения(что...

Удаленное тестирование приложение/Пересылка на тестирование
Если кто-то написал приложение под андроид и захочет показать другому человеку, то достаточно отослать apk. А как обстоит с этим дело в...

Unit -тестирование или автоматизированное тестирование
Доброго времени суток. Я программирую «для себя» второй год, на выходе получаются разного рода приложения от постоянно подающих с...

6
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
17.09.2020, 09:09
На коленке написано, скорее всего есть готовые скрипты и прочее, но вот моя идея:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import io
import sys
 
old_stdout, sys.stdout = sys.stdout, io.StringIO()
 
files = ["1.py", "1.py", "2.py", "3.py"]
 
for file in files:
    try:
        with open(file, "rt") as f_handle:
            exec(f_handle.read())
        if sys.stdout.getvalue() == "1 2 3\n":
            print(f"File: {file} is accept!", file=old_stdout)
        else:
            print(f"File: {file} wrong answer!", file=old_stdout)
        sys.stdout.seek(0)
    except Exception as error:
        print(error, file=old_stdout)
 
# File: 1.py is accept!
# File: 1.py is accept!
# [Errno 2] No such file or directory: '2.py'
# File: 3.py wrong answer!
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
17.09.2020, 09:25
Можно еще subprocess.Popen использовать.

Пример:

Структура файлов:
code
--pupkin1.py
--pupkin2.py
--pupkin3.py
tasks
--1.txt
--1.a.txt
runner.py

pupkin1.py
Python
1
print(3 * 3)
pupkin2.py
Python
1
2
3
x = 3
result = x ** 2
print(result)
pupkin3.py
Python
1
print(3**3)
1.txt
Code
1
Вычислите значение функции f(x) = x^2 при x = 3.
1.a.txt
Code
1
9
runner.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import os
import subprocess
 
 
py_files = os.listdir('code')
 
with open(os.path.join('tasks', '1.a.txt')) as f:
    answer = f.read()
 
for py_file in py_files:
    file = os.path.abspath(os.path.join('code', py_file))
 
    p = subprocess.Popen(f'python {file}', stdout=subprocess.PIPE, shell=True)
    out, err = p.communicate()
    print(out.decode().strip() == answer)
Результат
Code
1
2
3
True
True
False
1
4 / 3 / 1
Регистрация: 17.08.2020
Сообщений: 50
17.09.2020, 19:00  [ТС]
Я думаю никто из вас не понял, но я повторюсь... из ваших решений я понял как получить данные от программмы, но есть вопрос, как передавать программме входные данные? например пример
Python
1
print(int(input()) ** 2)
и надо будет из файликов считывать из файла входные данные(с этим я и сам справлюсь, вопрос только в том как передавать несколько переменных):
Python
1
2
a = int(input())
b = int(input())...
и ещё 1 пример
Python
1
a = int(input())...
тоесть входные данные могут быть как 1 штука, так и более 2. Например ввод на трёх строчках, ещё есть пример по типу:
Python
1
2
for _ in range(int(input()):
a = int(input())...
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
17.09.2020, 19:16
dail45, патчить инпут системный чтобы вместо реального инпута брал нужные данные. гуглим unittest, его проверки, его patch
импортим по очереди файлы учеников, патченный инпут подает те данные, что мы прочли в файле 1, ассертом проверяем что результат соответствует файлу 1.a

Это конечно если я верно понял. Можешь пример (простейший, не ральный) кинуть мол вот задача, вот инпуты (что подается на вход) вот что на выход ?
0
4 / 3 / 1
Регистрация: 17.08.2020
Сообщений: 50
17.09.2020, 19:34  [ТС]
Нужен пример? пожалуйста:
Python
1
2
3
a = int(input())
b = int(input())
print(a ** b)
Файл 1: "
3
3
"
Файл 1.а: "
27
"
Вас тоже попрошу с кодом или примером как подать данный на вход, с тем как их вытащить из файлов и сам знаю.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 29
17.09.2020, 20:24
dail45, можно подменить инпут и принт ручками, можно с помощью юниттест, я покажу на примере библиотеки checking (pip install checking) просто с ней сейчас работаю, будет быстрее. Это просто пример на подумать и сделать как вам удобнее

предположим что вот это лежит в пакете мейн, в модуле сам_модуль
Цитата Сообщение от dail45 Посмотреть сообщение
a = int(input())
b = int(input())
print(a ** b)
тогда файл test.py будет такой
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from checking import *
 
 
@test
def check_task():
    expected_inputs = ['3', '3']  # что введут в инпуты (мы это достаем из файла)
    expected_result = 27  # что должно быть на выходе (достаем из второго файла)
    iterator = iter(expected_inputs)  # приходится взять итератор, чтобы поэлементно доставать инпуты (по очереди, имитируя 2 ввода)
    print_list = []  # сюда закинем вывод принта
    with mock_builtins('print', lambda x: print_list.append(x)):  # подменяем реальный принт на добавление в список
        with mock_builtins('input', lambda: next(iterator)):  # подменяем реальный инпут на запрос следующего значения из списка инпутов
            import main.some_module  # импортируем модуль ученика, весь код в нем выполняется, но принты и инпуты уже наши, тестовые
 
    equals(expected_result, print_list[0])  # убеждаемся что результат по типу и значению совпадает с ожидаемым
 
 
if __name__ == '__main__':
    start(3)  # запускаем тест
вывод будет
Python
1
2
3
4
5
6
7
8
Starting suite "Default Test Suite"
----------
Test "__main__.check_task"  SUCCESS!
 
==============================
Total tests: 1, success tests: 1, failed tests: 0, broken tests: 0, ignored tests: 0
Time elapsed: 0.00 seconds.
==============================
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.09.2020, 20:24
Помогаю со студенческими работами здесь

Тестирование (или Юнит тестирование)
Доброго времени суток, возник такой вопрос, раньше встречался на фронтенде с js тестированием, сейчас задался вопросом по поводу...

Нагрузочное тестирование и стрессовое тестирование
Разработать компилятор простых арифметических выражений, например 2+ +(-5)*(7-8). Разработать тестовый сценарий нагрузочного...

Тести́рование програ́ммного обеспе́чения(Модульное тестирование, или юнит-тестирование)
Извиняюсь перед администрацией что разместил тему в несоответствующем разделе, не мог найти про тестирование ПО. На днях встал вопрос о...

Удаление файлов по маске, переименование файлов, копирование фалов на ftp, выборка текста из файлов
Написал батник и макросы в excel который делает то, что перечислено в заголовке. Решил перевести это на C#. И сразу столкнулся с...

Компонентами файлов f и g есть целые числа. Не используя дополнителных файлов поменять содержимое этих файлов местами.Нужна Подсказка!
Компонентами файлов f и g есть целые числа. Не используя дополнителных файлов поменять содержимое этих файлов местами. var f,g:text; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru