Тестирование в Django

Автоматические тесты очень полезная вещь для современного разработчика. Вы можете использовать наборы тестов – test suite – для решения ряда проблем.

  • Когда разрабатывается новый функционал, можно сразу же писать к нему тесты, чтобы быть уверенным, что он работает так, как ожидается.

  • Когда вы проводите рефакторинг старого кода, тесты обеспечивают гарантию, что изменения не внесут в приложение новых ошибок.

Тестирование веб-приложений представляет собой сложную задачу, так как веб-приложение состоит из нескольких слоев логики – от HTTP запросов на уровне обработки запросов до форм проверки и рендеринга страницы. С помощью тестового фреймворка, встроенного в Django, и нескольких утилит вы можете эмулировать запросы пользователя и проверять какая страница показалась в ответ.

Самое приятное, что это очень легко.

Unit tests v. doctests

Есть два основных пути написания тестов для 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.