Класс Client
Класс Client применяется в тестах Django для имитации
GET и POST запросов к приложению. Он позволяет проверять
ответы сервера, содержимое страниц и состояние сессии
без запуска реального веб-сервера. Клиент автоматически
обрабатывает куки и редиректы, что делает тестирование
максимально приближенным к реальной работе браузера.
Синтаксис
from django.test import Client
# Создание экземпляра клиента
client = Client()
# Выполнение GET запроса
response = client.get('/path/', {'param': 'value'})
# Выполнение POST запроса
response = client.post('/path/', {'data': 'value'})
Пример
Создадим тестовый метод, который проверяет доступность главной страницы сайта:
from django.test import TestCase, Client
class HomePageTest(TestCase):
def setUp(self):
self.client = Client()
def test_home_page_status(self):
response = self.client.get('/')
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'home.html')
Результат выполнения кода:
"Тест успешно пройден"
Пример
Выполним POST запрос для создания новой статьи через форму с проверкой редиректа:
from django.test import TestCase, Client
from django.urls import reverse
class ArticleCreateTest(TestCase):
def setUp(self):
self.client = Client()
def test_article_creation(self):
article_data = {
'title': 'New Article',
'content': 'Content of new article',
}
response = self.client.post(
reverse('article_create'),
article_data
)
self.assertRedirects(response, '/articles/')
self.assertEqual(response.status_code, 302)
Результат выполнения кода:
"Redirect successful to /articles/"
Пример
Проверим работу аутентификации с помощью методов
login и logout:
from django.test import TestCase, Client
from django.contrib.auth.models import User
class LoginTest(TestCase):
def setUp(self):
self.client = Client()
self.user = User.objects.create_user(
username='testuser',
password='testpass'
)
def test_user_login(self):
login_success = self.client.login(
username='testuser',
password='testpass'
)
self.assertTrue(login_success)
response = self.client.get('/profile/')
self.assertEqual(response.status_code, 200)
self.client.logout()
response = self.client.get('/profile/')
self.assertEqual(response.status_code, 302)
Результат выполнения кода:
"User logged in, profile accessed, logged out"
Пример
Использование метода force_login для быстрой
аутентификации в тестах без проверки пароля:
from django.test import TestCase, Client
from django.contrib.auth.models import User
class AdminTest(TestCase):
def setUp(self):
self.client = Client()
self.admin_user = User.objects.create_superuser(
username='admin',
password='adminpass'
)
def test_admin_access(self):
self.client.force_login(self.admin_user)
response = self.client.get('/admin/')
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'Administration')
Результат выполнения кода:
"Admin page accessed successfully"
Смотрите также
-
класс
TestCase,
который предоставляет тестовую среду с поддержкой базы данных -
метод
get,
который выполняет GET запрос через клиент -
метод
post,
который выполняет POST запрос через клиент -
метод
force_login,
который выполняет принудительную аутентификацию пользователя