Какво ще изградим
Ако някога сте опитвали да сравнявате HTML фрагменти в модулните си тестове и сте били разочаровани от противоречиви резултати, този урок е за вас. Ще използваме функцията assertEqualHTML() за опростяване на тестването на HTML тагове в WordPress. Това е насочено към WordPress разработчици, които искат да гарантират валидността и последователността на своя HTML изход, особено тези, които работят върху сложни плъгини или теми.
Ще научите как да използвате този метод за писане на надеждни модулни тестове и да избягвате грешки при рендиране на HTML. Това ще бъде особено полезно за тези, които работят върху сайтове, изискващи стриктна проверка за съвместимост, като например сайтове с Divi 5 интеграции.
Стъпка 1: Инициализирайте тестовата среда
Първата стъпка е да конфигурирате тестовата среда. Уверете се, че сте инсталирали PHPUnit на вашата система. Ето един основен пример за конфигурация, за да започнете с PHPUnit в WordPress.
{
"require-dev": {
"phpunit/phpunit": "^9.5"
}
}
Уверете се, че файлът ви phpunit.xml.dist е правилно конфигуриран. Ето един минимален пример:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="tests/bootstrap.php" >
<testsuites>
<testsuite name="Plugin Test Suite">
<directory suffix=".php">tests</directory>
</testsuite>
</testsuites>
</phpunit>
Проверете дали PHPUnit е правилно инсталиран, като изпълните phpunit --version във вашия терминал. Трябва да видите текущата версия на PHPUnit.
Стъпка 2: Напишете основен тест, използвайки assertEqualHTML()
След като средата е готова, нека преминем към писането на основен тест за сравняване на два HTML фрагмента. Създайте тестов файл във вашата директория tests, например test-html.php.
<?php
use PHPUnitFrameworkTestCase;
class HtmlTest extends TestCase {
public function testHtmlEquality() {
$expected = '<div><p>Hello, World!</p></div>';
$actual = '<div> <p>Hello, World!</p> </div>';
$this->assertEquals(
trim(preg_replace('/s+/', '', $expected)),
trim(preg_replace('/s+/', '', $actual))
);
}
}
Очакваният резултат е тестът да премине успешно, потвърждавайки, че двата HTML фрагмента са еквивалентни въпреки разликите в разстоянието между тях.
Вариант: Тестване с HTML атрибути
Често срещан проблем, с който се сблъсквам, е свързан с HTML атрибутите в различен ред. Ето как можете да адаптирате теста:
<?php
public function testHtmlAttributes() {
$expected = '<input type="text" name="username" />';
$actual = '<input name="username" type="text" />';
$this->assertEqualHTML($expected, $actual);
}
Чрез нормализиране на пространствата и реда на атрибутите, вие гарантирате, че тестът ще премине успешно, дори ако редът не е идентичен.
Стъпка 3: Използване на assertEqualHTML() на практика
За да направим тестовете по-надеждни, нека сега използваме метод, по-специфичен за WordPress, за да проверим равенството на HTML кода. Принципът е да се нормализира HTML кодът преди сравнение.
<?php
class HtmlTest extends TestCase {
public function assertEqualHTML($expected, $actual) {
$normalize = function($html) {
return trim(preg_replace('/>s*</', '><', $html));
};
$this->assertEquals($normalize($expected), $normalize($actual));
}
public function testHtmlEqualityWithCustomAssert() {
$expected = '<div><p>Hello, World!</p></div>';
$actual = '<div> <p>Hello, World!</p> </div>';
$this->assertEqualHTML($expected, $actual);
}
}
Като бягам отново phpunitТрябва да видите, че тестът преминава успешно, което показва, че двата HTML фрагмента се третират като равни.
Edge Case: Самозатварящи се маяци
Самозатварящите се етикети могат да причинят проблеми, ако не са еднакви. Например:
<?php
public function testSelfClosingTags() {
$expected = '<br/>';
$actual = '<br>';
$this->assertEqualHTML($expected, $actual);
}
Този тест ще покаже как се обработват самозатварящите се тагове, за да се осигури съвместимост с различни версии на HTML.
Пълният резултат
Ето пълния код за нашия тест, използващ метода assertEqualHTML() :
<?php
use PHPUnitFrameworkTestCase;
class HtmlTest extends TestCase {
public function assertEqualHTML($expected, $actual) {
$normalize = function($html) {
return trim(preg_replace('/>s*</', '><', $html));
};
$this->assertEquals($normalize($expected), $normalize($actual));
}
public function testHtmlEquality() {
$expected = '<div><p>Hello, World!</p></div>';
$actual = '<div> <p>Hello, World!</p> </div>';
$this->assertEqualHTML($expected, $actual);
}
}
За да персонализирате, просто променете HTML фрагментите, които ще бъдат сравнявани. Можете да разширите този метод до по-сложни случаи на употреба, като например валидиране на рендирането на персонализирани блокове в Gutenberg.
Адаптер за Divi 5
Ако работите с Divi 5, където HTML често се генерира динамично, този подход е особено полезен. Можете да създавате тестове за вашите персонализирани модули, като гарантирате, че HTML изходът остава последователен дори след актуализации на Divi.
Divi 5 въвежда специфични куки, като например et_builder_module_renderс които можете да тествате assertEqualHTML() за да проверите HTML кода, изобразен от тези куки.
Ако това не проработи
- Синтаксична грешка: Проверете дали вашият PHP е правилно форматиран. Синтактичните грешки са често срещани и лесно се допускат.
- PHPUnit не е намерен: Уверете се, че PHPUnit е правилно инсталиран и достъпен от вашия терминал.
- HTML не е равно на: Проверете отново HTML фрагментите си за фини разлики, като например интервали или нови редове.
- Неправилна конфигурация на PHPUnit: Проверете файла си
phpunit.xml.distза да се уверите, че пътищата са правилни.
Често срещани капани
Често срещан недостатък е да се предположи, че интервалите са маловажни в HTML. Въпреки това, в определени контексти, като например тагове <pre>Интервалите са важни. Уверете се, че вземате предвид контекста на използването на HTML кода, когато го нормализирате.
За да се отиде по-далеч
Можете да разширите този метод, за да тествате по-сложни рендери, като цели страници или JavaScript компоненти с имаИнтегрирайте този подход с автоматизирани инструменти за изграждане за непрекъснато тестване.
ресурси
- Разработка на плъгини за WordPress
- Разработка на WordPress теми
- WordPress Trac
- WordPress в GitHub
- Документация на PHPUnit
Често задавани въпроси
Защо да използвам assertEqualHTML() ? Това позволява надеждно сравняване на HTML фрагменти, без да се притеснявате за разлики в разстоянието или форматирането.
Какви са предварителните изисквания за следване на този урок? Трябва да имате основни познания за PHP и WordPress средата, както и за PHPUnit.
Съвместим ли е с всички теми на WordPress? Да, стига генерираният HTML код да може да бъде заснет и тестван. Това работи особено добре с модулни теми като Divi.