2011-01-17 4 views
10

Я хотел бы знать, какие инструменты тестирования для python поддерживают тестирование интерактивных программ. Например, у меня есть приложение, выдвинутое:тестирование интерактивных программ python

$ python dummy_program.py 

>> Hi whats your name? Joseph 

Я хотел бы инструмент Joseph так что я могу подражать, что интерактивное поведение.

ответ

1

Лучше всего, вероятно, инъекции зависимостей, так что то, что вы обычно забрать из sys.stdin (к примеру) на самом деле является объект, переданный в Таким образом, вы могли бы сделать что-то вроде этого:.

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) 

К счастью, Python делает это довольно легко. Вот более подробная ссылка на пример издевательства stdin: http://konryd.blogspot.com/2010/05/mockity-mock-mock-some-love-for-mock.html

+1

Действительно, инъекция зависимости - это путь. Хотя, если по какой-то странной причине он не может изменить код, он может напрямую изменить 'stdin' и' stdout' с помощью 'sys.stdin = mock_stdin' и' sys.stdout = mock_stdout'. Если ему нужны оригиналы во время теста, он может использовать 'sys .__ stdin__' и' sys .__ stdout__', которые сохраняют исходные значения. – PaoloVictor

2

Если вы тестируете интерактивную программу, рассмотрите возможность использования expect. Он разработан специально для взаимодействия с консольными программами (хотя больше для автоматизации задач, а не для тестирования).

Если вам не нравится язык ожидания на основе (tcl), вы можете попробовать pexpect, который также позволяет легко взаимодействовать с консольной программой.

Смежные вопросы