Класс Client

Класс Client применяется в тестах Django для имитации GET и POST запросов к приложению. Он позволяет проверять ответы сервера, содержимое страниц и состояние сессии без запуска реального веб-сервера. Клиент автоматически обрабатывает куки и редиректы, что делает тестирование максимально приближенным к реальной работе браузера.

Синтаксис

pythonfrom django.test import Client

# Создание экземпляра клиента
client = Client()

# Выполнение GET запроса
response = client.get('/path/', {'param': 'value'})

# Выполнение POST запроса
response = client.post('/path/', {'data': 'value'})

Пример

Создадим тестовый метод, который проверяет доступность главной страницы сайта:

pythonfrom 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')

Результат выполнения кода:

python"Тест успешно пройден"

Пример

Выполним POST запрос для создания новой статьи через форму с проверкой редиректа:

pythonfrom 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)

Результат выполнения кода:

python"Redirect successful to /articles/"

Пример

Проверим работу аутентификации с помощью методов login и logout:

pythonfrom 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)

Результат выполнения кода:

python"User logged in, profile accessed, logged out"

Пример

Использование метода force_login для быстрой аутентификации в тестах без проверки пароля:

pythonfrom 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')

Результат выполнения кода:

python"Admin page accessed successfully"

Смотрите также

  • класс TestCase,
    который предоставляет тестовую среду с поддержкой базы данных
  • метод get,
    который выполняет GET запрос через клиент
  • метод post,
    который выполняет POST запрос через клиент
  • метод force_login,
    который выполняет принудительную аутентификацию пользователя