PHPUnit - 'No tests executed' 使用配置文件时

PHPUnit - 'No tests executed' when using configuration file

问题

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

我决定使用 composer 安装 PHPUnit 作为个人库,它允许我实现常用的数据库功能。起初我没有 PHPUnit 的配置文件,当我 运行 命令如下:

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

请注意,这是一个终端命令,所以我没有包含 .php 扩展名。上面提到的GeneralStringFunctionsTest其实就是一个GeneralStringFunctionsTest.php文件

输出符合我的预期:

Time: 31 ms, Memory: 2.75Mb

OK (1 test, 1 assertion)

然后我尝试使用配置文件自动加载测试套件,而不必每次都手动输入文件。我在我的根目录中创建了一个名为 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

我得到以下输出:

PHPUnit 4.5.0 by Sebastian Bergmann and contributors.

Configuration read from /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml

Time: 16 ms, Memory: 1.50Mb

No tests executed!

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

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

我尝试过的事情

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

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

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

您的 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
 }

希望对您有所帮助!

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

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

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

我的解决方案是取消这个测试(或者最有可能取消 .htaccess 身份验证)

为了它的价值(迟到了),我最近在为一个简单的网站制作一个新的 Laravel 5.1 项目时 运行 进入了这个。我试着调试它,当我尝试时感到困惑:

php artisan make:test homeTest

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

并看到输出

No tests executed!

最终对我造成的问题与我的 PHP 安装有关——"phpunit" 是全局注册和配置不同的,而 Laravel 安装附带的 phpunit配置得恰到好处 运行 完美。

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

./vendor/bin/phpunit

希望对其他人有所帮助!

在我们的虚拟机上的 PHPUnit 更新到版本 6 后,我遇到了同样的问题。即使 --debug 和 --verbose 也没说什么有用的,只是 "No tests executed"。最后发现 类 和命名空间在新版本中发生了变化,它只是不想执行包含对旧 类 的引用的文件。对我来说,修复只是在每个测试用例中替换这个:

class MyTestCase extends \PHPUnit_Framework_TestCase {...}

与:

use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase {...}

使用 de cmd 控制台解决了这个传递 enterely 路径的问题 Test realized

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

我希望这对某人有帮助

我知道这太老了,但它也发生在我身上。希望这会对某人有所帮助。

我的问题是我忘记了 /** @test */

中的“@”符号

错误:

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

右:

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

我的有点搞笑。

当我使用 php artisan make:test 时,我不小心把 .phpProductRewardPointController.php 这样创建了 ProductRewardPointController.php.phpphpunit直接无视了

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

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

vendor\bin\phpunit注意\不/

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

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

我的目录行是这样的。/tests/test.php

在 windows 终端上使用以下命令

.\vendor\bin\phpunit

如果命令

phpunit

returns "No tests executed!"

在 Mac

./vendor/bin/phpunit

希望对您有所帮助。

可能有点偏题,但是如果你(像我一样)在 Vagrant 中使用 Laravel,请确保你是 运行 phpunit 在 vagrant box 里面而不是 "windows side"。 :)

在我决定使用 --debug(顺便说一下,这是个好方法)之前,我把头发拉了 10 分钟来发现一个简单的事实,即文件名没有尊重命名约定,我在最后多了一个"s"。

错误

CreateAdminTests

CreateAdminTest

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

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

  • Test Frameworks

    然后点击 + 并选择

  • PHPUnit Local 然后

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

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

  • 单击确定

  • HAPPY TESTING

我遇到了没有测试被执行的问题,即使一切都设置好了。

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

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

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

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

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

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

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

而不是运行 phpunit

使用

vendor\bin\phpunit

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

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

有关 PHP 单元 XML 配置的其他信息可在此处找到:https://phpunit.de/manual/6.5/en/appendixes.configuration.html

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

之前添加注释
/** @test */

确保它不是

/* @test */

因为那行不通。斜线后需要有两个星号,而不是一个。

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

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

[terminal] vendor/bin/phpunit tests

如果我的别名适用于普通的“phpunit”,我也会这样做

[terminal] phpunit tests

与过滤器相同

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

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

希望对其他人有所帮助并节省时间。

此致

如果您没有测试 Class

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

然后你会在子文件夹unit或future下的测试文件夹中找到测试文件 如果你想执行所有的测试文件使用

注意:为了进行测试,您可以编辑 phpuint.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

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

对我来说 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 file

传递它们

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

在我的例子中,我在 class

中添加了注解 @group active
/**
* @group active
**/

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

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

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

我在这里谈论 data-provider:

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

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