Класс LiveServerTestCase

Класс LiveServerTestCase является подклассом TransactionTestCase и предназначен для тестирования, которое требует запуска реального HTTP-сервера Django. Этот класс автоматически запускает встроенный сервер разработки в фоновом режиме перед выполнением тестов и останавливает его после завершения тестов. Сервер доступен по адресу 'localhost' на случайном свободном порту, что позволяет выполнять запросы к приложению из внешних клиентов, таких как Selenium, для проведения функционального тестирования в реальном браузере.

Синтаксис

pythonfrom django.test import LiveServerTestCase

class MyLiveTests(LiveServerTestCase):
  def test_example(self):
    pass

Пример

Создадим простой тестовый класс, который проверяет доступность главной страницы с использованием встроенного клиента Client через реальный сервер:

pythonfrom 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')

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

python"Test passed successfully"

Пример

Рассмотрим более сложный пример с использованием Selenium для проверки формы создания статьи. Для этого в тестовом методе создаётся объект веб-драйвера, который взаимодействует с реальным сервером:

pythonfrom 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)

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

python"Article created successfully!"

Пример

Пример использования атрибута live_server_url для формирования полного URL-адреса при тестировании AJAX-запросов из JavaScript:

pythonfrom 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')

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

python"Technology"

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

  • класс TestCase,
    который обеспечивает изоляцию тестов с помощью транзакций
  • класс TransactionTestCase,
    который предоставляет более широкие возможности управления транзакциями
  • атрибут live_server_url,
    который содержит URL запущенного тестового сервера
  • класс Client,
    который эмулирует запросы клиента для тестирования представлений