PHPUnit

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
PHPUnit
Логотип программы PHPUnit
Тип Фреймворк модульного тестирования
Разработчик Sebastian Bergmann
Написана на PHP
Операционная система Кроссплатформенный
Языки интерфейса английский
Первый выпуск 15 марта 2004; 21 год назад (2004-03-15)[1]
Аппаратная платформа кроссплатформенность
Последняя версия 12 (7 февраля 2025; 6 месяцев назад (2025-02-07)[2])
Репозиторий github.com/sebastianberg…
Лицензия BSD 3 Clause
Сайт phpunit.de

PHPUnit — это фреймворк модульного тестирования для языка программирования PHP. Он является реализацией архитектуры xUnit для фреймворков модульного тестирования, которая зародилась с SUnit[англ.] и стала популярной благодаря JUnit. PHPUnit был создан Себастьяном Бергманном (Sebastian Bergmann), репозиторий размещён на GitHub.

Назначение

[править | править код]

PHPUnit основан на идее о том, что разработчики должны иметь возможность быстро находить ошибки в своём новом коде и убеждаться, что в других частях кодовой базы не произошло регрессии. Как и другие фреймворки модульного тестирования, PHPUnit использует утверждения (assertions), чтобы проверить, что поведение конкретного тестируемого компонента — или «модуля» — соответствует ожидаемому.

Преимущества

[править | править код]

Цель модульного тестирования — изолировать каждую часть программы и показать, что отдельные части работают корректно. Модульный тест предоставляет строгий контракт, которому должен соответствовать фрагмент кода. В результате использование модульных тестов помогает находить проблемы на раннем этапе цикла разработки.

PHPUnit может выводить результаты тестов в нескольких различных форматах, включая JUnit XML и TestDox[англ.].

Уязвимости

[править | править код]

В конце 2017 года была обнаружена уязвимость CVE-2017-9841, позволявшая злоумышленникам выполнять удалённый код через PHPUnit. Отправляя на веб-сервер файл, являющийся частью PHPUnit, злоумышленник мог исполнить PHP-код этого файла на этом веб-сервере. Уязвимость была устранена разработчиком в релизах 7.5.20 и 8.5.2 от 8 января 2020 года[3].

Процесс тестирования

[править | править код]

Пример кода

[править | править код]
<?php

use PHPUnit\Framework\TestCase;

class ExampleTest extends TestCase
{
    public function test_emptyStack(): void
    {
        $empty_stack = array();
        $this->assertEquals(0, count($empty_stack));
        $this->assertCount(0, $empty_stack);
    }

    public function test_PushAndPop()
    {
        $stack = array('foo');
        $this->assertEquals(1, count($stack));

        array_push($stack, 'bar');
        $this->assertEquals('bar', $stack[count($stack)-1]);
        $this->assertEquals(2, count($stack));
        $this->assertCount(2, $stack);

        $popped = array_pop($stack);
        $this->assertEquals('bar', $popped);
        $this->assertEquals(1, count($stack));
        $this->assertCount(1, $stack);
    }
}

Запуск тестов

[править | править код]

Исполнение вышеприведённого кода запускает 2 теста, производящих суммарно 9 сравнений (ассертов) — 2 сравнения в первом тесте и 7 во втором. При этом некоторые из этих сравнений семантически идентичны — оба сравнения в тесте test_emptyStack проверяют одно и то же (количество элементов в массиве), но синтаксис второго доступен лишь с PHPUnit версии 3.6.0 и выше.

По окончании работы в консоль (по-умолчанию) будет выведено примерно следующее сообщение:

PHPUnit 12.3.0 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.3.23
Configuration: /home/runner/work/exampleproject/phpunit.xml

..                                 2 / 2 (100%)

Time: 00:00.042, Memory: 20.00 MB

OK (2 tests, 9 assertions)

Условные обозначения[4]

[править | править код]
Символ Результат выполнения
. Тест успешно выполнен
F Тест завершился с ошибкой – встретилось неверное утверждение (assertion)
E Ошибка выполнения кода во время выполнения теста (например, у объекта вызван несуществующий метод)
W Тест пройден, но вызвал предупреждение (warning)
R Тест помечен как рискованный (например, в тесте не было проверено ни одного утверждения)
D Тест вызвал устаревшую функциональность (deprecation)
N Тест вызвал уведомление (notice)
I Тест помечен как неполный
S Тест был пропущен

Если во время выполнения тестов любой из них завершается с результатом F или E, PHPUnit считает тестирование проваленным. Все остальные результаты считаются успешными, а их статусы – информативными.

Примечания

[править | править код]
  1. Sebastian Bergmann blog. sebastian-bergmann.de. Дата обращения: 27 августа 2025. Архивировано 5 марта 2016 года.
  2. Release Announcement for Version 12 of PHPUnit (англ.). phpunit.de. Дата обращения: 27 августа 2025.
  3. Sebastian, Bergmann. PHPUnit: A Security Risk? The PHP Consulting Company. Дата обращения: 20 октября 2020.
  4. 3. The Command-Line Test Runner — PHPUnit 12.3 Manual. docs.phpunit.de. Дата обращения: 27 августа 2025.

Внешние ссылки

[править | править код]
  • phpunit.de — официальный сайт PHPUnit