2011-01-17 11 views
10

Chciałbym wiedzieć, które narzędzia testowania dla Pythona wspierają testowanie interaktywnych programów. Na przykład, Mam aplikacji uruchomiony przez:testowanie interaktywnych programów python

$ python dummy_program.py 

>> Hi whats your name? Joseph 

chciałbym instrumentem Joseph więc mogę naśladować tę interaktywną zachowanie.

Odpowiedz

1

Najprościej jest prawdopodobnie zależność wtrysku, tak że to, co można zwyczajnie odebrać z sys.stdin (na przykład) jest rzeczywiście obiekt przeszedł w tak można zrobić coś takiego:.

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) 

Na szczęście Python sprawia, że ​​to całkiem proste. Oto bardziej szczegółowy odnośnik do przykładu ośmieszania stdin: http://konryd.blogspot.com/2010/05/mockity-mock-mock-some-love-for-mock.html

+1

Rzeczywiście, zastrzyk uzależnienia jest drogą do zrobienia. Chociaż, jeśli z jakiegoś dziwnego powodu nie może zmienić kodu, może bezpośrednio zmienić 'stdin' i' stdout' za pomocą 'sys.stdin = mock_stdin' i' sys.stdout = mock_stdout'. Jeśli potrzebował oryginałów podczas testu, mógł użyć 'sys .__ stdin__' i' sys .__ stdout__', które zachowują oryginalne wartości. – PaoloVictor

2

Jeśli testujesz program interaktywny, rozważ użycie opcji expect. Został zaprojektowany specjalnie do interakcji z programami konsolowymi (choć bardziej do automatyzacji zadań niż do testowania).

Jeśli nie podoba ci się oczekiwany język (tcl), możesz wypróbować pexpect, co również ułatwia interakcję z programem konsolowym.

Powiązane problemy