Как запустить один конкретный тест в 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
Если это не работает, проверьте несколько моментов:
- Убедитесь, что вы находитесь в корне проекта (там, где лежит
phpunit.xmlилиphpunit.xml.dist). - Укажите путь к тестовому файлу, если PHPUnit не находит тесты автоматически:
phpunit --filter testDeleteUser tests/Unit/UserServiceTest.php - Используйте полное имя метода с классом для точного совпадения:
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:
- Откройте тестовый файл.
- Напротив имени метода
testDeleteUserпоявится зелёная стрелка (или значок "play"). - Нажмите на неё правой кнопкой мыши и выберите "Run 'testDeleteUser'".
- IDE сама сформирует команду
phpunit --filterс правильными параметрами.
Этот подход автоматически подхватывает настройки из phpunit.xml и пути к файлам. Кроме того, вы можете запускать тесты в режиме отладки (debug), ставить точки остановки и смотреть значения переменных во время выполнения теста.
Для тех, кто предпочитает консоль:
Можно создать алиас в .bash_aliases или .zshrc:
alias p='phpunit --filter'
И тогда команда будет короткой:
p testDeleteUser tests/Unit/UserServiceTest.php
Лично я рекомендую освоить оба подхода: через IDE для быстрой разработки и через консоль для CI/CD и автоматизации.