如何使用 phpunit 运行单个测试方法?

问题描述 投票:0回答:15

我正在努力使用

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。

php phpunit
15个回答
677
投票

以下命令对单个方法运行测试:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

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

对于较新版本的 phpunit,它只是:

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

288
投票

我更喜欢将注释中的测试标记为

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

然后运行它

phpunit --group failing

无需在命令行中指定完整路径,但您必须记住在提交之前将其删除,以免使代码变得混乱。

您还可以为单个测试指定多个组

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

137
投票

这是更通用的答案:

如果您确定方法名称是唯一的,则只能按方法名称过滤(这对我有用)

phpunit --filter {TestMethodName}

但是指定文件路径/引用也更安全

phpunit --filter {TestMethodName} {FilePath}

示例:

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

快速说明:我注意到,如果我有一个名为

testSave
的函数和另一个名为
testSaveAndDrop
的函数,使用命令
phpunit --filter testSave
也会运行
testSaveAndDrop
以及任何其他以
testSave*
开头的函数,这很奇怪! !


60
投票

以下命令将执行完全

testSaveAndDrop
测试。

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

58
投票
  • 在我在 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);
 }

47
投票

通过多种方式在 Laravel 中运行 phpunit 测试 ..

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'

更多方式运行测试查看更多


31
投票

所以,像这样

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

没有

=
和有
'

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


11
投票

鉴于你

vendor/bin/phpunit --filter=EscalationGroupTest::testSaveAndDrop

8
投票

如果您使用的是 netbeans,您可以右键单击测试方法,然后单击“运行重点测试方法”。

Run Focused Test Method menu


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

5
投票

您的测试全部运行的原因是文件名后面有

--filter
标志。 PHPUnit 根本不读取选项,因此运行所有测试用例。

从帮助屏幕:

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

因此,将

--filter
参数移到您想要的测试文件之前,如 @Alex 和中所述 @Ferid Mövsümov 回答。 并且您应该只进行您想要运行的测试。


2
投票

如果您使用 XML 配置文件,则可以在

phpunit
标签内添加以下内容:

<groups>
  <include>
    <group>nameToInclude</group>
  </include>
  <exclude>
    <group>nameToExclude</group>
  </exclude>
</groups>

参见https://phpunit.de/manual/current/en/appendixes.configuration.html


1
投票

虽然我参加聚会迟到了。但就我个人而言,我讨厌写整行。

相反,我在 .bash_profile 文件中使用以下快捷方式,确保在添加任何新别名后source .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

然后您可以在设置中设置按键绑定。我在 MAC 中使用 Command + T 绑定。

现在,一旦您将光标放在任何 function 上,然后使用键绑定,它将自动运行该单个测试。

如果您需要运行整个,请将光标放在类的顶部,然后使用键绑定。

如果您有任何其他事情,请始终使用终端

快乐编码!


0
投票

您必须使用--filter来运行单个测试方法

php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

上述过滤器将单独运行 testMethod。


0
投票

在 Laravel (10) 中使用

php artisan test
它对我来说是这样的:

php artisan test tests\Feature\MyTest.php --filter testMethodName
© www.soinside.com 2019 - 2024. All rights reserved.