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

Posted

技术标签:

【中文标题】PHPUnit - 使用配置文件时“未执行测试”【英文标题】:PHPUnit - 'No tests executed' when using configuration file 【发布时间】:2015-05-31 16:39:18 【问题描述】:

问题

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

我决定使用 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 - ***目录(包含我所有的源代码) tests - ***目录(包含我的所有测试,结构与我的 src 文件夹相同) 供应商 - Composer 第三方文件

我还有 composer json 和 lock 文件,以及顶层的 phpunit xml 文件作为文件。

我尝试过的事情

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

【问题讨论】:

tests/GeneralStringFunctions/GeneralStringFunctionsTest是文件夹还是文件名? @hek2mgl 是一个文件名,实际上叫GeneralStringFunctionsTest.php。在命令行界面中,我没有输入.php 扩展名,因为没有它也可以工作。 好的,那么您的配置应该可以工作了。顺便说一句,如果你指定一个后缀,它应该是 Test.php 而不是 Test 在你的情况下,但是你可以忽略它,因为 Test.php 是默认值。 @hek2mgl 感谢您的提醒!您知道为什么我的测试没有使用配置文件phpunit.xml 运行吗? 为什么不给我们看配置文件? 【参考方案1】:

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

php artisan make:test homeTest

(它有一个默认测试,只是断言 true 为 true)

看到了输出

No tests executed!

问题最终对我来说与我的 PHP 安装有关——“phpunit”是全局注册和配置不同的,而 Laravel 安装附带的 phpunit 配置正确并且运行完美。

所以修复是运行供应商配置的 phpunit(来自与 app/ 和 tests/ 相同的根目录):

./vendor/bin/phpunit

希望对其他人有所帮助!

【讨论】:

我认为这很可能是正确答案。我已经删除了这个项目,所以我没有办法仔细检查,但是对于未来的 composer 项目,我一直使用 vendor/bin/phpunit 而不是全局的 phpunit 二进制文件。我什至已经删除了全局 phpunit 二进制文件,这样我就不会再不小心犯同样的错误了——从那以后它就再也没有出现过。我会将其标记为已接受的答案,因为这很可能是原因。 调用 ./vendor/bin/phpunit 为我做了一个全新的 laravel 5.4 安装的诀窍 同样,这对我在处理 Wordpress 项目时有所帮助。同样的问题:“phpunit”可以全局注册和配置不同。谢谢分享! @Noitidart 你可以为./vendor/bin/phpunit创建一个alias 使用 vendor\bin\phpunit(在 Windows 上)对我有用!【参考方案2】:

您的 XML 文件没有问题。但是,您必须确保 tests/ 文件夹中的 PHP 文件命名如下:

tests/Test.php 测试/用户Test.php 测试/fooBarTest.php 等等

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

此外,每个测试方法都必须有一个以“test”开头的名称或一个@test 注释:

public function testFooBar()

    // Your test code

或:

 /**
  * @test
  */
 public function fooBarTest() 
     // test code here
 

希望有帮助!

【讨论】:

或者你可以使用--test-suffix=anything.php覆盖 对我来说,用绝对路径替换测试文件夹的相对路径很有用。 如何在配置文件中覆盖这个?【参考方案3】:

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

.\vendor\bin\phpunit

如果是命令

phpunit

返回“未执行任何测试!”

在 Mac 上

./vendor/bin/phpunit

希望对你有帮助。

【讨论】:

非常感谢您的回答,这真的很有帮助。 确保你的全局路径中没有phpunit(你可以检查它是否运行类似phpunit --version的东西,看看它是否与你期望的匹配。Xampp 通常同时安装一个 phpunit php bin dir。这对我来说是个问题。 在单元测试方面,我是世界上最无知的人之一,所以这是一个很好的理由,但它确实有帮助。还是谢谢!【参考方案4】:

在我们的虚拟机上的 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 时遇到的问题 - 感谢您的提示!【参考方案5】:

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

我的问题是我忘记了 /** @test */中的“@”符号

错误:

/** test */
function a_thread_can_be_deleted()

    ...

右:

/** @test */
function a_thread_can_be_deleted()

    ...

【讨论】:

2 年多之后,这就是给我的。它确实必须是评论的格式。我在那里有一个缺失的空间。它没有检测到它。有点烦人,在 laravel 6.1 中我使用了 artisan make 命令,但它不包含该评论 这个答案很有用 我在开发包时遇到了这个问题。当我运行“php artisan make:test SomeTest”并将其移动到包测试目录时,基本 testExample 方法的注释仅包含基本描述和@return void,并且不包含“@test”,这就是 phpunit 无法'不要将其识别为测试。【参考方案6】:

在我决定使用 --debug (顺便说一句的好方法)之前,我拉了我的头发 10 分钟,以发现文件名不尊重命名约定,我在末尾多了一个“s”。

错了

CreateAdminTests

正确

CreateAdminTest

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

【讨论】:

太好了,之后我就可以运行测试了【参考方案7】:

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

vendor\bin\phpunit注意\不/

【讨论】:

【参考方案8】:

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

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

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

...
<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

【讨论】:

【参考方案9】:

而不是运行 phpunit

使用

供应商\bin\phpunit

【讨论】:

【参考方案10】:

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

Test Frameworks

然后单击 + 并选择

PHPUnit Local 然后

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

C:\YOUR PROJECT NAME\vendor\autoload.php

点击确定

HAPPY TESTING

【讨论】:

【参考方案11】:

检查 phpunit.xml 文件,查看测试套件。

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

【讨论】:

【参考方案12】:

测试文件中的函数名必须以test为前缀或者在函数前添加注释

/** @test */

确保不是

/* @test */

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

【讨论】:

【参考方案13】:

我遇到了同样的问题,我发现我的所有配置和语法都正常。我不知道为什么,只是简单地添加单词“tests”(复数形式),这是包含所有测试的 App 文件夹中的名称,对我来说效果很好:

[terminal] vendor/bin/phpunit tests

如果我的别名与普通的“phpunit”一起使用,我也会这样做

[terminal] phpunit tests

与过滤器相同

[terminal]  vendor/bin/phpunit --filter 'Tests\\Routes\\AnyTest' Tests

请注意,末尾的“tests”是复数形式,与 App 文件夹中的文件夹名称相同。

希望它能帮助并节省其他人的时间。

最好的问候

【讨论】:

【参考方案14】:

如果你没有测试类

        php artisan make:test TestName //default is future testing
        php artisan make:test TestName --unit //for unit testing 

然后您将在子文件夹 unit 或 future 下的 test 文件夹中找到测试文件 如果要执行所有测试文件,请使用

注意:为了测试,你可以编辑你的 ppuint.xml 文件,最好的方法是如果你 使用 sqlite 将其设置为标记,然后在您添加的最后一行之后 这两行

   <server name="DB_CONNECTION" value="sqlite"/>
   <server name="DB_DATABASE" value=":memory:"/>

您可以使用 vendor/bin/PHPUnit //这将执行每个测试文件 供应商/bin/PHPUnit 如果你想执行一个函数,你可以使用

         vendor/bin/PHPUnit --filter function_name or classname

最后,使用 /** @测试*/ 在每个测试中,为了让你 PHPUnit 知道 这是一个测试

【讨论】:

【参考方案15】:

您是否在 phpunit.xml 文件中添加了测试套件?

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

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

【讨论】:

嗨,抱歉,如果我没有在问题中说清楚,但我确实在 XML 文件中添加了一个测试套件和相应的名称。可在此处找到副本:pastebin.com/0j0L4WBD. 试试 ./tests 感谢您的更新,不幸的是我仍然遇到与 ./tests 相同的问题作为我的目录。 Time: 28 ms, Memory: 1.50Mb No tests executed! 不幸的是同样的问题:(Configuration read from /Users/muyiwa/Projects/Web Development/DatabaseHelper/phpunit.xml Time: 66 ms, Memory: 1.50Mb No tests executed!。当我手动引用它时它确实有效,只是由于某种原因它不喜欢从配置文件中加载:( 最后的猜测。尝试将 phpunit.xml 文件移动到 tests/ 目录中。在文件中,将目录更改为 ./.【参考方案16】:

对我来说,使用 phpunit --debug 向我展示了它没有执行的测试, 在里面,我有

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

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

对我来说,解决方案是去掉这个测试(或者很可能去掉 .htaccess 身份验证)

【讨论】:

【参考方案17】:

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

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

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

【讨论】:

【参考方案18】:

可能有点偏题,但如果你(像我一样)在 Vagrant 中使用 Laravel,请确保你在 vagrant 框内而不是在“windows 端”运行 phpunit。 :)

【讨论】:

【参考方案19】:

我遇到了没有执行测试的问题,即使事情设置得很好。

原因是命名空间不是文件的第一个命令,而是在一些 doc-block cmets 之后。

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

【讨论】:

【参考方案20】:

我的有点搞笑。

当我使用 php artisan make:test 时,我不小心把 .phpProductRewardPointController.php 这样创建了 ProductRewardPointController.php.php,而 phpunit 只是忽略了它。

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

【讨论】:

【参考方案21】:

我遇到了同样的问题,没有执行测试!,通过保持 file 的名称和 class 名称的相同来解决。

【讨论】:

【参考方案22】:

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

我花了半个小时才发现我忘了设置目录。您可以使用全局phpunit.phar,只要您正确设置测试范围和目录,IDE 将为您处理其他内容。

【讨论】:

【参考方案23】:

如果您使用的是@dataprovider,请确保其方法的可见性是public,这是我的问题

【讨论】:

【参考方案24】:

对于使用composer 的我来说,它适用于./vendor/bin/phpunitphpunit,我没有全局安装phpunit

@alext 的回答帮助我解决了这个问题。

因此,如果您通过运行 phpunit -h 查看 phpunit 手册 输出:

PHPUnit 7.5.20 by Sebastian Bergmann and contributors.

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

它需要一个目录或文件。 [options] 是可选的,您可以使用 phpunit.xml 文件传递​​它们

因为你的测试是在tests,所以你应该试试phpunit tests 如果它不起作用,请尝试使用来自 phpunit 的示例:https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html

【讨论】:

【参考方案25】:

在我的情况下,我应该将注释 @group active 添加到我的班级

/**
* @group active
**/

【讨论】:

【参考方案26】:

使用 de cmd 控制台通过 enterely 路径解决了这个问题 Test realized

我没有找到其他方法来做到这一点 It does not work from this way

我希望这对某人有帮助

【讨论】:

我试图让它与 phpunit 定义的全局一起工作,最后以这种方式工作,我使用的是 MacOS,命令行是 phpunit --debug ./

以上是关于PHPUnit - 使用配置文件时“未执行测试”的主要内容,如果未能解决你的问题,请参考以下文章

在不同的操作系统上运行 PHPUnit,XML 配置文件不同

默认情况下在PHPUnit中运行单个测试套件

phpunit xml配置颜色指令不起作用

phpunit 生成三种日志文件的配置方法

PHPUnit测试失败

xml phpunit示例xml配置文件。