Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 19, 2020 23:12:23

Florenzo
Зарегистрирован: 2013-06-05
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

как и чем протестировать многострочный вывод

есть код, выводящий традиционный треугольник из звездочек, вот такой:

    *
   ***
  *****
 *******
*********

код, скажем, такой:
     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 знаю, но тоже не представляю, как это прикрутить



Отредактировано Florenzo (Сен. 19, 2020 23:16:20)

Офлайн

#2 Сен. 19, 2020 23:26:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

как и чем протестировать многострочный вывод

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

А чтобы написать этот юнит-тест, тебе нужно подменить поток вывода, так как тебе нужно проверять, что у тебя вывела функция print() в поток вывода. Поток вывода находится в sys.stdout, поэтому тебе его нужно пропатчить перед тестом, заменив его на мок-объект. И потом после выполнения функции тебе нужно у этого мок-объекта запрашивать то, что в него вывелось, и сравнивать это с тем, что должно вывестись. Можно и функцию print() пропатчить и заменить её на мок-объект, но это будет неправильно, потому что мы не знаем, с помощью чего функция выводит ёлочку, мы только знаем, что она её выводит. А это может быть и sys.stdout.write() запросто. Поэтому проверять нужно то, что в потоке вывода в итоге оказалось после работы всей функции, выводящей ёлочку.



Отредактировано py.user.next (Сен. 19, 2020 23:27:02)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version