Метод setUpTestData

Метод setUpTestData применяется в классе TestCase для создания тестовых данных, которые будут использоваться во всех тестовых методах класса. Данные создаются один раз при инициализации класса и сохраняются в базе данных на время выполнения всех тестов. Метод должен быть объявлен как классовый метод с декоратором @classmethod.

Синтаксис

pythonfrom django.test import TestCase

class MyTestCase(TestCase):
  @classmethod
  def setUpTestData(cls):
    # Создание тестовых данных
    cls.object = MyModel.objects.create(...)

Пример

Давайте создадим тестовые данные для модели Article:

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

class ArticleTestCase(TestCase):
  @classmethod
  def setUpTestData(cls):
    cls.article1 = Article.objects.create(
      title="First article",
      status="published",
      views=100
    )
    cls.article2 = Article.objects.create(
      title="Second article",
      status="draft",
      views=50
    )
  
  def test_published_articles(self):
    published = Article.objects.filter(status="published")
    self.assertEqual(published.count(), 1)
    self.assertEqual(published.first().title, "First article")
  
  def test_article_views(self):
    self.assertEqual(self.article1.views, 100)
    self.assertEqual(self.article2.views, 50)

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

python"All tests passed successfully"

Пример

Давайте создадим тестовые данные со связями между моделями:

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

class ArticleCategoryTestCase(TestCase):
  @classmethod
  def setUpTestData(cls):
    cls.category = Category.objects.create(
      name="Technology",
      slug="tech"
    )
    cls.article = Article.objects.create(
      title="Tech article",
      status="published",
      category=cls.category,
      views=200
    )
  
  def test_article_category(self):
    self.assertEqual(self.article.category.name, "Technology")
    self.assertEqual(self.category.article_set.count(), 1)
  
  def test_category_slug(self):
    self.assertEqual(self.category.slug, "tech")

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

python"All tests passed successfully"

Пример

Давайте создадим тестовые данные с использованием bulk_create для повышения производительности:

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

class BulkArticleTestCase(TestCase):
  @classmethod
  def setUpTestData(cls):
    articles = [
      Article(title="Article 1", status="published", views=10),
      Article(title="Article 2", status="draft", views=20),
      Article(title="Article 3", status="published", views=30),
    ]
    cls.articles = Article.objects.bulk_create(articles)
  
  def test_total_articles(self):
    self.assertEqual(Article.objects.count(), 3)
  
  def test_published_count(self):
    published = Article.objects.filter(status="published")
    self.assertEqual(published.count(), 2)
  
  def test_avg_views(self):
    avg_views = Article.objects.aggregate(avg_views=Avg("views"))
    self.assertEqual(avg_views["avg_views"], 20)

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

python"All tests passed successfully"

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

  • метод setUp,
    который выполняется перед каждым тестовым методом
  • метод client,
    который предоставляет тестовый клиент для запросов
  • метод assertContains,
    который проверяет наличие контента в ответе
  • метод assertNumQueries,
    который проверяет количество выполненных запросов