2011-01-17 10 views
10

Vorrei sapere quali strumenti di test per Python supportano la verifica di programmi interattivi. Per esempio, Ho un'applicazione lanciata da:test di programmi python interattivi

$ python dummy_program.py 

>> Hi whats your name? Joseph 

Vorrei strumento Joseph in modo da poter emulare quel comportamento interattivo.

risposta

1

La cosa migliore è probabilmente l'iniezione di dipendenza, in modo che quello che ci si solito pick up da sys.stdin (per esempio) è in realtà un oggetto passato in Così si potrebbe fare qualcosa di simile:.

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) 

Fortunatamente, Python lo rende piuttosto facile. Ecco un collegamento più dettagliato per un esempio di stocking beffardo: http://konryd.blogspot.com/2010/05/mockity-mock-mock-some-love-for-mock.html

+1

Infatti, l'iniezione di dipendenza è la strada da percorrere. Sebbene, per qualche strana ragione, non possa cambiare il codice, potrebbe direttamente cambiare 'stdin' e' stdout' con 'sys.stdin = mock_stdin' e' sys.stdout = mock_stdout'. Se aveva bisogno degli originali durante il test, poteva usare 'sys .__ stdin__' e' sys .__ stdout__', che mantengono i valori originali. – PaoloVictor

2

Se si sta testando un programma interattivo, considerare l'utilizzo di expect. È progettato specificamente per interagire con i programmi della console (anche se, più per l'automazione delle attività piuttosto che per i test).

Se non ti piace la lingua attesa si basa su (tcl) puoi provare pexpect che facilita anche l'interazione con un programma di console.

Problemi correlati