Python — Урок 1.1 TDD для начинающих на Python
Представляю вашему вниманию первую часть первого урока посвящённую разработке через тестирование. Надеюсь будет полезно:) Старался написать максимально простым языком:) Комментарии приветствуются.
Добро пожаловать на серию уроков по Test Driven Development. Для тех кто ещё не знает что такое TDD: Разрабо́тка че́рез тести́рование (англ. test-driven development) — техника программирования, при которой модульные тесты для программы или её фрагмента пишутся до самой программы и, по существу, управляют её разработкой. Основная идея - реализовать правильно работающий функционал, обеспечить возможность повторного использования и простого изменения структуры исходного кода, при этом не изменяя его поведения (рефакторинг)
Давайте в начале рассмотрим из каких
шагов состоит TDD:
Исследование и хакинг. Что нам известно о
Давайте разберём пример:
n! = 1 * 2 * 3 * … * n
0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 и так далее
Предположим, что я впервые открыл интерпретатор python и пока с трудом представляю себе как этом можно
реализовать. :) Попробуем поэксперементировать и немного похакать)
Но для начала, составим список того, что нам понадобиться сделать.
>>> 2 * 3
6
Отлично, наша функция отработала. Не забываем про отступы в функциях, те перед print "hello" у меня стоят два пробела.
Посмотрим как функция будет возвращать наше значение:
С этим разобрались.
Если наш флаг присутствует, то возвращаем True, в противном случае False.
В месте return f(n-1) функция будет вызывать сама себя, но n при этом будет уменьшаться на единицу. Конструкция print "n: %s" % n
вставляет n в строку и форматирует его как строковое значение.
Что-бы упростить задачу, воспользуемся
doctest-ами.
Снова составим список того, что нам надо
сделать:
Попробуйте его запустить из консоли: python
factor.py
Отлично, пока что у нас нечего не выводиться, но файл выполнился.
Попробуем написать тест для простой функции. Doctest записывается в документации к функции, те сразу после названия функции.
Смотрим пример:
Оператор pass означает, что делать нечего не надо. Попробуем запустить: python factor.py
В результате видим:
**********************************************************************
File "factor.py", line 11, in __main__.f
Failed example:
f(1,2)
Expected:
3
Got nothing
**********************************************************************
1 items had failures:
1 of 1 in __main__.f
***Test Failed*** 1 failures.
Отлично, мы проделали первый шаг TDD - «Красный». Приступим к зелёному .
Запускаем и видим, что наша функция прошла тест, второй шаг «Зелёный» вроде пройден, но что если мы попробуем вызвать
f(2, 3). Изменим функцию и посмотрим результат:
Запускаем python factor.py
**********************************************************************
File "factor.py", line 13, in __main__.f
Failed example:
f(2,3)
Expected:
5
Got:
3
**********************************************************************
1 items had failures:
1 of 2 in __main__.f
***Test Failed*** 1 failures
Что и следовало ожидать, мы хотим 2 + 3 = 5, но получили 3. Теперь у нас достаточно тестов чтобы реализовать нашу функцию. Приступим:
Запускаем python factor.py и видим, что тесты прошли. Отлично. Мы написали первую функию в рамках TDD и разобрались с doctest-ом.
На этом я заканчиваю первую часть первого урока. Во второй части разберёмся как реализовать функцию вычисления
факториала.
Напишите функцию разницы. Тест для функции:
Попробуйте написать функцию вычисления факториала используя подход, который я описал для функции сложения. Если не получиться, то попробуйте реализовать как сможете.
Добро пожаловать на серию уроков по Test Driven Development. Для тех кто ещё не знает что такое TDD: Разрабо́тка че́рез тести́рование (англ. test-driven development) — техника программирования, при которой модульные тесты для программы или её фрагмента пишутся до самой программы и, по существу, управляют её разработкой. Основная идея - реализовать правильно работающий функционал, обеспечить возможность повторного использования и простого изменения структуры исходного кода, при этом не изменяя его поведения (рефакторинг)
Давайте в начале рассмотрим из каких
шагов состоит TDD:
- Красный. Подготавливаем файл с тестом,
создаём не работающий тест - Зелёный. Заставляем тест сработать
- Рефакторинг Удаляем дублирование
Исследование и хакинг. Что нам известно о
факториале?
Давайте разберём пример:
n! = 1 * 2 * 3 * … * n
0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 и так далее
Предположим, что я впервые открыл интерпретатор python и пока с трудом представляю себе как этом можно
реализовать. :) Попробуем поэксперементировать и немного похакать)
Но для начала, составим список того, что нам понадобиться сделать.
- Умножение
- Функции
- Условные операторы
- Аргументы функции
- Рекурсия
>>> 2 * 3
6
-
Умножение - Функции
- Условные операторы
- Аргументы функции
- Рекурсия
1 2 3 4 5 6 |
|
Отлично, наша функция отработала. Не забываем про отступы в функциях, те перед print "hello" у меня стоят два пробела.
Посмотрим как функция будет возвращать наше значение:
1 2 3 4 5 |
>>> def f(): |
С этим разобрались.
-
Умножение -
Функции - Условные операторы
- Аргументы функции
- Рекурсия
1 2 3 4 5 6 7 8 9 10 |
>>> def f(flag): |
Если наш флаг присутствует, то возвращаем True, в противном случае False.
-
Умножение -
Функции -
Условные операторы -
Аргументы функции - Рекурсия
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>> def f(n): |
В месте return f(n-1) функция будет вызывать сама себя, но n при этом будет уменьшаться на единицу. Конструкция print "n: %s" % n
вставляет n в строку и форматирует его как строковое значение.
-
Умножение -
Функции -
Условные операторы -
Аргументы функции -
Рекурсия
Что-бы упростить задачу, воспользуемся
doctest-ами.
Снова составим список того, что нам надо
сделать:
- Эксперимент с doctest
- Вычисление факториала
1 2 3 4 5 6 |
#!/usr/bin/python |
Попробуйте его запустить из консоли: python
factor.py
Отлично, пока что у нас нечего не выводиться, но файл выполнился.
Попробуем написать тест для простой функции. Doctest записывается в документации к функции, те сразу после названия функции.
Смотрим пример:
1 2 3 4 5 6 7 8 9 10 11 12 |
def f(a, b): |
Оператор pass означает, что делать нечего не надо. Попробуем запустить: python factor.py
В результате видим:
**********************************************************************
File "factor.py", line 11, in __main__.f
Failed example:
f(1,2)
Expected:
3
Got nothing
**********************************************************************
1 items had failures:
1 of 1 in __main__.f
***Test Failed*** 1 failures.
Отлично, мы проделали первый шаг TDD - «Красный». Приступим к зелёному .
1 2 3 4 5 6 7 8 |
def f(a, b): |
Запускаем и видим, что наша функция прошла тест, второй шаг «Зелёный» вроде пройден, но что если мы попробуем вызвать
f(2, 3). Изменим функцию и посмотрим результат:
1 2 3 4 5 6 7 8 9 |
def f(a, b): |
Запускаем python factor.py
**********************************************************************
File "factor.py", line 13, in __main__.f
Failed example:
f(2,3)
Expected:
5
Got:
3
**********************************************************************
1 items had failures:
1 of 2 in __main__.f
***Test Failed*** 1 failures
Что и следовало ожидать, мы хотим 2 + 3 = 5, но получили 3. Теперь у нас достаточно тестов чтобы реализовать нашу функцию. Приступим:
1 2 3 4 5 6 7 8 9 |
def f(a, b): |
Запускаем python factor.py и видим, что тесты прошли. Отлично. Мы написали первую функию в рамках TDD и разобрались с doctest-ом.
На этом я заканчиваю первую часть первого урока. Во второй части разберёмся как реализовать функцию вычисления
факториала.
-
Эксперимент с doctest - Вычисление факториала
Домашнее задание
Напишите функцию разницы. Тест для функции:
1 2 3 4 5 6 7 8 9 10 11 |
def minus(a, b): |
Попробуйте написать функцию вычисления факториала используя подход, который я описал для функции сложения. Если не получиться, то попробуйте реализовать как сможете.