2016-11-27 9 views
0

У меня есть консольная программа, написанная на Python. Я хотел бы протестировать несколько комбинаций ввода в автоматической тестовой процедуре. Вход считывается через функцию Pythons input(...).Как я могу генерировать входы клавиатуры для функции ввода «Python»?

  • Как эмулировать клавиатуру или любой другой входной поток для отправки одиночных символов или строк на input?
  • Или мне нужно заменить ввод другой функцией, которая связана с моими тестовыми примерами?
+0

Посмотрите на [unittest.mock] (https://docs.python.org/3/library/unittest.mock.html). – erip

+2

Почему не рефакторинг, чтобы вы могли напрямую вызвать фактическую функциональность? – jonrsharpe

+1

@jonrsharpe Потому что это интеграционный тест и не единичный тест :). – Paebbels

ответ

1

Если это всего лишь тестовый пример, а не «реальная часть большой системы» - это означает, что вам просто нужно передать определенный ввод в исполняемые команды командной строки (например, запустить тест), и вы используете Unix , один удобный способ сделать это с помощью pipes:

// read.py 
val = raw_input() 
print 'nice', val 

затем с помощью консоли:

$ echo "hat" | python read.py 
nice hat 

по синтаксису Windows, является little different - должно быть что-то вроде

dir> python.exe read.py < file.txt 

одна Hacky-простой способ достичь того же самого, чтобы заменить sys.stdin с пользовательским потоком объектом:

sys.stdin = StringIO.StringIO("line 1\nline 2\nline 3") 

следует рассмотреть вопрос об использовании @erip ответа «s, если это нечто большее, чем однако, автоматическая процедура или тестирование домашних заданий учеников по сравнению с фиксированным набором тестов.

+0

Это не очень автоматизированный способ тестирования программного обеспечения. – erip

+1

@erip, если вам нужно, скажем, проверить домашние задания учеников на фиксированный набор предопределенных тестов, то почему бы и нет? :) Оригинальные намерения OP не так ясны. Я полностью согласен с тем, что ваше решение должно использоваться в реальном производстве –

1

Вы можете использовать unittest.mock для исправления вывода функции (включая потоки).

#!/usr/bin/env python3 

import unittest 
from unittest.mock import patch 

# Unit under test. 
def get_input(): 
    my_input = input("Enter some string: ") 
    if my_input == "bad": 
     raise Exception("You were a bad boy...") 
    return my_input 

class MyTestCase(unittest.TestCase): 
    # Force input to return "hello" whenever it's called in the following test 
    @patch("builtins.input", return_value="hello") 
    def test_input_good(self, mock_input): 
     self.assertEqual(get_input(), "hello") 

    # Force input to return "bad" whenever it's called in the following test 
    @patch("builtins.input", return_value="bad") 
    def test_input_throws_exception(self, mock_input): 
     with self.assertRaises(Exception) as e: 
      get_input() 
      self.assertEqual(e.message, "You were a bad boy...") 

if __name__ == "__main__": 
    unittest.main() 

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

  • Нет связанных вопросов^_^