AssertionError: '"you\'re Despicable," Said Daffy Duck'
!= '"You\'re Despicable," Said Daffy Duck'
----------------------------------------------------------------------
Ran 4 tests in 0.005s
FAILED (failures=1)
Мы нашли ту же ошибку, что и при использовании unittest, к счастью, в конце
этой главы приводится упражнение, в котором вам предстоит ее исправить.
Другие фреймворки для тестирования
По некоторой причине людям нравится писать тестовые фреймворки для Python.
Если вам любопытно, можете взглянуть на другие популярные решения вроде tox
и py.test.
Отлаживаем свой код
361
Постоянная интеграция
Когда ваша группа генерирует много кода каждый день, полезно автоматизиро-
вать тесты по мере появления изменений. Вы можете автоматизировать системы
контроля версий так, чтобы тесты запускались по мере появления нового кода.
Таким образом, каждый будет знать, что кто-то сломал билд и убежал обедать
пораньше.
Эти системы велики, и я не буду рассматривать детали их установки и ис-
пользования. Если они вам когда-нибудь понадобятся, вы будете знать, где их
искать.
buildbot (http://buildbot.net/). Эта система контроля версий, написанная на Python,
автоматизирует построение, тестирование и выпуск кода.
jenkins (http://jenkins-ci.org/). Система написана на Java, она выглядит наиболее
предпочтительным инструментом для постоянной интеграции в данный момент.
travis-ci (http://travis-ci.com/). Эта система автоматизирует проекты, размещенные
на GitHub, она бесплатна для проектов с открытым исходным кодом.
Отлаживаем свой код
Отладка кода вдвое сложнее, чем его
написание. Так что если вы пишете код
настолько умно, насколько можете, то вы по
определению недостаточно сообразительны,
чтобы его отлаживать.
Брайан Керниган (Brian Kernighan)
Всегда тестируйте свой код. Чем лучше тесты, тем меньше вам предстоит работы
в дальнейшем. Однако ошибки случаются, и их нужно исправлять. Самый простой
способ выполнять отладку в Python — построчно выполнять код. Полезно ото-
бражать результат работы функции vars(), которая извлекает значения ваших
локальных переменных, включая аргументы функций:
>>> def func(*args, **kwargs):
... print(vars())
...
>>> func(1, 2, 3)
{'args': (1, 2, 3), 'kwargs': {}}
>>> func(['a', 'b', 'argh'])
{'args': (['a', 'b', 'argh'],), 'kwargs': {}}
Как вы уже знаете из раздела «Декораторы» главы 4, декоратор может вызывать
код, располагающийся до или после функции, не модифицируя код внутри самой