Автоматические тесты очень полезная вещь для современного разработчика. Вы можете использовать наборы тестов – test suite – для решения ряда проблем.
Когда разрабатывается новый функционал, можно сразу же писать к нему тесты, чтобы быть уверенным, что он работает так, как ожидается.
Когда вы проводите рефакторинг старого кода, тесты обеспечивают гарантию, что изменения не внесут в приложение новых ошибок.
Тестирование веб-приложений представляет собой сложную задачу, так как веб-приложение состоит из нескольких слоев логики – от HTTP запросов на уровне обработки запросов до форм проверки и рендеринга страницы. С помощью тестового фреймворка, встроенного в Django, и нескольких утилит вы можете эмулировать запросы пользователя и проверять какая страница показалась в ответ.
Самое приятное, что это очень легко.
Есть два основных пути написания тестов для Django, которые используют разные фреймворки:
Unit tests – тесты оформляются как методы Python-класса, который унаследован от unittest.TestCase или Django-класса TestCase. Например:
import unittest
class MyFuncTestCase(unittest.TestCase):
def testBasic(self):
a = ['larry', 'curly', 'moe']
self.assertEqual(my_func(a, 0), 'larry')
self.assertEqual(my_func(a, 1), 'curly')
Doctests – тесты встроены в строку документации для функции и написаны как будто для выполнения в интерактивном режиме. Например:
def my_func(a_list, idx):
"""
>>> a = ['larry', 'curly', 'moe']
>>> my_func(a, 0)
'larry'
>>> my_func(a, 1)
'curly'
"""
return a_list[idx]
Поскольку Django поддерживает оба способа, можете выбрать любой. А можете использовать и оба сразу.
Новичкам может быть сложно выбрать что-либо одно, поэтому приведём несколько ключевых различий, чтобы помочь с выбором:
Если вы уже погрузились в Python, то способ с doctest может показаться более “pythonic”. Он создан, чтобы наиболее упростить написание тестов, посему не требует дополнительных классов или методов. Просто пишите тесты в строке документации. Ещё один плюс состоит в том, что эти тесты будут видны в документации. Однако, этот способ подходит только для простых случаев; он не подойдёт, если вам нужно высокое качество кода или документации. Очень часто бывает сложно отлаживать такой тест, т.к. непонятно где именно он свалился. Таким образом, doctests больше подходит для пример в документации, в остальных случаях его лучше избегать.
unittest, вероятно, знаком разработчикам, которые писали на Java. Этот фреймворк похож на JUnit и его производные, так что сложностей здесь быть не должно.
Если вам нужно написать кучу тестов для разных кусков кода, то вы оцените организацию классов и методов в unittest. Схожие задачи там легко группируются в схожие методы. Система также поддерживает настройку среды тестирования для прохождения всех возможных ситуаций.
Если вы пишете тесты для Django, то используйте unittest.
Так как модульные тесты являются предпочтительными в Django, то мы рассмотрим их в Testing Django applications.
В Django и doctest разобраны специфичные для Django методы использования тестов в комментариях.
Вы можете использовать и другие фреймворки для тестирования, т.к. в Django есть API и утилиты для быстрой интеграции. Они описаны в разделе Using different testing frameworks документации Advanced testing topics.
Mar 30, 2016