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

Тестирование Django
Модуль тестирования unitest
Написание тестов необходимо для устранения ошибок в проектируемом коде. Вы можете использовать набор тестов — для решения или избежания ряда проблем:

  • При написании нового кода.
  • При рефакторинге или модификации старого кода.
Тестирование веб-приложения — групповая задача, поскольку веб-приложение состоит из нескольких уровней логики — от обработки запросов на уровне HTTP до проверки и обработки форм и рендеринга шаблонов.

Работать с этими группами задач позволяет модуль тестов на Django. Ряд возможностей модуля:
  • моделирование запросов
  • прогон тестовых данных
  • проверка ожидаемых сценариев кода




Предпочтительный способ написания тестов в Django — использование unittest модуля, встроенного в стандартную библиотеку Python.

Код в Unittest устроен по определённым правилам:
  • В тестах Unittest применяют методы встроенного класса unittest.TestCase.
  • Тесты помещаются в классы, наследующиеся от unittest.TestCase.
  • Тесты являются методами данного класса.
  • Имена тестов должны начинаться с префикса test_
Суть каждого теста заключается в том, чтобы:
  • проверить ожидаемый результат
  • проверить условие
  • убедиться, что вызывается конкретное исключение.
Пример теста

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)
Unittest имеет множество методов проверки. Название методов начинается со слова assert. Эти методы используются вместо assert оператора, поэтому средство выполнения теста может собрать все результаты теста и создать отчет.

Вот несколько самых популярных из них:


Все методы имеют в качестве последнего аргумента текст ошибки, которую Вы можете указать.

assertEqual(a, b, "Объект a не равен объекту b")

Другие методы (их список постоянно пополняется) можно найти в официальной документации библиотеки Unittest.
ЗАПУСК ТЕСТОВ
Запуск тестов в Django осуществляется командой python3 manage.py test

Иногда нет необходимости выполнять все тесты проекта, а нужно запустить лишь один тест или определённую группу тестов. Для такого выборочного запуска можно через точечную нотацию указать путь к нужному пакету, модулю, тестирующему классу или методу:

# Запустит все тесты
python3 manage.py test

# Запустит только тесты в приложении application
python3 manage.py test application

# Запустит только тесты из файла test_urls.py в приложении application
python3 manage.py test application.tests.test_urls

# Запустит только тесты из класса StaticURLTests для test_urls.py в приложении application
python3 manage.py test application.tests.test_urls.StaticURLTests

# Запустит только тест test_index()
# из класса StaticURLTests для test_urls.py в приложении application
python3 manage.py test application.tests.test_urls.StaticURLTests.test_index
Информация о выполненных тестах
Команду python3 manage.py test можно запустить с параметром -v (-verbosity), со значением от 0 до 3.
Этот параметр отвечает за детализацию отчёта в тестах.
Если этот параметр не указан явно — по умолчанию он устанавливается равным единице:
Тестовые данные
Фикстуры - тестовое состояние системы или данных
Цель использования тестовых данных (фикстур) - если у вас сложный test case, то подготовка нужного состояния легко может занимать много ресурсов. Используя фикстуры предварительную подготовку состояния пропускаем и сразу приступаем к тестированию.

Фикстуры могут выступать в виде:
  • состояние базы данных
  • набор переменных среды
  • набор файлов с необходимым содержанием.




Для внесения тестовых данных применяются те же методы, что и в Unittest: setUp(), setUpClass() и tearDownClass().

Необходимо создавать тестовые данные в этих классах, если они будут использоваться в последующих нескольких тестах:
  • Метод setUpClass() - вызывается один раз в начале тестов класса.
  • Метод setUp() - выполняется перед каждым тестом
  • Метод tearDownClass() - вызывается после выполнения всех тестов класса.
Расположение тестов
Для большого приложения необходимо создать отдельную директорию test и в ней хранить файлы с тестами.

1) разместить в нём пустой файл __init__.py
2) test_models.py - Тесты моделей
3) test_urls.py - Тесты адресов страниц
4) test_forms.py -Тесты форм
5) test_views.py - Тесты отображений

В каждом файле располагаются тесты для проверки определенных элементов приложения.