PHPUnit

PHPUnit
Логотип программы PHPUnit
Тип Фреймворк модульного тестирования
Разработчик Sebastian Bergmann
Написана на PHP
Операционная система Кроссплатформенный
Языки интерфейса английский
Дата выпуска 15 марта 2004; 22 года назад (2004-03-15)[1]
Аппаратная платформа кроссплатформенность
Последняя версия 12 (7 февраля 2025; 18 месяцев назад (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

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.