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

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

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

my_app < command.file

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

4 ответа

Решение

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

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

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

child = pexpect.spawn('ftp ftp.openbsd.org')
child.expect('(?i)name .*: ')
child.sendline('anonymous')
child.expect('(?i)password')
child.sendline('pexpect@sourceforge.net')
child.expect('ftp> ')

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

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

Модуль rlcompleter предназначен для использования с интерактивным режимом Python. Пользователь может добавить следующие строки в свой файл инициализации (определяемый переменной среды 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

Проверьте 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)

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

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

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

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

Другие вопросы по тегам