Как запустить один метод тестирования с phpunit?

335

Я изо всех сил пытаюсь запустить один метод испытаний, названный testSaveAndDropв файле escalation/EscalationGroupTest.phpс phpunit. Я пробовал следующие комбинации:

phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=escalation/EscalationGroupTest.php::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=EscalationGroupTest.php::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=EscalationGroupTest::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=testSaveAndDrop

В каждом случае все тестовые методы в файле escalation/EscalationGroupTest.phpвыполняются. Как выбрать только один метод вместо?

Название класса EscalationGroupTestи версия phpunit3.2.8.

Alex
источник
Как называется класс вашего тестового класса?
sectus

Ответы:

459

Следующая команда запускает тест для одного метода:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

phpunit --filter methodName ClassName path/to/file.php

Для более новых версий phpunit это просто:

phpunit --filter methodName path/to/file.php
Alex
источник
1
Требуется ли запись EscalationGroupTest? Какая польза от этого?
Муджаффарс
2
Хорошо, я понял, что это имя класса
моджахеды
15
Он также запустит тестовый метод с именем testSaveAndDrop * (пример: testSaveAndDropSomething). Чтобы точно запустить testSaveAndDrop, используйте --filter '/ :: testSaveAndDrop $ /'
Фарид Мовсумов
1
@mujaffars Я сомневаюсь, что «я получил» не является допустимым идентификатором в php из-за пробелов.
Джон МакКлюнг
2
Это не работает сейчас. Просто phpunit --filter methodName path/to/testing/fileнет ClassName .
CJ Деннис
213

Я предпочитаю отмечать тест в аннотации как

/**
 * @group failing
 * Tests the api edit form
 */
public function testEditAction()

Затем запустить его с

phpunit --group failing

Не нужно указывать полный путь в командной строке, но вы должны помнить об удалении этого перед фиксацией, чтобы не загромождать код.

Вы также можете указать несколько групп для одного теста

/**
  * @group failing
  * @group bug2204 
  */
public function testSomethingElse()
{
}
iamtankist
источник
4
Мне нравится этот метод, можно ли назначить несколько групп с помощью аннотации? @group failing, Integration
Диззи Брайан Хай
4
Ну конечно; естественно. Но не через запятую. Отредактировал ответ, чтобы проиллюстрировать это.
iamtankist
Мне больше нравится этот метод ... для ссылки элемент <groups> в phpunit.xml также может быть использован для фильтрации тестов ... используйте что-то вроде этого прямо под <phpunit>: <groups> <include> <group> failing </ group > </ include> </ groups>
Николас Галлер
2
Но вопрос был - запустить ЕДИНЫЙ тест. Кроме того, группа с именем failing - это худшее, что вы можете использовать. Потому что после неудачного завершения некоторых тестов вы можете запустить phpunit --group, не выполнив неудачные тесты, не предоставив им группу. Это сбивает с толку.
Рафал Мних
Лучший ответ! В случае, если он @dependsот другого, нет НИКАКОГО теста, поэтому вам нужно точно определить все взаимосвязанные тесты и, таким образом, использовать @groupаннотацию.
центуриан
117

Вот более общий ответ:

Если вы уверены, что имя метода уникально, вы можете фильтровать только по имени метода (это работает для меня)

phpunit --filter {TestMethodName}

Однако безопаснее указать путь к файлу / ссылку

phpunit --filter {TestMethodName} {FilePath}

Пример:

phpunit --filter testSaveAndDrop reference/to/escalation/EscalationGroupTest.php

Краткое замечание: я заметил, что если у меня есть функция с именем, testSaveи другая функция, названная testSaveAndDropс помощью команды phpunit --filter testSave, также будет запускаться testSaveAndDropи любая другая функция, которая начинается с testSave*, это странно!

Махмуд Зальт
источник
4
Это совсем не странно, это в основном совпадение подстроки. Если вы хотите такое поведение, используйте маркер конца строки:/testSave$/
Кристиан
Что если вы хотите указать только путь к файлу, чтобы все тесты в этом файле запускались?
still_dreaming_1
48

Следующая команда выполнит именно testSaveAndDrop тест.

phpunit --filter '/::testSaveAndDrop$/' escalation/EscalationGroupTest.php
Фарид Мовсумов
источник
4
Не работал для меня. Используя \bвместо того , чтобы, $наконец , сделал трюк: --filter '/::testSaveAndDrop\b/'.
Джо
1
Оба окончания имени метода '/::testSaveAndDrop\b/'и '/::testSaveAndDrop$/'работали для меня, как это phpunit --filter ClassName::methodName$и phpunit --filter ClassName::methodName\b(на Linux)
Валентина Ши
22

для запуска теста phpunit в laravel многими способами ..

vendor/bin/phpunit --filter methodName className pathTofile.php

vendor/bin/phpunit --filter 'namespace\\directoryName\\className::methodName'

для теста одного класса:

vendor/bin/phpunit --filter  tests/Feature/UserTest.php
vendor/bin/phpunit --filter 'Tests\\Feature\\UserTest'
vendor/bin/phpunit --filter 'UserTest' 

для теста одиночным методом:

 vendor/bin/phpunit --filter testExample 
 vendor/bin/phpunit --filter 'Tests\\Feature\\UserTest::testExample'
 vendor/bin/phpunit --filter testExample UserTest tests/Feature/UserTest.php

для запуска тестов из всех классов в пространстве имен:

vendor/bin/phpunit --filter 'Tests\\Feature'

для более подробного теста запуска см. больше

Джинеш Джойсар
источник
21

Итак, как то так

phpunit --filter 'EscalationGroupTest::testSaveAndDrop' EscalationGroupTest escalation/EscalationGroupTest.php 

Без =и с'

https://phpunit.de/manual/3.7/en/textui.html

sectus
источник
Нет, это не работает. Все тесты в классе EscalationGroupTestпроходят обработку.
Алекс
Тем не менее все 9 тестов проводятся. phpunit версия 3.2.8
Алекс
2
Переместите курсор --filterперед именем файла, и все должно работать правильно.
Шлейс
Работал для меня на PHPUnit 4.8.10
Asaph
Это дает мне No tests executed!на PHPUnit 4.8.35 @Schleis Как именно вы изменили команду?
Андру
14
  • Запустите это в корневом каталоге вашего проекта, который я использую в корневом каталоге laravel.

vendor/bin/phpunit --filter 'Your method name'

Пример с именем пользовательского метода.

 /** @test //Initilize this for custom method name, without test keyword
  *  
  * Test case For Dashboard When User Not logged In it will redirect To login page
  */
  public function only_logged_in_user_see_dashboard()
  {
    $response = $this->get('/dashboard')
                   ->assertRedirect('/login');
  }

Пример с тестовым ключевым словом

/**
* A basic test example.
*
* @return void
*/
 public function testBasicTest()
 {
  $this->assertTrue(true);
 }
Connectify_user
источник
1
Конечно, я новичок, теперь попробую более конкретный код в будущих ответах
Connectify_user
7

Если вы находитесь в NetBeans, вы можете щелкнуть правой кнопкой мыши в методе тестирования и выбрать «Запустить Focused Test Method».

Меню «Выполнить фокусированный тест»

Тони
источник
7

Вы можете попробовать это, я могу запустить отдельные тестовые случаи

phpunit tests/{testfilename}

Например:

phpunit tests/StackoverflowTest.php

Если вы хотите запускать отдельные тестовые случаи в Laravel 5.5, попробуйте

vendor/bin/phpunit tests/Feature/{testfilename} 

vendor/bin/phpunit tests/Unit/{testfilename} 

Например:

vendor/bin/phpunit tests/Feature/ContactpageTest.php 

vendor/bin/phpunit tests/Unit/ContactpageTest.php
Амит Кумар
источник
Вопрос был в том, как запустить одиночный тест МЕТОД (не класс)
Алексей Акирейкин
4

Все ваши тесты выполняются потому, что у вас есть --filter флаг после имени файла. PHPUnit вообще не читает параметры и выполняет все контрольные примеры.

С экрана справки:

 Usage: phpunit [options] UnitTest [UnitTest.php]
        phpunit [options] <directory>

Так что переместите --filterаргумент перед желаемым тестовым файлом, как указано в ответах @Alex и @Ferid Mövsümov. И у вас должен быть только тот тест, который вы хотите запустить.

Schleis
источник
Я не думаю, что это отвечает первоначальному вопросу ... У меня была та же проблема, что мне нужно было выполнить только один из тестов в файле, содержащем много модульных тестов, и два других ответа с использованием фильтров работали для меня
jfoo
@jfoo Одной из проблем с командами OP было то, что --filterопция была после имени файла. Два других ответа имели правильный ответ, но не указывали, почему применялся фильтр.
Шлейс
1

Я опаздываю на вечеринку, хотя. Но как личное я ненавижу писать всю строку.

Вместо этого я использую следующие ярлыки в файле .bash_profile, чтобы убедиться, что источник .bash_profile является источником после добавления любого нового псевдонима, иначе он не будет работать.

alias pa="php artisan"
alias pu="vendor/bin/phpunit" 
alias puf="vendor/bin/phpunit --filter"

Использование:

puf function_name

puf filename

Если вы используете Visual Studio Code, вы можете использовать следующий пакет, чтобы сделать ваши тесты быстрыми.

Package Name: Better PHPUnit
Link: https://marketplace.visualstudio.com/items?itemName=calebporzio.better-phpunit

Затем вы можете установить связывание клавиш в настройках. Я использую Command + T привязки в моем MAC.

Теперь, когда вы поместите курсор на любую функцию и затем используете привязку клавиш, он автоматически запустит этот единственный тест.

Если вам нужно запустить весь класс, поместите курсор поверх класса и затем используйте привязку клавиш.

Если у вас есть какие-то другие вещи, то всегда твик с Терминалом

Удачного кодирования!

Ханнавир Хакари
источник
0

Вы должны использовать --filter для запуска одного метода тестирования php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

Приведенный выше фильтр будет запускать testMethod в одиночку.

Умайр Анвар
источник