Как проверить завершение 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")
Проверьте 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.