Что еще мы можем проверить? Как насчет имени URL для каждой страницы?
Добавим в blog/urls.py имя home для пути к главной странице и about для страницы about.
from django.urls import path
from blog import views
urlpatterns = [
path("", views.index, name="home"),
path("about/", views.about, name="about"),
]
Мы можем использовать очень удобную утилитарную функцию Django reverse для проверки обоих вариантов.
Обязательно импортируйте reverse в верхней части файла и добавьте новый модульный тест для каждой страницы.
blog/tests.py:
from django.test import SimpleTestCase
from django.urls import reverse # new
class HomepageTests(SimpleTestCase):
def test_url_exists_at_correct_location(self):
response = self.client.get("/")
self.assertEqual(response.status_code, 200)
def test_url_available_by_name(self): # new
response = self.client.get(reverse("home"))
self.assertEqual(response.status_code, 200)
class AboutpageTests(SimpleTestCase):
def test_url_exists_at_correct_location(self):
response = self.client.get("/about/")
self.assertEqual(response.status_code, 200)
def test_url_available_by_name(self): # new
response = self.client.get(reverse("about"))
self.assertEqual(response.status_code, 200)
Запустите тесты снова, и убедимся что они работают правильно:
До сих пор мы проверяли расположение URL и имена URL, но не проверяли наши шаблоны.
Давайте убедимся, что правильные шаблоны - index.html и about.html используются на каждой странице и что они отображают ожидаемое содержимое Index и О нас соответственно.
Для этого мы можем использовать assertTemplateUsed и assertContains.
blog/tests.py:
from django.test import SimpleTestCase
from django.urls import reverse
class HomepageTests(SimpleTestCase):
def test_url_exists_at_correct_location(self):
response = self.client.get("/")
self.assertEqual(response.status_code, 200)
def test_url_available_by_name(self):
response = self.client.get(reverse("home"))
self.assertEqual(response.status_code, 200)
def test_template_name_correct(self): # new
response = self.client.get(reverse("home"))
self.assertTemplateUsed(response, "blog/index.html")
def test_template_content(self): # new
response = self.client.get(reverse("home"))
self.assertContains(response, "Index")
class AboutpageTests(SimpleTestCase):
def test_url_exists_at_correct_location(self):
response = self.client.get("/about/")
self.assertEqual(response.status_code, 200)
def test_url_available_by_name(self):
response = self.client.get(reverse("about"))
self.assertEqual(response.status_code, 200)
def test_template_name_correct(self): # new
response = self.client.get(reverse("about"))
self.assertTemplateUsed(response, "blog/about.html")
def test_template_content(self): # new
response = self.client.get(reverse("about"))
self.assertContains(response, "О нас")
Запустите тесты в последний раз, чтобы проверить нашу новую работу. Все тесты должны пройти:
Опытные программисты могут посмотреть на наш код тестирования и заметить, что в нем много повторений:
Например, мы устанавливаем ответ каждый раз для всех восьми тестов. В целом, это хорошая идея - придерживаться концепции DRY(Don't Repeat Yourself) программирования, но модульные тесты работают лучше всего, когда они самодостаточны и чрезвычайно многословны.
По мере расширения тестов по соображениям производительности может оказаться более целесообразным объединить несколько утверждений в меньшее количество тестов, но это уже более сложная и часто субъективная тема, выходящая за рамки данного курса. Мы лишь рассматриваем основные тесты.
В будущем вы еще много раз затронете тестирование, особенно когда начнете работать с базами данных. Пока же нужно понять, насколько просто и важно добавлять тесты каждый раз, когда мы добавляем новую функциональность в наш проект Django.
Если у вас возникли трудности, вы можете клонировать проект с гитхаба - https://github.com/Permin0ff/Cource_FirstProject_2