08. Автоматизирано тестване

08. Автоматизирано тестване

08. Автоматизирано тестване

28 март 2016

На какви условия трябва да отговаря обект, за да бъде обхождан от for?

трябва да има __iter__

върнатото от __iter__ трябва да има __next__

Каква е разликата между lazy и eager изчисляването (в контекста на колекциите)?

eager върши всичко в началото и [обикновено] връща списък

lazy върши по малко работа на всяка стъпка от обхождането

Избройте поне 3 вградени функции (или типа), които връщат "мързеливи" колекции.

map

filter

range

dir(itertools)

Как можем да направим следния list comprehension "мързелив"?

[x for x in range(2843294323434329843) if func(x)]

Какво ще се изведе на стандартния изход?

def animals():
    print("You want some animals? I will give you some animals!")
    for animal in {'Panda', 'Raccoon', 'Bear', 'Fox'}:
        yield animal
    print("You want more?")
    return "How about no?"

for animal in animals():
    print(animal)

You want some animals? I will give you some animals!

Bear

Raccoon

Fox

Panda

You want more?

Disclaimer

Днес няма да си говорим за acceptance testing, quality assurance или нещо, което се прави от "по-низшия" отдел във фирмата. Всичко тук е дело на програмиста.

Митът

Проектът идва с готово, подробно задание.

Прави се дизайн.

С него работата се разбива на малки задачи.

Те се извършват последователно.

За всяка от тях пишете кода и приключвате.

Изискванията не се променят, нито се добавя нова функционалност.

Митът v1.1

Щом съм написал един код, значи ми остава единствено да го разцъкам - няколко print-а, малко пробване в main метода/функцията и толкова.

Така или иначе няма да се променя.

А ако (не дай си боже) това се случи - аз съм го писал, знам го, няма как да допусна грешка.

Най-много да го поразцъкам още малко.

Тежката действителност

Искаме да автоматизираме нещата

unittest.TestCase

Всички методи имат опционален последен аргумент msg - текстово съобщение, което ще се покаже ако теста пропадне.

Видове тестове

За какво ни помагат тестовете

За какво не служат тестовете

Още речник

Документация

class Foo:
    """
    Sample Foo class
    """

    def foo(self):
        """
        Sample foo method
        Returns: 2
        """
        return 2

Документацията като тестове

def add(a, b):
    """
    Adds the two arguments.

    >>> add(1, 3)
    4
    >>> add(1, '')
    Traceback (most recent call last):
        ...
    TypeError: unsupported operand type(s) for +: 'int' and 'str'
    """
    return a + b

if __name__ == '__main__':
    import doctest
    doctest.testmod()

Дизайн

Въпрос: какво е "дизайн" на едно приложение?

Test-Driven Development

Test-Driven Development is not about testing.

Test-Driven Development (2)

  1. Добави тест
  2. Пусни всички тестове и виж, че новият се чупи
  3. Напиши код
  4. Пусни тестовете и виж че минават успешно
  5. Подобри кода (refactor)
  6. Повтаряй

Демо

лишън!

Test-Driven Development (3)

Behaviour-Driven Development

Шепа съвети

Въпроси?