Класс TestCase

Класс TestCase является базовым классом для написания тестов в Django. Он наследуется от стандартного unittest.TestCase из Python и добавляет специфические для Django возможности, такие как работа с базой данных, тестовый клиент и проверка шаблонов. Каждый тест в классе выполняется в изолированной транзакции, которая откатывается после завершения теста, что обеспечивает чистоту данных между тестами. Основные аргументы передаются через методы и атрибуты класса.

Синтаксис

pythonfrom django.test import TestCase

class MyTestCase(TestCase):
  @classmethod
  def setUpTestData(cls):
    # Создание данных для всех тестов
    pass

  def setUp(self):
    # Подготовка перед каждым тестом
    pass

  def test_something(self):
    # Тест
    pass

Пример

Создадим простой тест для модели Article:

pythonfrom django.test import TestCase
from myapp.models import Article

class ArticleTestCase(TestCase):
  @classmethod
  def setUpTestData(cls):
    # Создаем тестовую статью
    Article.objects.create(title="article", status="published")

  def test_article_creation(self):
    article = Article.objects.get(title="article")
    self.assertEqual(article.status, "published")

  def test_article_count(self):
    count = Article.objects.count()
    self.assertEqual(count, 1)

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

python"All tests passed"

Пример

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

pythonfrom django.test import TestCase
from django.urls import reverse
from myapp.models import Article

class ViewTestCase(TestCase):
  @classmethod
  def setUpTestData(cls):
    Article.objects.create(title="article", status="published")

  def test_article_list_view(self):
    response = self.client.get(reverse('article_list'))
    self.assertEqual(response.status_code, 200)
    self.assertContains(response, "article")
    self.assertTemplateUsed(response, 'article_list.html')

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

python"All tests passed"

Пример

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

pythonfrom django.test import TestCase
from myapp.models import Article

class QueryTestCase(TestCase):
  @classmethod
  def setUpTestData(cls):
    for i in range(10):
      Article.objects.create(title=f"article {i}", status="published")

  def test_query_count(self):
    with self.assertNumQueries(1):
      articles = Article.objects.all()
      self.assertEqual(len(articles), 10)

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

python"All tests passed"

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

  • класс SimpleTestCase,
    который используется для тестов без базы данных
  • класс TransactionTestCase,
    который используется для тестов с транзакциями
  • метод setUpTestData,
    который создает данные для всех тестов
  • метод setUp,
    который подготавливает данные перед каждым тестом