Найти - Пользователи
Полная версия: как и чем протестировать многострочный вывод
Начало » Python для новичков » как и чем протестировать многострочный вывод
1
Florenzo
есть код, выводящий традиционный треугольник из звездочек, вот такой:
    *
   ***
  *****
 *******
*********

код, скажем, такой:
     for z in range(1,10,2):
        print(" " * ((10-z)//2) + "*" * z)
я хочу написать такой тест, который бы ловил именно такой треугольник
(не больше и не меньше), хотя регулируемый еще Лутце :-)

думал-думал - придумал (не работает):
 #========
def bubu():
    for z in range(1,10,2):
        yield print(" " * ((10-z)//2) + "*" * z)
kuku = bubu()
assert next(kuku) == "    *    "
assert next(kuku) == "   ***   "
assert next(kuku) == "  *****  "
assert next(kuku) == " ******* "
assert next(kuku) == "*********"
вываливается на 1-м же ассерте
(треугольник ровный, если что)

==============
иной способ тоже не хочет:
 #========
def bubu():
    for z in range(1,10,2):
        yield print( ("*" * z).center(9) )
kuku = bubu()
"""
assert next(kuku) == "    *    "
assert next(kuku) == "   ***   "
assert next(kuku) == "  *****  "
assert next(kuku) == " ******* "
assert next(kuku) == "*********"
"""
kuku2 = bubu()
assert list(kuku2) == """
    *
   ***
  *****
 *******
*********
"""

И как узнать, что именно видит assert?
Может pytest поможет?
doctest знаю, но тоже не представляю, как это прикрутить



py.user.next
Florenzo
  
yield print(" " * ((10-z)//2) + "*" * z)
Функция print() возвращает значение.
  
>>> x = print('abc')
abc
>>> print(x)
None
>>>

А чтобы написать этот юнит-тест, тебе нужно подменить поток вывода, так как тебе нужно проверять, что у тебя вывела функция print() в поток вывода. Поток вывода находится в sys.stdout, поэтому тебе его нужно пропатчить перед тестом, заменив его на мок-объект. И потом после выполнения функции тебе нужно у этого мок-объекта запрашивать то, что в него вывелось, и сравнивать это с тем, что должно вывестись. Можно и функцию print() пропатчить и заменить её на мок-объект, но это будет неправильно, потому что мы не знаем, с помощью чего функция выводит ёлочку, мы только знаем, что она её выводит. А это может быть и sys.stdout.write() запросто. Поэтому проверять нужно то, что в потоке вывода в итоге оказалось после работы всей функции, выводящей ёлочку.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB