Avatar ·

Как запустить один конкретный тест в PHPUnit?

Всем привет! Я новичок в PHPUnit и никак не могу разобраться с запуском отдельных тестов. У меня есть большой тестовый класс UserServiceTest.php с дюжиной методов. Когда я запускаю phpunit в консоли, он прогоняет все тесты сразу. Это очень долго, особенно когда я правлю один конкретный метод и хочу быстро проверить только его.

Вот пример моего тестового класса:

<?php
use PHPUnit\Framework\TestCase;

class UserServiceTest extends TestCase
{
    public function testCreateUser(): void
    {
        // ... много кода
    }

    public function testUpdateUser(): void
    {
        // ... много кода
    }

    public function testDeleteUser(): void
    {
        // ... много кода, который я сейчас правлю
    }
}
?>

Я гуглил, но нашёл кучу разных вариантов: флаги --filter, --group, какие-то конфиги в xml. Пробовал писать phpunit --filter testDeleteUser, но он всё равно запускает все тесты или выдаёт ошибку "No tests executed". Может, я неправильно синтаксис пишу?

Подскажите, пожалуйста, как правильно запустить только один метод testDeleteUser из класса UserServiceTest, не трогая остальные? Использую PHPUnit 10 на Laravel, если это важно. Заранее спасибо!

<<>>

Самый простой и надёжный способ: фильтр по имени теста

В PHPUnit есть несколько способов запустить один конкретный тест. Самый распространённый и гибкий — использование опции --filter.

В вашем случае, чтобы запустить только testDeleteUser, команда должна выглядеть так:

phpunit --filter testDeleteUser

Если это не работает, проверьте несколько моментов:

  1. Убедитесь, что вы находитесь в корне проекта (там, где лежит phpunit.xml или phpunit.xml.dist).
  2. Укажите путь к тестовому файлу, если PHPUnit не находит тесты автоматически:
    phpunit --filter testDeleteUser tests/Unit/UserServiceTest.php
  3. Используйте полное имя метода с классом для точного совпадения:
    phpunit --filter "UserServiceTest::testDeleteUser" tests/Unit/UserServiceTest.php

Как работает --filter на самом деле?

Опция --filter принимает регулярное выражение (PCRE). Это значит, что вы можете использовать шаблоны для выбора группы тестов. Например:

  • --filter "testDelete" — запустит все тесты, в имени которых есть "testDelete" (testDeleteUser, testDeletePost и т.д.)
  • --filter "::testDeleteUser$" — точное совпадение имени метода (символ $ означает конец строки)
  • --filter "/test.*User/i" — все тесты, содержащие "User" в любом регистре

Альтернативные подходы

Если опция --filter кажется вам неудобной, есть ещё варианты:

1. Запуск всего файла

Если вам нужно запустить все тесты из одного файла:

phpunit tests/Unit/UserServiceTest.php

2. Использование групп (тегов)

Добавьте в тесты аннотацию @group и запускайте по группе:

/**
 * @group current-work
 */
public function testDeleteUser(): void
{
    // ...
}

Затем запускайте:

phpunit --group current-work

3. Временное отключение тестов

Можно использовать @doesNotPerformAssertions или закомментировать ненужные тесты, но это плохая практика для системы контроля версий.

Почему могло не работать?

Самая частая ошибка новичков — попытка запустить phpunit --filter testDeleteUser из директории, где нет конфигурационного файла PHPUnit. Без конфига PHPUnit не знает, где искать тесты. Решение — либо создать phpunit.xml, либо явно указать путь к тестовому файлу.

Ещё один момент: в Laravel тесты часто лежат в поддиректориях, и нужно указывать полный путь или настроить phpunit.xml с правильным <testsuites>.

Надеюсь, теперь у вас получится! Если остались вопросы — пишите в комментариях.

<<>>

Использование IDE для запуска одного теста

Если вы работаете в современной IDE (PhpStorm, VS Code с плагинами, NetBeans), самый удобный способ — запускать тесты прямо из редактора, не вводя команды в консоли.

В PhpStorm:

  1. Откройте тестовый файл.
  2. Напротив имени метода testDeleteUser появится зелёная стрелка (или значок "play").
  3. Нажмите на неё правой кнопкой мыши и выберите "Run 'testDeleteUser'".
  4. IDE сама сформирует команду phpunit --filter с правильными параметрами.

Этот подход автоматически подхватывает настройки из phpunit.xml и пути к файлам. Кроме того, вы можете запускать тесты в режиме отладки (debug), ставить точки остановки и смотреть значения переменных во время выполнения теста.

Для тех, кто предпочитает консоль:

Можно создать алиас в .bash_aliases или .zshrc:

alias p='phpunit --filter'

И тогда команда будет короткой:

p testDeleteUser tests/Unit/UserServiceTest.php

Лично я рекомендую освоить оба подхода: через IDE для быстрой разработки и через консоль для CI/CD и автоматизации.