PHPUnit-使用配置文件时“未执行测试”


89

问题

为了提高代码质量,我决定尝试学习如何使用单元测试而不是平庸的最佳测试解决方案来测试代码。

我决定使用composer为个人库安装PHPUnit,这使我可以实现常见的数据库功能。最初,我没有用于PHPUnit的配置文件,当我运行以下命令时:

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

请注意,这是一个终端命令,因此未包含.php扩展名。上面提到的GeneralStringFunctionsTest实际上是一个GeneralStringFunctionsTest.php文件。

输出是我期望的:

时间:31毫秒,内存:2.75Mb

OK(1个测试,1个断言)

然后,我尝试使用配置文件自动加载测试套件,而不必每次都手动输入文件。我phpunit.xml在根目录中创建了一个名为的文件,并将以下内容输入到该文件中:http : //pastebin.com/0j0L4WBD

<?xml version = "1.0" encoding="UTF-8" ?>
<phpunit>
    <testsuites>
        <testsuite name="Tests">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

现在,当我运行命令时:

phpunit

我得到以下输出:

Sebastian Bergmann和贡献者的PHPUnit 4.5.0。

从/Users/muyiwa/Projects/DatabaseHelper/phpunit.xml中读取配置

时间:16毫秒,内存:1.50Mb

没有执行测试!

如果有帮助,我的目录结构如下:
src-顶级目录(包含所有源代码)
测试-顶级目录(包含所有测试,结构与src文件夹相同)
供应商-Composer第三方文件

我也有composer json和lock文件,以及顶层phpunit xml文件。

我尝试过的事情

  • 将目录更改phpunit.xmltests/GeneralStringFunctions
  • 将目录更改phpunit.xml./tests
  • phpunit.xml文件移动到tests目录,然后将目录更改为./而不是tests
  • 在目录标记中添加后缀属性,phpunit.xml以将“ Tests”指定为显式后缀。

tests/GeneralStringFunctions/GeneralStringFunctionsTest文件夹还是文件名?
hek2mgl 2015年

@ hek2mgl这是一个文件名,实际上称为GeneralStringFunctionsTest.php。在命令行界面中,我没有输入.php扩展名,因为没有扩展名就可以使用。
Muyiwa Olu 2015年

1
好的,那么您的配置应该可以工作了。顺便说一句,如果您指定后缀,则应该是后缀Test.php而不是Test您的情况,但是,您可以随意忽略它,因为Test.php它是默认值。
hek2mgl

@ hek2mgl感谢您的注意!您知道为什么我的测试未与配置文件一起运行phpunit.xml吗?
Muyiwa Olu 2015年

您为什么不向我们显示配置文件?
2015年

Answers:


190

为了它的价值(很晚),我最近在为一个简单的网站制作一个新的Laravel 5.1项目时遇到了这个问题。我尝试调试它,并在尝试时感到困惑:

php artisan make:test homeTest

(它具有一个默认测试,仅断言true为true)

看到了输出

No tests executed!

最终导致我遇到的问题与我的PHP安装有关–“ phpunit”在全球范围内注册和配置不同,而Laravel安装随附的phpunit配置正确且运行完美。

因此,该修复程序正在运行供应商配置的phpunit(来自与app /和tests /相同的根目录):

./vendor/bin/phpunit

希望对别人有帮助!


4
我认为这很可能是正确的答案。此后,我删除了该项目,因此无法再次检查,但是对于以后使用composer的项目,我一直使用vendor/bin/phpunit而不是全局phpunit二进制文件。我什至已经删除了全局phpunit二进制文件,所以我不会再犯同样的错误了-从那以后它还没有弹出。我将其标记为已接受的答案,因为这很可能是原因。
Muyiwa Olu

3
打电话./vendor/bin/phpunit给我带来了新的laravel 5.4安装上的窍门
ira

同样,这对我从事Wordpress项目的工作有帮助。相同的问题:“ phpunit”可以全局注册和配置。感谢你的分享!
sqsinger

这为我修复了它,但是有没有办法全局修复phpunit?如果我能键入,那就太好了phpunit
Noitidart '17

2
@Noitidart您可以创建一个alias./vendor/bin/phpunit
加尼甚ķ

98

您的XML文件就可以了。但是,您必须确保文件tests/夹中的PHP文件的命名如下:

tests / Test.php <---注意大写的“ T”
tests / user Test.php
tests / fooBar Test.php
等。

文件名必须以“ Test.php”结尾。这就是PHPUnit在目录中寻找的东西。

此外,每个测试方法都必须以“ test”开头的名称:

public function testFooBar()
{
    // Your test code
}

希望有帮助!


4
或者您可以使用--test-suffix=anything.php覆盖
校验和

对我来说,用绝对路径替换测试文件夹的相对路径很有用。
Timur Samkharadze

如何在配置文件中覆盖它?
乔纳森

19

在Windows上,在终端上使用以下命令

.\vendor\bin\phpunit

那是命令

phpunit

返回“未执行测试!”

在Mac上

./vendor/bin/phpunit

希望能帮助到你。


非常感谢您的回答,这确实有帮助。
Goke Obasa

确保有没有phpunit在您的全局路径(你可以检查它运行像phpunit --version,看看它的匹配,干嘛你期待XAMPP通常在同一PHP bin目录安装了PHPUnit的就是这个问题给我。
giovannipds

12

在我们的虚拟机上将PHPUnit更新到版本6之后,我遇到了同样的问题。即使--debug和--verbose都说没什么用,只是“没有执行测试”。最后,事实证明,新版本中的类和名称空间已更改,只是不想执行包含对旧类的引用的文件。对我来说,解决方法是在每个测试用例中都替换为:

class MyTestCase extends \PHPUnit_Framework_TestCase {...}

与:

use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase {...}

嗯,是的,虽然看起来好像不是原始问题的答案,但升级到6.x后它解决了我的问题!
多摩

从PHPUnit 5.7升级到8.5时,这也是我的问题-谢谢您的提示!
确认者

7

我意识到这已经很老了,但是这也发生在我身上。希望这会对某人有所帮助。

我的问题是我忘了/ ** @test * /中的'@'符号

错误:

/** test */
function a_thread_can_be_deleted()
{
    ...
}

对:

/** @test */
function a_thread_can_be_deleted()
{
    ...
}

1
两年多了,对我来说就是这样。实际上,评论的格式必须正确。我那里缺少空间。它没有检测到它。有点烦人,在laravel 6.1中,我使用了工匠的make命令,但不包含该注释
aibarra

1
这个答案很有用
Sundar

我在开发软件包时遇到了问题。当我运行'php artisan make:test SomeTest'并将其移至包测试目录时,基本testExample方法的注释仅包含基本描述,@return void并且不包含'@test',这就是phpunit无法识别的原因作为测试。
DAMIEN JIANG

5

在决定使用--debug(顺便说一句好方法)之前,我拉了10分钟,以发现一个简单的事实,即文件名不遵守命名约定,我在末尾加了一个“ s” 。

错误

CreateAdminTests

CreateAdminTest

希望这篇笔记能对某人有所帮助


太好了,之后我可以进行测试
WindSaber

4

您只需要从供应商文件中调用它

vendor\bin\phpunit 通知\不是/



2

如果您使用的是PHPSTORM,请转到“设置”,然后转到

  • Test Frameworks

    然后点击+并选择

  • PHPUnit Local 然后

  • Use Composer Auto Loader 然后将其粘贴到脚本字段的路径中

  • C:\{YOUR PROJECT NAME}\vendor\autoload.php

  • 点击确定

  • HAPPY TESTING


2

检查phpunit.xml文件,查看testsuites内部。

我的phpunit版本(2019)正在寻找结尾(后缀)* Test.php的文件。因此,请确保所有测试文件都正确命名(例如:BookTest.php是正确的,BookTests.php是不正确的,BookTestCase.php是不正确的)。


2

迟到了聚会,但此信息可能会对其他人有所帮助。

上述解决方案对我不起作用。从Laravel 7.x开始,默认情况下,PHPUnit仅执行后缀为“ Test.php”的PHP文件。例如,如果您创建测试,则命名CreateUser将不起作用,而命名CreateUserTest则将起作用。

要克服此限制,请转到phpunit.xml并修改元素的suffix属性directory

...
<testsuite name="Unit">

    <!-- modify suffix -->
    <directory suffix=".php">./tests/Unit</directory>

</testsuite>
<testsuite name="Feature">

    <!-- modify suffix -->
    <directory suffix=".php">./tests/Feature</directory>

</testsuite>
...

这将指示PHPUnit运行目录中带有.php扩展名的所有文件。请注意在更新后清除应用程序的缓存phpunit.xml

php artisan config:cache

有关PHPUnit XML配置的其他信息,可以在这里找到:https : //phpunit.de/manual/6.5/en/appendixes.configuration.html


1

您是否已将测试套件添加到phpunit.xml文件中?

<phpunit>
    <testsuite name="app1" >
        <directory>./</directory>
    </testsuite>
</phpunit>

您可以在其中添加多个目录。


嗨,很抱歉,如果我在问题中没有明确说明,但确实向XML文件添加了测试套件和相应的名称。可以在这里找到副本:pastebin.com/0j0L4WBD
Muyiwa Olu 2015年

尝试<directory> ./ tests </ directory>
Aine 2015年

感谢您的更新,不幸的是,。/ tests我仍然遇到与目录相同的问题。Time: 28 ms, Memory: 1.50Mb No tests executed!
Muyiwa Olu 2015年

不幸的是,同样的问题:( Configuration read from /Users/muyiwa/Projects/Web Development/DatabaseHelper/phpunit.xml Time: 66 ms, Memory: 1.50Mb No tests executed!。当我手动引用它时,它肯定可以工作,只是出于某种原因不喜欢从配置文件中加载:(
Muyiwa Olu,2015年

最后的猜测。尝试将phpunit.xml文件移至tests /目录。在文件中,将目录更改为<directory> ./ </ directory>。
Aine

0

对我来说,使用phpunit --debug告诉我它没有执行哪个测试,在内部

$this->visit('/')
         ->see('Laravel');

而且我认为由于该目录受.htaccess身份验证保护,因此无法访问该页面

我的解决方案是进行此测试(或最有可能采取.htaccess身份验证)


0

这已经很晚了,但我希望对您有所帮助。

我使用绝对引用来运行测试。文件夹结构[project / tests / test.php]

我的目录行看起来像这样./tests/test.php


0

可能在一边,但是如果您(像我一样)在Vagrant中使用Laravel,请确保在vagrant框内而不是在“ Windows端”上运行phpunit。:)


0

我遇到的问题是,即使一切正常,也没有执行任何测试。

原因是名称空间不是文件的第一个命令,而是在一些文档块注释之后。

还原导致phpunit查看测试并正确运行。


0

我的有点可笑。

当我使用时,php artisan make:test我不小心把.php像是ProductRewardPointController.php创建的那样,ProductRewardPointController.php.phpphpunit却忽略了它。

我只是删除了多余的.php文件,一切恢复正常


0

我遇到了没有执行测试的相同问题,方法是保持文件名和名相同。


0

如果使用的是诸如JetBrains PHPStorm之类的IDE ,还请注意:在Run/Debug Configurations窗口中,Test scope需要设置为directory并将该目录指向tests文件夹所在的位置。

我花了半个小时才弄清楚我忘记设置目录了。phpunit.phar只要正确设置测试范围和目录,就可以使用global ,IDE会为您处理其他内容。


0

测试文件中的函数名称必须带有前缀test或在函数之前添加注释

/** @test */

确保不是

/* @test */

因为那行不通。斜线后必须有两个星号而不是一个。


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.