ChatGPT解决这个技术问题 Extra ChatGPT

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

问题

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

我决定使用 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 文件夹相同) vendor - Composer 第三方文件

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

我尝试过的事情

将 phpunit.xml 中的目录更改为 tests/GeneralStringFunctions

将 phpunit.xml 中的目录更改为 ./tests

将 phpunit.xml 文件移动到测试目录,然后将目录更改为 ./ 而不是测试。

向 phpunit.xml 中的目录标记添加 suffix 属性,以将“Tests”指定为显式后缀。

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

R
RoboBear

对于它的价值(迟到),我最近在为一个简单的网站制作一个新的 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 二进制文件,这样我就不会再不小心犯同样的错误了——从那以后它就再也没有出现过。我会将其标记为已接受的答案,因为这很可能是原因。
在全新的 laravel 5.4 安装中调用 ./vendor/bin/phpunit 为我解决了问题
同样,这对我在处理 Wordpress 项目时有所帮助。同样的问题:“phpunit”可以全局注册和配置不同。感谢你的分享!
@Noitidart 您可以为 ./vendor/bin/phpunit 创建一个 alias
使用 vendor\bin\phpunit(在 Windows 上)对我有用!
t
tommytucker7182

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

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

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

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

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

或者:

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

希望有帮助!


或者您可以使用 --test-suffix=anything.php 覆盖
对我来说,用绝对路径替换测试文件夹的相对路径很有用。
如何在配置文件中覆盖它?
当您可以将文件命名为 AcceptanceXYZTest.php 时,为什么要记住后缀魔术 - 这样每个人都会立即知道这是一个测试。你可以。超级独特,称它为 XYZTestCaseFile.php 并使用后缀 - 但这里的净收益在哪里?
将测试添加到修复它的方法中,谢谢
K
Kalamarico

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

.\vendor\bin\phpunit

那就是如果命令

phpunit

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

在 Mac 上时

./vendor/bin/phpunit

希望能帮助到你。


非常感谢您的回答,这真的很有帮助。
确保您的全局路径中没有 phpunit(您可以检查它是否运行类似 phpunit --version 的内容,看看它是否与您期望的匹配。Xampp 通常在同一个 php bin 目录中安装一个 phpunit。这就是问题所在大部头书。
在单元测试方面,我是世界上最无知的人之一,所以这是一个很好的理由,但它确实有帮助。不管怎么说,还是要谢谢你!
i
igors

在我们的虚拟机上的 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 时遇到的问题——谢谢你的提示!
B
Brad Ahrens

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

我的问题是我忘记了 /** @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 无法不要将其识别为测试。
c
chebaby

在我决定使用 --debug (顺便说一句的好方法)之前,我拉了我的头发 10 分钟,以发现文件名不遵守命名约定的简单事实,我最后有一个额外的“s” .

错误的

CreateAdminTests

正确的

CreateAdminTest

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


太好了,在那之后我能够运行测试
u
user8555937

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

以上解决方案对我不起作用。从 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


Z
Zymawy

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

vendor\bin\phpunit注意\不/


A
Arun Ganesan

而不是运行 phpunit

利用

供应商\bin\phpunit


C
Community

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

测试框架并单击 + 并选择

PHPUnit Local 然后

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

C:\{您的项目名称}\vendor\autoload.php

点击确定

快乐测试


J
Jan Polzer

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

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


M
Mubashar Abbas

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

/** @test */

确保它不是

/* @test */

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


a
alex t

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

[terminal] vendor/bin/phpunit tests

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

[terminal] phpunit tests

与过滤器相同

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

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

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

此致


h
henok tesfu

如果你没有测试课

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

那么您将在子文件夹单元下的测试文件夹中找到测试文件,如果您想执行所有使用的测试文件,您将在未来找到

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

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

您可以使用 vendor/bin/PHPUnit 执行您的测试文件 //这将执行每个测试文件 vendor/bin/PHPUnit 如果您希望执行单个函数,您可以使用

         vendor/bin/PHPUnit --filter function_name or classname

最后,在每个测试中使用 /** @test*/ 以便 PHPUnit 知道这是一个测试


A
Aine

您是否在 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/ 目录中。在文件中,将目录更改为 ./
f
flams

类和文件名中没有测试,例如“AuthorizationTest”


正如目前所写的那样,您的答案尚不清楚。请edit添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以找到有关如何写出好答案的更多信息in the help center
r
relipse

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

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

我认为因为该目录受到 .htaccess 身份验证的保护,所以无法访问该页面

我的解决方案是进行此测试(或者很可能进行 .htaccess 身份验证)


C
Codebender

这已经很晚了,但我希望它可以帮助某人。

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

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


m
martinethyl

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


p
pgee70

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

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

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


U
Udhav Sarvaiya

我的有点好笑。

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

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


A
Asif

我有同样的问题没有执行测试!,通过保持相同的文件名和类名来解决。


Z
Zhwt

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

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


M
Mwthreex

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


v
vanduc1102

对于使用 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


u
userfuser

这个问题有很多可能的答案。如果有人遇到与我相同的情况 - 我收到与 OP 相同的消息的原因是我的数据提供程序函数是 private

我将其更改为 public,一切都开始工作了。

我在这里谈论数据提供者:

/**
 * @dataProvider myProvider
 * @return void
 */
public function testGetWhatever()
{
    $this->assertTrue(true);
}

public function myProvider()
{
    return ...;
}

c
clockw0rk

就我而言,我在课堂上添加了注释@group active

/**
* @group active
**/

m
mcrsftDev

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

我没有找到其他方法It does not work from this way

我希望这对某人有帮助


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