0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Практика на Хекслете проверяется автоматическими тестами, к которым вы уже немного привыкли, если смогли добраться до текущего урока. Для тестирования PHP-кода мы используем фреймворк PHPUnit, который, хоть и не единственный, но до сих пор - самый популярный. Имея некоторое представление об ООП, мы можем поговорить о его устройстве.</p>
1
<p>Практика на Хекслете проверяется автоматическими тестами, к которым вы уже немного привыкли, если смогли добраться до текущего урока. Для тестирования PHP-кода мы используем фреймворк PHPUnit, который, хоть и не единственный, но до сих пор - самый популярный. Имея некоторое представление об ООП, мы можем поговорить о его устройстве.</p>
2
<p>Не имеет значения предмет тестирования; любой тест PHPUnit всегда описывается в классе с именем Что-тоTest внутри директории tests. Если тестируется какой-то конкретный класс с именем Foo, то по соглашению его тесты располагаются в классе FooTest. Точно такое же правило с пространством имён без классов. Как правило, структура директорий внутри tests совпадает со структурой исходных файлов - так проще ориентироваться, и некоторые редакторы позволяют автоматически переключаться между тестом и исходным файлом при такой структуре и именовании.</p>
2
<p>Не имеет значения предмет тестирования; любой тест PHPUnit всегда описывается в классе с именем Что-тоTest внутри директории tests. Если тестируется какой-то конкретный класс с именем Foo, то по соглашению его тесты располагаются в классе FooTest. Точно такое же правило с пространством имён без классов. Как правило, структура директорий внутри tests совпадает со структурой исходных файлов - так проще ориентироваться, и некоторые редакторы позволяют автоматически переключаться между тестом и исходным файлом при такой структуре и именовании.</p>
3
<p>Каждый тестовый класс состоит из тестовых методов. Тестовые методы всегда начинаются с префикса test, например, testAverage - только тогда PHPUnit понимает, что это тестовый метод и выполняет его автоматически при прогоне тестов. Тестовые методы пишутся программистом. Нет никаких правил в том, сколько их должно быть и какова должна быть их структура. Если необходимо написать десять разных тестов на одну функцию, то так и нужно делать.</p>
3
<p>Каждый тестовый класс состоит из тестовых методов. Тестовые методы всегда начинаются с префикса test, например, testAverage - только тогда PHPUnit понимает, что это тестовый метод и выполняет его автоматически при прогоне тестов. Тестовые методы пишутся программистом. Нет никаких правил в том, сколько их должно быть и какова должна быть их структура. Если необходимо написать десять разных тестов на одну функцию, то так и нужно делать.</p>
4
<p>Главная задача любого тестового метода - выполнить ту проверку, ради которой задумывался соответствующий тест. В примере выше тестируется функция average, находящая среднее арифметическое всех переданных в эту функцию чисел. Average - чистая функция, а значит, её легко тестировать. Достаточно передать в функцию несколько чисел и проверить возвращаемое значение.</p>
4
<p>Главная задача любого тестового метода - выполнить ту проверку, ради которой задумывался соответствующий тест. В примере выше тестируется функция average, находящая среднее арифметическое всех переданных в эту функцию чисел. Average - чистая функция, а значит, её легко тестировать. Достаточно передать в функцию несколько чисел и проверить возвращаемое значение.</p>
5
<p>Проверки в PHPUnit выполняются с помощью специальных функций - утверждений. Этих функций довольно<a>много</a>, но среди них есть несколько наиболее используемых. Метод assertEquals принимает на вход два значения:</p>
5
<p>Проверки в PHPUnit выполняются с помощью специальных функций - утверждений. Этих функций довольно<a>много</a>, но среди них есть несколько наиболее используемых. Метод assertEquals принимает на вход два значения:</p>
6
<ol><li>Expected. Ожидаемый результат - то, что должна вернуть функция.</li>
6
<ol><li>Expected. Ожидаемый результат - то, что должна вернуть функция.</li>
7
<li>Actual. Результат, который на самом деле вернула функция.</li>
7
<li>Actual. Результат, который на самом деле вернула функция.</li>
8
</ol><p>Порядок важен. На его основе PHPUnit формирует вывод, в котором указывает, что ожидалось, а что пришло на самом деле.</p>
8
</ol><p>Порядок важен. На его основе PHPUnit формирует вывод, в котором указывает, что ожидалось, а что пришло на самом деле.</p>
9
<p>Другое популярное утверждение assertTrue (и assertFalse). Оно принимает только один аргумент и отлично подходит для тестирования предикатов.</p>
9
<p>Другое популярное утверждение assertTrue (и assertFalse). Оно принимает только один аргумент и отлично подходит для тестирования предикатов.</p>
10
<h2>Анализ дизайна</h2>
10
<h2>Анализ дизайна</h2>
11
<p>Дизайн тестов на основе классов теряет свою популярность, а во многих языках уже давно не используется. Современный подход растёт из<a>BDD</a>процесса. Синтаксически такие тесты часто полагаются на функции высшего порядка describe и it.</p>
11
<p>Дизайн тестов на основе классов теряет свою популярность, а во многих языках уже давно не используется. Современный подход растёт из<a>BDD</a>процесса. Синтаксически такие тесты часто полагаются на функции высшего порядка describe и it.</p>
12
<p>Замечу, что в PHP такой стиль выглядит немного тяжёлым из-за обилия синтаксических конструкций.</p>
12
<p>Замечу, что в PHP такой стиль выглядит немного тяжёлым из-за обилия синтаксических конструкций.</p>