¿Cómo probar la finalización de Python readline?

Estoy escribiendo una interfaz de línea de comandos en Python. Utiliza el módulo readline para proporcionar el historial de comandos y la finalización.

Si bien todo funciona bien en el modo interactivo, me gustaría ejecutar pruebas automatizadas en la función de finalización. Mi primer bash ingenuo involucrado usando un archivo para entrada estándar:

my_app < command.file 

El archivo de comandos contenía una pestaña, con la esperanza de que invocara la función de finalización. Sin suerte. ¿Cuál es la forma correcta de hacer la prueba?

Para esto usaría Pexpect (versión Python de Expect). La biblioteca de línea de lectura debe estar hablando con un terminal para realizar la tabulación interactiva, y no puede hacer esto si solo está obteniendo una entrada de una sola dirección desde un archivo redirigido.

Pexpect funciona para esto porque crea un pseudo terminal, que consta de dos partes: el esclavo, donde se ejecuta el progtwig que está probando, y el maestro, donde se ejecuta el código de Python pexpect. El código pexpect emula al humano que ejecuta el progtwig de prueba. Es responsable de enviar los caracteres al esclavo, incluidos los caracteres como nueva línea y pestaña, y de reactjsr a la salida esperada (de aquí proviene la frase “esperar”).

Consulte el progtwig ftp.py en el directorio de ejemplos para ver un buen ejemplo de cómo controlaría su progtwig de prueba desde dentro de expect. Aquí hay una muestra del código:

 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 puede lograr lo que quieres

De la documentación:

El módulo rlcompleter está diseñado para usarse con el modo interactivo de Python. Un usuario puede agregar las siguientes líneas a su archivo de inicialización (identificado por la variable de entorno PYTHONSTARTUP) para obtener la finalización automática de la pestaña:

 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

Echa un vistazo a 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) 

Y juega con pasar los argumentos como quieras.

Puede intentar usar Sikuli para probar la interacción del usuario final con su aplicación.

Sin embargo, esto es un exceso excesivo, requiere muchas dependencias adicionales, funcionará lentamente y fallará si cambian la fuente / los colores de la terminal. Pero, aún así, podrás probar la interacción real del usuario.

La página de inicio de la documentación enlaza con una presentación de diapositivas y una pregunta de preguntas frecuentes sobre cómo escribir pruebas utilizando Sikuli.