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

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

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

11 март 2013

За кои от типовете колекции има литерален синтаксис?

list, tuple, dict, set

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

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

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

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

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

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

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

map

filter

range

dir(itertools)

Как можем да напишем filter чрез list comprehension-и.

lambda func, iterable: [x for x in iterable if func(x)]

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

Шепа съвети

Въпроси?