Язык программирования Python

UnitTest в Django – как проводить. С примером.

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

Но прежде чем начать, для тех, кто не до конца понимает…

Что такое модульные тесты или unittests?

Юнит-тесты – это скрипты, которые мы создаем для проверки правильности функционирования фрагментов нашего кода. Это помогает нам исправить возможные ошибки при внесении изменений в наши проекты, которые можно пропустить.

Как использовать их в Django?

В приложении, созданном на Django, мы можем использовать их, например, для проверки правильности работы страницы, тестирования перенаправлений, создания пользователей, создания данных в базе и многого другого.

Плюс тестирования в Django в том, что для выполнения тестов Django создает новую базу данных, с помощью которой выполняются тесты, поэтому данные, которые мы храним в исходной базе данных, не подвергаются опасности. Очень важно, чтобы пользователь, которого мы используем для подключения к базе данных нашего проекта, был пользователем с правами на создание базы данных, иначе процесс будет неудачным. Еще один важный момент: по окончании процесса база данных будет удалена, если вы не укажете обратное.

Реализация тестов в Django

Каждый раз, когда мы создаем приложение с помощью manage.py (python manage.py startapp ), мы создаем файл tests.py, в котором сохраняем наши тесты. В первом примере мы проверим, что страницы входа и регистрации активны, а также выполним вход и регистрацию, чтобы убедиться, что эти функции работают правильно.

Для этого откроем файл users/tests.py и добавим следующие библиотеки, которые мы будем использовать:

users/tests.py

# Django from django.test import TestCase from django.test import Client # Python from http import HTTPStatus # Models from django.contrib.auth.models import User
Code language: CSS (css)

Первый – TestCase – это класс, от которого наш класс будет расширяться в этом тесте, он используется для наследования методов тестирования из unittests.TestCase.

Следующий – “Клиент”. Мы будем использовать этот класс для выполнения запросов к нашему сайту простым способом, в котором мы можем передавать метод (GET, POST и т.д.) и, по желанию, параметры и конфигурации.

Из Python мы будем использовать класс HTTPStatus, который содержит константы со статусом запроса к веб-сервису (200 – ok, 404 – not found и т.д.).

В конце мы берем модель пользователя, поскольку она понадобится нам для создания пользователей и проверки их существования.

Следующее, что мы сделаем, это определим класс и проверим, что страница входа в систему и страница регистрации работают. Для этого мы добавим следующий код:

class UserTestCase(TestCase): def setUp(self): self.c = Client() def test_is_ok_page_login(self): response = self.c.get('/login') self.assertEqual(response.status_code, HTTPStatus.OK) def test_is_ok_page_register(self): response = self.c.get('/register') self.assertEqual(response.status_code, HTTPStatus.OK)

Первое, что мы делаем, это определяем класс, который будет расширять TestCase. Для правильной работы имя класса должно заканчиваться TestCase, а формат имени должен быть CamelCase.

Следующее, что мы сделаем, это создадим функцию setUp. Эта функция будет выполнена непосредственно перед запуском теста. В данном случае мы хотим, чтобы он создавал экземпляр класса Client для каждого теста, поскольку мы собираемся использовать его во всех наших тестах.

Первый тест под названием test_is_ok_page_login, который запустит запрос get на страницу входа и проверит с помощью assertEqual (это один из методов unittest), возвращает ли он нужный нам статус (в данном случае он должен вернуть статус 200, что означает, что все прошло хорошо). Важно отметить, что все создаваемые нами тесты должны начинаться со слова test_ и быть в формате snake_case, иначе он не запустит их. Для проверки страницы регистрации мы сделаем точно так же.

Теперь, когда у нас есть тесты для проверки состояния страниц входа и регистрации, мы собираемся проверить, что login работает правильно, для этого мы добавим следующий тест:

def test_login_user(self): credentials = { 'username': 'Ivan Login', 'password': '4efefwefefwefB3rgVM' } user = User.objects.create_user(**credentials) response = self.c.post('/login', credentials, follow=True) self.assertTrue(response.context['user'].is_active)
Code language: PHP (php)

Для этого теста мы определим некоторые учетные данные пользователя, которые мы будем использовать для создания пользователя с помощью User.objects.create_user. Эта функция создаст пользователя со статусом is_active, по умолчанию установленным в True.

Затем мы запускаем запрос к странице входа в систему для каждого поста, отправляя учетные данные и добавляя параметр follow=True. Это гарантирует, что когда запрос будет запущен и будут сделаны перенаправления, клиент будет следовать им до конца, если мы не добавим этот параметр, вход не будет успешным.

Наконец, мы проверяем тест с помощью asserTrue, который проверяет, что переданный параметр равен True.

После того, как мы создали тест для входа, пришло время проверить, можем ли мы зарегистрировать пользователя, для этого мы добавим следующий код:

def test_register_user(self): data = { 'username': 'TestIvan', 'email': 'ivan@mail.com', 'password': '4ABefef3rgVM', 'password_confirmation': '4ABefef3rgVM', } response = self.c.post('/register', data) try: user = User.objects.get(username=data['username']) except User.DoesNotExist: user = NULL self.assertIsInstance(user, User)
Code language: PHP (php)

Для этого теста мы создаем словарь с параметрами, необходимыми для создания пользователя, а затем передаем его на страницу регистрации через метод post для создания пользователя.

Затем мы проверяем, существует ли пользователь, используя User.objects.get и передавая имя пользователя, которое мы определили ранее. Этот тип запроса должен использоваться только с уникальными полями, потому что если мы используем поле, которое не является уникальным, мы можем получить другого пользователя и неправильно подтвердить тест в случае ошибки.

Наконец, мы проверяем достоверность теста с помощью assertIsInstancce, который проверяет, является ли результат нашего запроса экземпляром класса User. Если это так, то он выдаст его как действительный.

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

Для запуска наших тестов нам достаточно выполнить следующую команду:

python manage.py test
Code language: CSS (css)

Эта команда запустит все тесты, которые есть в нашем проекте. Если бы у нас было несколько тестов, и мы хотели бы запустить только те, которые относятся к пользовательскому приложению, мы бы сделали это следующим образом:

manage.py test users.tests
Code language: CSS (css)

Если вы хотите узнать больше о тестах в Django, я оставляю ссылку на документацию.

Заключение

Тесты Django просты в реализации и могут избавить нас не от одной головной боли, поэтому я рекомендую вам внедрять их в свои проекты.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *