PHPUnit - 使用配置文件时'没有执行测试'

时间:2015-03-27 11:03:50

标签: php unit-testing phpunit

问题

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

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

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

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

输出符合我的预期:

  

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

     

好(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第三方文件

我还有作曲家json和锁定文件,以及顶层的phpunit xml文件作为文件。

我尝试过的事情

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

25 个答案:

答案 0 :(得分:151)

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

php artisan make:test homeTest

(其默认测试只是断言为真)

并看到了输出

No tests executed!

我遇到的问题与我的PHP安装有关 - &#34; phpunit&#34;是全球注册和配置不同,而Laravel安装附带的phpunit配置恰到好处并且完美运行。

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

./vendor/bin/phpunit

希望能帮到别人!

答案 1 :(得分:79)

您的XML文件很好。但是,您必须确保tests/文件夹中的PHP文件的名称如下:

tests / Test.php &lt; ---注意大写字母“T”
测试/用户的 test.php的
测试/ foobar的的 test.php的

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

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

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

希望有所帮助!

答案 2 :(得分:11)

在Windows上使用终端

上的以下命令
.\vendor\bin\phpunit

如果是命令

phpunit

返回“没有执行测试!”

在Mac上

./vendor/bin/phpunit

希望它有所帮助。

答案 3 :(得分:10)

我的虚拟机上的PHPUnit更新到版本6之后我遇到了同样的问题。甚至--debug和--verbose没有任何用处,只是“没有执行测试”。最后,事实证明在新版本中更改了类和命名空间,它只是不想执行包含对旧类的引用的文件。对我来说,修复只是在每个测试用例中替换它:

class MyTestCase extends \PHPUnit_Framework_TestCase {...}

使用:

use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase {...}

答案 4 :(得分:4)

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

1010注意\ Not /

答案 5 :(得分:3)

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

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

答案 6 :(得分:2)

如果你没有测试班

        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 这是一个测试

答案 7 :(得分:2)

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

pages

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

tests

与过滤器相同

..

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

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

最好的问候

答案 8 :(得分:2)

我意识到这是超级老,但它也发生在我身上。希望这会对某人有所帮助。

我的问题是我忘记了&#39; @&#39; / ** @test * /

中的符号

WRONG:

...
OracleCommand command = null;
string storedprc = "CREATE OR REPLACE PROCEDURE MY_SCHEMA.SET_FK_FALSE AS BEGIN DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'REF_CONSTRAINTS',false); END;";
command = new OracleCommand(storedprc, this.Conn);
command.CommandType = CommandType.Text;
command.ExecuteNonQuery();
//       
command = new OracleCommand();
command.Connection = this.Conn;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "MY_SCHEMA.SET_FK_FALSE";
command.ExecuteNonQuery();
//
string queryString = "SELECT DBMS_METADATA.GET_DDL( 'TABLE','MY_TABLE_NAME','MY_SCHEMA') FROM DUAL;";
command = new OracleCommand(queryString, this.Conn);
command.CommandType = CommandType.Text;
reader = command.ExecuteReader();
string ddlScript = null;
if (reader.Read())
{
    ddlScript = reader[0].ToString();
}
reader.Close();
...

RIGHT:

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

答案 9 :(得分:2)

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

  • Test Frameworks

    然后单击+并选择

  • PHPUnit Local然后
  • Use Composer Auto Loader 然后将其粘贴到脚本字段的路径中
  • C:\{YOUR PROJECT NAME}\vendor\autoload.php
  • 单击确定
  • HAPPY TESTING

答案 10 :(得分:1)

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

错误

CreateAdminTests

CreateAdminTest

希望此注释对某人有帮助

答案 11 :(得分:1)

代替运行 phpunit

使用

供应商\ bin \ phpunit

答案 12 :(得分:1)

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

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

答案 13 :(得分:1)

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

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

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

答案 14 :(得分:0)

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

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

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

答案 15 :(得分:0)

我遇到了相同的问题没有执行任何测试!,可以通过保持文件 class 名称相同来解决。

答案 16 :(得分:0)

可能会有一点点,但如果你(像我一样)在Vagrant中使用Laravel,请确保你在流浪盒内运行phpunit而不是在&#34; windows侧&#34;。 :)

答案 17 :(得分:0)

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

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

答案 18 :(得分:0)

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

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

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

答案 19 :(得分:0)

我很有趣。

当我使用php artisan make:test时,我意外地将{strong> .php 设置为创建ProductRewardPointController.php的{​​{1}}和 phpunit ,而忽略了它。< / p>

我只是将额外的 .php 删除,恢复正常

答案 20 :(得分:0)

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

/** @test */

确保不是

/* @test */

因为这不起作用。斜线后必须有两个星号,而不是一个。

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

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

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

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

答案 23 :(得分:0)

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

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

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

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

答案 24 :(得分:-2)

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

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

我希望这对某人有帮助