Як запустити єдиний метод тестування з 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а версія phpunit- 3.2.8.


Яка назва вашого тестового класу?
секта

Відповіді:


459

Наступна команда виконує тест на одному методі:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

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

Для новіших версій phpunit достатньо:

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

1
Чи потрібно писати EscalationGroupTest? В чому користь від цього?
моджафари

2
Гаразд, я зрозумів, що це клас
mujaffars

15
Він також запустить метод тестування з ім'ям testSaveAndDrop * (наприклад: testSaveAndDropSomething) також. Щоб запустити саме тестSaveAndDrop, використовуйте --filter '/ :: testSaveAndDrop $ /'
Фарид Мовсумов

1
@mujaffars Я сумніваюся, що "я отримав це" не є дійсним ідентифікатором у php через пробіл.
Джон МакКлунг

2
Зараз це не працює. Просто phpunit --filter methodName path/to/testing/file, ні ClassName .
CJ Dennis

213

Я вважаю за краще тест тестувати в анотації як

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

Потім запустіть його

phpunit --group failing

Не потрібно вказувати повний шлях у командному рядку, але ви повинні пам’ятати про видалення цього перед фіксацією, щоб не захаращувати код.

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

/**
  * @group failing
  * @group bug2204 
  */
public function testSomethingElse()
{
}

4
Мені подобається цей метод, чи можна призначити кілька груп за допомогою анотації? @group failing, Integration
Dizzy Bryan High

4
Так, звісно. Але не розділяються комами. Відредагував відповідь, щоб проілюструвати це.
iamtankist

Мені більше подобається цей метод ... для посилання на елемент <groups> у phpunit.xml також можна використовувати для фільтрації тестів ... використовувати щось подібне прямо під <phpunit>: <groups><include> <group> failed </ group > </include> </groups>
Ніколя Галлер

2
Але питання було - провести тест SINGLE. Крім того - група з назвою провал - це найгірше, що можна використати. Оскільки після деяких тестів не вдалося запустити 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


Ні це не працює. Усі тести в класі EscalationGroupTestопрацьовуються.
Алекс

Досі проводяться всі 9 тестів. phpunit версія 3.2.8
Алекс

2
Перемістіть --filterна, перш ніж ім'я файлу, і все має працювати правильно.
Шлейс

Працював для мене на PHPUnit 4.8.10
Асаф

Це дає мені 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);
 }

1
Впевнений, що я початківець зараз спробую більш конкретний код для майбутніх відповідей
Connectify_user

7

Якщо ви перебуваєте в мережі, ви можете натиснути правою кнопкою миші метод випробування та натиснути "Запустити фокусований метод тестування".

Запустіть меню фокусованого методу тестування


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

Питання полягало в тому, як запустити єдиний тест METHOD (не клас)
Олексій Акірейкін

4

Причина, по якій проводяться ваші тести, полягає в тому, що у вас є --filter прапор після імені файлу. PHPUnit взагалі не читає параметри, тому працює всі тестові випадки.

На екрані довідки:

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

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


Я не думаю, що це стосується початкового питання ... У мене була та сама проблема, що потрібно запустити лише один з тестів у файлі, що містить багато одиничних тестів, і два інші відповіді за допомогою фільтрів працювали на мене
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, ви можете скористатися наступним пакетом, щоб зробити свої тести вітерцем.

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 самостійно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.