assertHTMLEqual

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

Метод принимает два обязательных аргумента: html1 и html2 - строки для сравнения, а также необязательные параметры: msg для пользовательского сообщения об ошибке и msg_prefix для префикса к стандартному сообщению. Сравнение производится на уровне DOM-дерева, что позволяет учитывать структуру документа, а не только текстовое представление.

Синтаксис

pythonself.assertHTMLEqual(html1, html2, msg=None, msg_prefix='')

Пример

Давайте сравним две HTML-строки с одинаковой структурой, но разным форматированием:

pythonfrom django.test import TestCase

class HTMLTest(TestCase):
  def test_simple_html(self):
    html1 = '<div class="container"><h1>Title</h1><p>Content</p></div>'
    html2 = '''
      <div class="container">
        <h1>Title</h1>
        <p>Content</p>
      </div>
    '''
    self.assertHTMLEqual(html1, html2)

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

python"Test passed - HTML strings are equivalent"

Пример

Давайте сравним HTML-строки с одинаковым содержимым, но разным порядком атрибутов:

pythonfrom django.test import TestCase

class HTMLAttributeTest(TestCase):
  def test_attribute_order(self):
    html1 = '<a href="/home/" class="link">Home</a>'
    html2 = '<a class="link" href="/home/">Home</a>'
    self.assertHTMLEqual(html1, html2)

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

python"Test passed - HTML strings are equivalent"

Пример

Давайте проверим неэквивалентные HTML-строки с разной структурой:

pythonfrom django.test import TestCase

class HTMLFailTest(TestCase):
  def test_different_structure(self):
    html1 = '<div><span>Text</span></div>'
    html2 = '<div><p>Text</p></div>'
    self.assertHTMLEqual(html1, html2)

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

python"AssertionError: <span>Text</span> != <p>Text</p>"

Пример

Давайте используем метод для проверки HTML-ответа представления:

pythonfrom django.test import TestCase
from django.urls import reverse

class ViewHTMLTest(TestCase):
  def test_view_response(self):
    response = self.client.get(reverse('home'))
    expected_html = '''
      <!DOCTYPE html>
      <html>
        <head><title>Home</title></head>
        <body>
          <h1>Welcome</h1>
          <p>This is the home page</p>
        </body>
      </html>
    '''
    self.assertHTMLEqual(response.content.decode(), expected_html)

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

python"Test passed - HTML response matches expected structure"

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

  • метод assertInHTML,
    который проверяет наличие фрагмента HTML в другом HTML-коде
  • метод assertContains,
    который проверяет наличие текста в ответе представления
  • метод assertJSONEqual,
    который сравнивает JSON-строки на эквивалентность
  • класс TestCase,
    который предоставляет набор методов для тестирования Django-приложений