Как проверить завершение readline Python?

Я пишу интерфейс командной строки в Python. Он использует модуль readline для предоставления истории команд и завершения.

Пока все работает отлично в интерактивном режиме, я бы хотел запустить автоматические тесты по функции завершения. Моя наивная первая попытка включала использование файла для стандартного ввода:

my_app < command.file

В файле команды содержится вкладка, в надежде, что она вызовет функцию завершения. Не повезло. Каков правильный способ проведения тестирования?

Ответ 1

Для этого я бы использовал Pexpect (версия Python Expect). Библиотека readline должна разговаривать с терминалом, чтобы выполнить интерактивное завершение табуляции, и это не может быть сделано, если он получает только односторонний ввод из перенаправленного файла.

Pexpect работает для этого, потому что он создает псевдотерминал, который состоит из двух частей: подчиненного устройства, где проходит тестируемая программа, и мастера, где выполняется код pexon pexlook. Код pexpect эмулирует человека, запускающего тестовую программу. Он отвечает за отправку символов в подчиненное устройство, включая символы, такие как новая строка и вкладка, и реагирование на ожидаемый вывод (здесь возникает фраза "ожидание" ).

См. программу ftp.py из каталога примеров, чтобы получить хороший пример того, как вы будете контролировать свою тестовую программу из ожидаемого. Вот пример кода:

child = pexpect.spawn('ftp ftp.openbsd.org')
child.expect('(?i)name .*: ')
child.sendline('anonymous')
child.expect('(?i)password')
child.sendline('[email protected]')
child.expect('ftp> ')

Ответ 2

rlcompleter может выполнить то, что вы хотите

Из документации:

Модуль rlcompleter предназначен для использования в интерактивном режиме Pythons. Пользователь может добавить следующие строки в свой файл инициализации (обозначенный переменной окружения PYTHONSTARTUP), чтобы получить автоматическое завершение табуляции:

try:
    import readline
except ImportError:
    print "Module readline not available."
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

https://docs.python.org/2/library/rlcompleter.html

Ответ 3

Отъезд ScriptTest:

from scripttest import TestFileEnvironment
env = TestFileEnvironment('./scratch')

def test_script():
    env.reset()
    result = env.run('do_awesome_thing testfile --with extra_win --file %s' % filename)

И поиграйте с передачей аргументов, как вам угодно.

Ответ 4

Вы можете попробовать Sikuli проверить взаимодействие конечного пользователя с вашим приложением.

Однако это полный избыток, требует много дополнительных зависимостей, будет работать медленно и не сработает, если изменится шрифт/цвета терминала. Но, тем не менее, вы сможете протестировать фактическое взаимодействие с пользователем.

Домашняя страница документации ссылается на слайд-шоу и вопрос вопросов о написании тестов с использованием Sikuli.