Эмуляция пользовательского ввода в python для тестирования - PullRequest
0 голосов
/ 24 сентября 2018

Я написал простую программу на Python, которая принимает пользовательский ввод с использованием input ().Доступно несколько различных команд.

Я хочу убедиться, что все доступные команды работают должным образом и что программа перехватывает недопустимые команды.Поскольку существует довольно много разных команд, это занимает очень много времени, чтобы сделать вручную (т.е. запустить программу и ввести все команды, одну за другой).(У меня есть отдельные тестовые функции для фактического выполнения всех команд, но я изо всех сил пытаюсь найти хороший способ протестировать эту функциональность вместе с циклом input ().)

Как я могу автоматизироватьпроцесс предоставления (предопределенных) пользовательских вводов, не путая остальную часть кода? В дополнение к использованию этого для тестирования программы, это также послужило бы примером для пользователя, чтобы увидеть возможное использованиепрограммы.

Мое текущее решение состоит в том, что у меня есть две версии функции main (), которая в основном представляет собой просто бесконечный цикл, который принимает входные данные до тех пор, пока не будет дана команда выхода.Первая версия, main (), является версией, предназначенной для использования, и принимает входные данные от input (), пока пользователь не решит выйти.Вторая версия, main_test (), используется только для тестирования и использует входные данные из заранее определенного списка, указанного в коде.Это делает работу, но я не хочу код main_test () в окончательной версии.Я также не хочу «загрязнять» main (), добавляя вещи, используемые только для тестирования.

def main():
    while True:
        user_input = input()
        ...
def main_test():
    test_input = [...]
    test_iter = 0
    while True:
        user_input = test_input[test_iter]
        test_iter += 1
        ...

Мне не удалось найти хороший способ сделать это в Python, хотя я уверен,должен быть умный способ.Я бы предпочел способ, который не требует дополнительного импорта.Но если есть хороший способ сделать это с дополнительным импортом, у меня все уши.

В любом случае, когда я выбрал python, моей следующей мыслью было указать команды в Makefile, где я бы началЗапрограммируйте и введите программу ввода текста, эмулируя пользователя.Основным преимуществом этого является то, что мне нужна только функция "main ()", и мне не нужно ничего менять в коде Python.Недостатком является то, что пример / test указан вне файлов * .py, что может сбить пользователя с толку.

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Прежде всего, я хотел бы отметить, что существует множество методов для тестирования вашего кода, и некоторые из них являются лучшими практиками, чем другие, хотя программист может предпочесть каждый из них по разным причинам.Вы должны научиться тестировать свой код, используя существующие способы.В зависимости от структуры вашего кода, шаблонов, которые можно использовать, и ваших принципов реализации, которым вы следуете (внедрение зависимостей, mvc, mvvm и т. Д.).

Что касается вашего конкретного случая, я бы порекомендовал провести тестирование вашего модуля.часть кода, которая использует пользовательский ввод и определяет набор наблюдений с предопределенными выходными данными, которые вы можете утверждатьЗатем используйте один и тот же код (возможно, добавляйте случаи) всякий раз, когда вы редактируете эту фракцию, чтобы быть уверенным, что ваша программа продолжает работать бегло.

Используя пакет Python * Unittest , вы можете реализоватьхороший скрипт, который последовательно проверяет ваш код и включает его в ваш проект.См. Также Википедия страница о модульном тестировании , чтобы узнать больше о принципах, которым вы должны следовать.Вы также можете проверить страницу тестирования Tensorflow для получения инструкций о том, как включить этот вид тестирования в более крупный проект, и использовать эти идеи в своем.

Удачи!

0 голосов
/ 25 сентября 2018

Ответ отсюда должен работать, если вы не возражаете против импорта unittest, Python, имитирующий необработанный ввод в unittests .

Затем часть main_test () может быть удалена из ваших проектов ипозаботился в скрипте тестирования.Значения return_values ​​соответствуют вашим фиктивным входам.

0 голосов
/ 24 сентября 2018

Если вы хотите подтвердить, что X-ввод приводит к Y-выводу, то то, что вы ищете, называется unit test ;эта методология позволяет вам определять функции, которые оценивают результат вашей функции в сравнении с ожидаемыми результатами.

Опции модуля:
- pytest
- unittest

...