Введение в тестирование приложений
Важно добавлять автоматизированные тесты и запускать их при каждом изменении кодовой базы. Тесты требуют небольшого количества времени на написание, но с лихвой окупаются впоследствии.
Тестирование можно разделить на две основные категории: модульное и интеграционное.
Юнит-тесты проверяют часть функциональности в отдельности, в то время как интеграционные тесты проверяют несколько частей, связанных вместе. Юнит-тесты выполняются быстрее и их легче поддерживать, поскольку они фокусируются только на небольшом фрагменте кода.
Интеграционные тесты выполняются медленнее и их сложнее поддерживать, поскольку сбой не указывает на конкретную причину. Большинство разработчиков фокусируются на написании большого количества модульных тестов и небольшого количества интеграционных тестов.
Стандартная библиотека Python содержит встроенный механизм тестирования unittest, который использует экземпляры TestCase и длинный список методов assert для проверки и сообщения о сбоях.
Собственная структура тестирования Django предоставляет несколько расширений поверх базового класса Python unittest.TestCase. Они включают тестовый клиент для выполнения фиктивных запросов веб-браузера, ряд дополнительных утверждений, специфичных для Django, и четыре класса тестовых примеров: SimpleTestCase, TestCase, TransactionTestCase и LiveServerTestCase.
Вообще говоря, SimpleTestCase используется, когда база данных не нужна, в то время как TestCase используется, когда вы хотите протестировать базу данных. TransactionTestCase полезен, если вам нужно напрямую протестировать транзакции базы данных, а LiveServerTestCase запускает поток живого сервера, полезный для тестирования с помощью браузерных инструментов, таких как Selenium.
Небольшое замечание, прежде чем мы продолжим: вы можете заметить, что имена методов в unittest и django.test написаны в camelCase, а не в более питоническом стиле snake_case. Причина в том, что unittest основан на фреймворке тестирования jUnit из Java, который использует camelCase, поэтому, когда unittest был добавлен в Python, он получил именование в camelCase.
Если вы посмотрите на наше приложение blog, Django уже создал файл tests.py, который мы можем использовать. Поскольку в нашем проекте пока не задействована база данных, мы импортируем SimpleTestCase в верхней части файла.
Для наших первых тестов мы проверим, что два URL нашего сайта, домашняя страница и страница о сайте, оба возвращают HTTP код состояния 200, стандартный ответ для успешного HTTP запроса.
blog/tests.py:
from django.test import SimpleTestCase
class HomepageTests(SimpleTestCase):
def test_url_exists_at_correct_location(self):
response = self.client.get("/")
self.assertEqual(response.status_code, 200)
class AboutpageTests(SimpleTestCase):
def test_url_exists_at_correct_location(self):
response = self.client.get("/about/")
self.assertEqual(response.status_code, 200)
Для запуска тестов выйдите из сервера с помощью Ctrl+C и введите в командной строке для запуска тестов:
python manage.py test
Если вы видите ошибку типа AssertionError: 301 != 200, то, скорее всего, вы забыли добавить косую черту к /about выше. Веб-браузер знает, что автоматически добавляет слеш, если он не указан, но это приводит к 301-му перенаправлению, а не к 200-му успешному ответу!