Класс TestCase
Класс TestCase является базовым классом для написания тестов в Django. Он наследуется от стандартного unittest.TestCase из Python и добавляет специфические для Django возможности, такие как работа с базой данных, тестовый клиент и проверка шаблонов. Каждый тест в классе выполняется в изолированной транзакции, которая откатывается после завершения теста, что обеспечивает чистоту данных между тестами. Основные аргументы передаются через методы и атрибуты класса.
Синтаксис
from django.test import TestCase
class MyTestCase(TestCase):
@classmethod
def setUpTestData(cls):
# Создание данных для всех тестов
pass
def setUp(self):
# Подготовка перед каждым тестом
pass
def test_something(self):
# Тест
pass
Пример
Создадим простой тест для модели Article:
from 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)
Результат выполнения кода:
"All tests passed"
Пример
Используем тестовый клиент для проверки представления:
from 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')
Результат выполнения кода:
"All tests passed"
Пример
Используем методы для проверки количества запросов к базе данных:
from 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)
Результат выполнения кода:
"All tests passed"
Смотрите также
-
класс
SimpleTestCase,
который используется для тестов без базы данных -
класс
TransactionTestCase,
который используется для тестов с транзакциями -
метод
setUpTestData,
который создает данные для всех тестов -
метод
setUp,
который подготавливает данные перед каждым тестом