Метод setUp

Метод setUp применяется в классах, наследуемых от TestCase, и выполняется автоматически перед каждым тестовым методом. Он предназначен для создания начальных данных, инициализации объектов и настройки состояния, необходимого для выполнения тестов. Метод не принимает аргументов и не возвращает значения.

Синтаксис

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

class ArticleTestCase(TestCase):
  def setUp(self):
    # Создание тестовых данных
    Article.objects.create(title="article 1", status="published")
    Article.objects.create(title="article 2", status="draft")

Пример

Давайте создадим тестовый набор для проверки методов модели Article. В методе setUp мы создадим несколько записей, которые будут использоваться в каждом тесте:

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

class ArticleModelTest(TestCase):
  def setUp(self):
    # Создаем тестовые статьи
    self.article1 = Article.objects.create(
      title="article 1",
      status="published",
      created_at=date(2025, 1, 10)
    )
    self.article2 = Article.objects.create(
      title="article 2",
      status="draft",
      created_at=date(2025, 1, 15)
    )
    self.article3 = Article.objects.create(
      title="article 3",
      status="published",
      created_at=date(2025, 1, 20)
    )
  
  def test_published_articles_count(self):
    # Проверяем количество опубликованных статей
    published_count = Article.objects.filter(status="published").count()
    self.assertEqual(published_count, 2)
  
  def test_article_creation_date(self):
    # Проверяем дату создания статьи
    self.assertEqual(self.article1.created_at, date(2025, 1, 10))

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

python"Running 2 tests in ArticleModelTest"
"test_published_articles_count - OK"
"test_article_creation_date - OK"

Пример

Рассмотрим пример использования setUp для подготовки данных с использованием связанных моделей. Создадим категорию и несколько статей, чтобы проверить методы работы с внешними ключами:

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

class ArticleCategoryTest(TestCase):
  def setUp(self):
    # Создаем категорию
    self.category = Category.objects.create(
      name="Technology",
      description="Articles about technology"
    )
    
    # Создаем статьи для категории
    self.article1 = Article.objects.create(
      title="article 1",
      status="published",
      category=self.category
    )
    self.article2 = Article.objects.create(
      title="article 2",
      status="published",
      category=self.category
    )
  
  def test_category_articles(self):
    # Проверяем связь категории со статьями
    articles = self.category.article_set.all()
    self.assertEqual(articles.count(), 2)
    self.assertEqual(articles[0].title, "article 1")
  
  def test_article_category(self):
    # Проверяем связь статьи с категорией
    self.assertEqual(self.article1.category.name, "Technology")

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

python"Running 2 tests in ArticleCategoryTest"
"test_category_articles - OK"
"test_article_category - OK"

Пример

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

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

class ArticleBulkTest(TestCase):
  def setUp(self):
    # Создаем множество тестовых статей с разными статусами
    self.test_articles = []
    for i in range(1, 6):
      status = "published" if i % 2 == 0 else "draft"
      article = Article.objects.create(
        title=f"article {i}",
        status=status,
        views=i * 10
      )
      self.test_articles.append(article)
  
  def test_published_articles(self):
    # Проверяем, что количество опубликованных статей верное
    published = Article.objects.filter(status="published")
    self.assertEqual(published.count(), 2)
  
  def test_total_views(self):
    # Проверяем общее количество просмотров
    total_views = sum(article.views for article in self.test_articles)
    self.assertEqual(total_views, 150)  # 10 + 20 + 30 + 40 + 50

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

python"Running 2 tests in ArticleBulkTest"
"test_published_articles - OK"
"test_total_views - OK"

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

  • метод setUpTestData,
    который создает данные один раз для всего класса тестов
  • атрибут client,
    который предоставляет клиент для имитации запросов
  • метод assertContains,
    который проверяет наличие содержимого в ответе
  • метод assertRedirects,
    который проверяет перенаправление в ответе