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

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

17.09.2020, 08:44. Показов 1913. Ответов 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
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 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
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru