Мне нравится TDD, поэтому я сначала стараюсь написать свой Black Box Test
.
Это программа на Python, которая имеет дело с stdin
и выводит в stdout
вот так (я пытаюсь написать свой собственный язык, который работает только с stdin и stdout):
$ python3 ./minor.py
>>> print, "hello\nthis is a good morning"
... hello
. this is a good morning
>>> $quit
Но я не могу издеваться над stdin и stdout. Я пытаюсь использовать subprocess
в Python, но Popen.stdout.read()
висит из-за EOF
, для чего нужно убить программу. Или communicate()
, но он убьет мою программу и не сможет обрабатывать два или более ввода.
Это расстроило меня на 2+ дня, я не могу найти ничего полезного в тестировании имитацией или черным ящиком с помощью stdin / stdout (выглядит странно, что я могу легко протестировать с браузером, но не с stdin / stdout).
Спасибо.
*** First Editing ***
Я создаю новый класс unittest для обработки моего класса. У него есть функция для создания нового объекта Popen.
Я пытаюсь написать на stdin
и подтвердить _11 _... Но он завис только потому, что не может найти EOF
.
Как мне с этим справиться, чтобы это произошло? Спасибо за вашу помощь!
class TestFunc(unittest.TestCase):
def run_minor(self):
return Popen(['python3', './minor.py'],
stdin = PIPE,
stdout = PIPE,
stderr = PIPE,
text = True,
)
def test_print(self):
prop = self.run_minor()
self.assertEqual(prop.stdout.read(), '>>> ')
prop.stdin.write("print, 'this'")
self.assertEqual(prop.stdout.read(), '... this\n>>> ')
prop.stdin.write("$quit")
self.assertEqual(prop.stdout.read(), '')
prop.kill()
sys.stdin
иsys.stdout
являются просто файловыми объектами, вы можете заменить их другими файловыми объектами, которые ведут себя так, как того требуют ваши тесты. Есть случаи, когда вам действительно нужно переопределить FD 0 и FD 1, ноos.dup2()
быстро справляется с этими случаями. - person Charles Duffy   schedule 20.08.2020input/output
. Кстати, я думаю, подходит ли мне использование функции для обработки ввода / вывода, такой как строка ... ввод, затем превращайте его в строку и возвращайте строку, затем вывод ... Или создайте класс с состоянием. - person Peterlits Zo   schedule 21.08.2020