Класс LiveServerTestCase
Класс LiveServerTestCase является подклассом TransactionTestCase и предназначен для тестирования,
которое требует запуска реального HTTP-сервера Django. Этот класс автоматически запускает
встроенный сервер разработки в фоновом режиме перед выполнением тестов и останавливает его
после завершения тестов. Сервер доступен по адресу 'localhost' на случайном свободном порту,
что позволяет выполнять запросы к приложению из внешних клиентов, таких как Selenium,
для проведения функционального тестирования в реальном браузере.
Синтаксис
from django.test import LiveServerTestCase
class MyLiveTests(LiveServerTestCase):
def test_example(self):
pass
Пример
Создадим простой тестовый класс, который проверяет доступность главной страницы
с использованием встроенного клиента Client через реальный сервер:
from django.test import LiveServerTestCase
from django.test import Client
from myapp.models import Article
class MyLiveTests(LiveServerTestCase):
def test_home_page(self):
client = Client()
response = client.get(self.live_server_url + '/')
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'Welcome')
Результат выполнения кода:
"Test passed successfully"
Пример
Рассмотрим более сложный пример с использованием Selenium для проверки формы создания статьи. Для этого в тестовом методе создаётся объект веб-драйвера, который взаимодействует с реальным сервером:
from django.test import LiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from myapp.models import Article
class SeleniumTests(LiveServerTestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(10)
def tearDown(self):
self.driver.quit()
def test_create_article(self):
self.driver.get(self.live_server_url + '/create/')
title_field = self.driver.find_element(By.NAME, 'title')
title_field.send_keys('Test Article')
content_field = self.driver.find_element(By.NAME, 'content')
content_field.send_keys('This is a test content')
submit_button = self.driver.find_element(By.NAME, 'submit')
submit_button.click()
success_message = self.driver.find_element(By.CLASS_NAME, 'success')
self.assertEqual(success_message.text, 'Article created successfully!')
article = Article.objects.get(title='Test Article')
self.assertIsNotNone(article)
Результат выполнения кода:
"Article created successfully!"
Пример
Пример использования атрибута live_server_url для формирования полного
URL-адреса при тестировании AJAX-запросов из JavaScript:
from django.test import LiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.by import By
from myapp.models import Category
class AjaxTests(LiveServerTestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(5)
def tearDown(self):
self.driver.quit()
def test_ajax_category_load(self):
category = Category.objects.create(name='Technology')
self.driver.get(self.live_server_url + '/categories/')
load_button = self.driver.find_element(By.ID, 'load-categories')
load_button.click()
category_element = self.driver.find_element(By.CLASS_NAME, 'category-name')
self.assertEqual(category_element.text, 'Technology')
Результат выполнения кода:
"Technology"
Смотрите также
-
класс
TestCase,
который обеспечивает изоляцию тестов с помощью транзакций -
класс
TransactionTestCase,
который предоставляет более широкие возможности управления транзакциями -
атрибут
live_server_url,
который содержит URL запущенного тестового сервера -
класс
Client,
который эмулирует запросы клиента для тестирования представлений