在PHPUnit中使用Composer和autolload .php自动加载类



我刚刚通过Composer安装了PHPUnit 3.7.19版本,并编写了一个我想进行单元测试的类。

我想让我所有的类自动加载到每个单元测试没有必须使用includerequire在我的测试的顶部,但这被证明是困难的!

我的目录结构是这样的(后面的/斜杠表示一个目录,而不是一个文件):

* composer.json
* composer.lock
* composer.phar
* lib/
    * returning.php
* tests/
    * returningTest.php
* vendor/
    * bin/
        * phpunit
    * composer/
    * phpunit/
    * symfony/
    * autoload.php
我的<<p> strong>作曲家。json文件包括以下内容:
"require": {
    "phpunit/phpunit": "3.7.*",
    "phpunit/phpunit-selenium": ">=1.2"
}

我的return .php类文件包括以下内容:

<?php
class Returning {
    public $var;
    function __construct(){
        $this->var = 1;
    }
}
?>

我的returningTest.php测试文件包括以下内容:

<?php
class ReturningTest extends PHPUnit_Framework_TestCase
{
    protected $obj = null;
    
    protected function setUp()
    {
        $this->obj = new Returning;
    }
    
    public function testExample()
    {   
        $this->assertEquals(1, $this->obj->var);
    }
    protected function tearDown()
    {
        
    }
}
?>

然而,当我从命令行运行./vendor/bin/phpunit tests时,我得到以下错误:

PHP致命错误:类'Returning'没有找到/files/code/php/db/tests/returningTest.php第8行

我注意到composervendor/autoload.php中产生了autoload.php文件,但不确定这是否与我的问题相关。

此外,在Stack Overflow的其他一些答案中,人们提到了在composer中使用PSR-0和在PHP中使用namespace命令,但我没有成功使用任何一个。

请帮忙!我只是想在PHPUnit中自动加载我的类,这样我就可以用它们来创建对象,而不用担心includerequire


更新日期:2013年8月14日

我现在已经创建了一个名为PHPUnit Skeleton的开源项目,以帮助您轻松地为您的项目启动和运行PHPUnit测试。

首先。您需要告诉自动加载器在哪里可以找到一个类的php文件。这是通过遵循PSR-0标准完成的。

最好的方法是使用名称空间。当您请求AcmeTestsReturningTest类时,自动加载程序搜索Acme/Tests/ReturningTest.php文件。那里有一些很棒的命名空间教程,只需搜索并阅读即可。请注意,命名空间不是PHP中用于自动加载的,它可以用于自动加载。

Composer带有一个标准的PSR-0自动加载器(vendor/autoload.php中的一个)。在您的示例中,您希望告诉自动加载程序在lib目录中搜索文件。然后,当你使用ReturningTest,它会寻找/lib/ReturningTest.php

添加到你的composer.json:

{
    ...
    "autoload": {
        "psr-0": { "": "lib/" }
    }
}

更多信息见文档

现在自动加载器可以找到你需要的类,让PHPunit知道在运行测试之前有一个文件要执行:一个引导文件。您可以使用--bootstrap选项来指定引导文件的位置:

$ ./vendor/bin/phpunit tests --bootstrap vendor/autoload.php

但是,使用PHPunit配置文件会更好:

<!-- /phpunit.xml.dist -->
<?xml version="1.0" encoding="utf-8" ?>
<phpunit bootstrap="./vendor/autoload.php">
    <testsuites>
        <testsuite name="The project's test suite">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

现在,你可以运行命令,它会自动检测配置文件:

$ ./vendor/bin/phpunit

如果您将配置文件放入另一个目录,则需要在命令中使用-c选项将该目录的路径放入该目录。

[Update2]另一种更简单的替代方法是在composer.json(参考)中使用autoload-dev指令。这样做的好处是,您不需要为了自动加载不同的类而维护两个bootstrap.php(一个用于prod,一个用于dev)。

{
  "autoload": {
    "psr-4": { "MyLibrary\": "src/" }
  },
  "autoload-dev": {
    "psr-4": { "MyLibrary\Tests\": "tests/" }
  }
}

[Update] Wouter J的答案更完整。但是我的可以帮助那些想要在tests/文件夹中设置PSR-0自动加载的人。Phpunit使用*Test.php模式扫描所有文件。所以我们不需要自己自动加载它们。但是我们仍然希望自动加载tests/下的其他支持类,如fixture/stub或一些父类。

一个简单的方法是查看Composer项目本身是如何设置phpunit测试的。其实很简单。注意"bootstrap"这一行。

参考:https://github.com/composer/composer/blob/master/phpunit.xml.dist

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="tests/bootstrap.php"
>
    <testsuites>
        <testsuite name="Composer Test Suite">
            <directory>./tests/Composer/</directory>
        </testsuite>
    </testsuites>
    <groups>
        <exclude>
            <group>slow</group>
        </exclude>
    </groups>
    <filter>
        <whitelist>
            <directory>./src/Composer/</directory>
            <exclude>
                <file>./src/Composer/Autoload/ClassLoader.php</file>
            </exclude>
        </whitelist>
    </filter>
</phpunit>

参考:https://github.com/composer/composer/blob/master/tests/bootstrap.php

<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
error_reporting(E_ALL);
$loader = require __DIR__.'/../src/bootstrap.php';
$loader->add('ComposerTest', __DIR__);

上面的最后一行是在名称空间Composer test下自动加载phpunit测试类。

这些答案都不是我想要的。是的,PHPUnit加载测试文件,但不加载存根/fixture。Chaun Ma的答案不能解决这个问题,因为运行vendor/bin/phpunit已经包含了自动加载,所以没有办法让一个自动加载器的实例在那时向它的堆栈推送更多的路径。

我最终在文档中找到了这个:

如果您需要在多个目录中搜索相同的前缀,您可以可以像这样将它们指定为数组:

{
    "autoload": {
        "psr-0": { "Monolog\": ["src/", "lib/"] }
    }
}

有一个非常简单的方法来设置phpunit的自动加载和引导。使用phpunit的--generate-configuration选项在几秒钟内创建您的phpunit.xml配置-:

vendor/bin/phpunit --generate-configuration

(如果在PATH中设置了phpunit,则仅为phpunit --generate-configuration)。此选项从phpunit5及以上版本开始可用。

该选项将提示您输入引导文件(vendor/autolload .php)、测试和源代码目录。如果您的项目设置了composer默认值(请参阅下面的目录结构),则默认选项将是您所需要的全部。只要按三次回车键!

project-dir
   -- src
   -- tests
   -- vendor

您会得到一个默认的phpunit.xml,这很好。你当然可以编辑包括任何专业(例如colors="true"),你需要-:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.1/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         executionOrder="depends,defects"
         forceCoversAnnotation="true"
         beStrictAboutCoversAnnotation="true"
         beStrictAboutOutputDuringTests="true"
         beStrictAboutTodoAnnotatedTests="true"
         verbose="true">
    <testsuites>
        <testsuite name="default">
            <directory suffix="Test.php">tests</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">src</directory>
        </whitelist>
    </filter>
</phpunit>

如果你使用的是PHPUnit 7,你可以让你的类从src/文件夹自动加载到测试中,像这样:

  1. 确保你的composer.json文件看起来像这样:

    {
        "autoload": {
            "classmap": [
                "src/"
            ]
        },
        "require-dev": {
            "phpunit/phpunit": "^7"
        }
    }
    
  2. To apply changes in composer.json run command:

    composer install
    
  3. 最后您可以在tests/文件夹中运行测试:

    ./vendor/bin/phpunit tests/
    

相关内容

  • 没有找到相关文章

最新更新