2011-01-17 13 views
10

Me gustaría saber qué herramientas de prueba para python admiten la prueba de programas interactivos. Por ejemplo, tengo una aplicación lanzada por:prueba de los programas de python interactivos

$ python dummy_program.py 

>> Hi whats your name? Joseph 

me gustaría instrumento Joseph para que pueda emular ese comportamiento interactivo.

Respuesta

1

Su mejor apuesta es, probablemente, la inyección de dependencias, de manera que lo que se recoge normalmente a partir sys.stdin (por ejemplo) es en realidad un objeto pasado en Así que se podría hacer algo como esto:.

import sys 

def myapp(stdin, stdout): 
    print >> stdout, "Hi, what's your name?" 
    name = stdin.readline() 
    print >> stdout "Hi,", name 

# This might be in a separate test module 
def test_myapp(): 
    mock_stdin = [create mock object that has .readline() method] 
    mock_stdout = [create mock object that has .write() method] 
    myapp(mock_stdin, mock_stdout) 

if __name__ == '__main__': 
    myapp(sys.stdin, sys.stdout) 

Afortunadamente, Python lo hace bastante fácil. Aquí hay un enlace más detallado para un ejemplo de stdin burlón: http://konryd.blogspot.com/2010/05/mockity-mock-mock-some-love-for-mock.html

+1

De hecho, la inyección de dependencia es el camino a seguir. Aunque, por alguna extraña razón, no puede cambiar el código, puede cambiar 'stdin' y' stdout' directamente con 'sys.stdin = mock_stdin' y' sys.stdout = mock_stdout'. Si necesitaba los originales durante la prueba, podría usar 'sys .__ stdin__' y' sys .__ stdout__', que conservan los valores originales. – PaoloVictor

2

Si está probando un programa interactivo, considere usar expect. Está diseñado específicamente para interactuar con programas de consola (aunque, más para automatizar tareas en lugar de pruebas).

Si no te gusta el lenguaje, espera que se base en (tcl) puedes probar pexpect que también hace que sea fácil interactuar con un programa de consola.

Cuestiones relacionadas