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


334

我奋力奔跑名为单个测试方法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。


您的测试课程的课程名称是什么?
sectus 2014年

Answers:


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?有什么用?
mujaffars '16

2
好吧,我知道这是班级名称
mujaffars,2016年

15
它还将运行名称为testSaveAndDrop *的测试方法(例如:testSaveAndDropSomething)。要精确运行testSaveAndDrop,请使用--filter'/ :: testSaveAndDrop $ /'
Farid Movsumov '16

1
@mujaffars我怀疑,由于空格,“ I got it”在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()
{
}

4
我喜欢这种方法,是否可以通过注释分配多个组?@group failing, Integration
迪兹·布莱恩

4
当然是。但不要以逗号分隔。编辑答案以说明这一点。
iamtankist 2015年

我更好地喜欢这种方法... phpunit.xml中的<groups>元素也可以用于过滤测试...在下面的类似以下内容中使用类似的东西<phpunit>:<groups> <include> <group> failing </ group > </ include> </ groups>
Nicolas Galler

2
但是问题是-运行一次测试。另外-命名为failing的组是您可以使用的最差的组。因为在某些测试失败之后,您可以运行phpunit --group,但如果没有将失败的测试分组,就无法运行失败的测试。令人困惑。
拉斐尔·曼尼希(RafałMnich)2016年

最好的答案!如果没有其他任何测试,则@depends您必须查明所有相互关联的测试,然后使用@group注释。
世纪人

116

这是更通用的答案:

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

phpunit --filter {TestMethodName}

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

phpunit --filter {TestMethodName} {FilePath}

例:

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

快速说明:我已经注意到,如果我有一个名为的函数,testSave并且另一个testSaveAndDrop使用command 命名的函数phpunit --filter testSave也将运行,testSaveAndDrop而其他以开头的函数testSave*,那就太奇怪了!


4
一点也不奇怪,基本上是子字符串匹配。如果您想要这种行为,请使用字符串令牌结尾:/testSave$/
Christian

如果您只想指定文件路径以使该文件中的所有测试都运行,该怎么办?
still_dreaming_1'9

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

通过多种方式在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'

有关更多方式运行测试的更多信息


21

所以像这样

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

没有=和有'

https://phpunit.de/manual/3.7/en/textui.h​​tml


不,这不起作用。该类EscalationGroupTest中的所有测试都在处理中。
亚历克斯

仍然所有9个测试都在运行。phpunit版本3.2.8
Alex

2
--filter移到文件名之前,它应该可以正常工作。
Schleis 2015年

在PHPUnit 4.8.10上为我工作
Asaph

这给了我No tests executed!PHPUnit 4.8.35 @Schleis,您究竟如何更改命令?
安德鲁(Andru)

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

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

运行重点测试方法菜单


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

问题是如何运行单一测试方法(非课程)
Aleksei Akireikin,

4

测试全部运行的原因是您拥有 --filter文件名后标志。PHPUnit根本不读取选项,因此正在运行所有测试用例。

在帮助屏幕中:

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

因此--filter,如@Alex和@FeridMövsümov答案中所述,将参数移到所需的测试文件之前。而且,您应该只具有要运行的测试。


我不认为这解决了最初的问题...我有一个同样的问题,需要在包含许多单元测试的文件中仅运行其中一个测试,而使用过滤器的其他两个答案对我
有用

@jfoo OP命令的问题之一是该--filter选项位于文件名之后。其他两个答案具有正确的答案,但没有指出为什么要应用该过滤器。
Schleis 2015年


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

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

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

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

如果您有其他任何事情,请始终在终端机上度过

编码愉快!


0

您必须使用--filter来运行单个测试方法 php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

上面的过滤器将单独运行testMethod。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.