使用Composer和autoload.php自动加载类PHPUnit中(Autoloading c

2019-08-18 07:11发布

我刚才塞巴斯蒂安伯格曼通过作曲家安装PHPUnit的版本3.7.19,并写了一个班,我想单元测试。

我想有自动加载到每个单元测试所有我的班, 而无需使用includerequire在我的测试的顶部,但这被证明是困难!

这是我的目录结构是什么样子(一个尾随/斜杠表示目录,而不是一个文件):

  • composer.json
  • composer.lock
  • composer.phar
  • LIB /
    • returning.php
  • 测试/
    • returningTest.php
  • 供应商/
    • 斌/
      • PHPUnit的
    • 作曲家/
    • PHPUnit的/
    • symfony的/
    • autoload.php

composer.json文件包括以下内容:

"require": {
    "phpunit/phpunit": "3.7.*",
    "phpunit/phpunit-selenium": ">=1.2"
}

returning.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致命错误:类“返回”在/files/code/php/db/tests/returningTest.php没有发现第8行

我注意到, composer产生的autoload.php文件vendor/autoload.php ,但不知道这是相关的我的问题。

此外,在Stack Overflow上的人一些其他的答案也提到一些有关使用PSR-0的作曲家和namespace中的PHP命令,但我没有使用任何一个获得成功。

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


更新日期:2013年8月14日

我现在已经创建了一个开源项目的PHPUnit骨架 ,以帮助你起床,PHPUnit的测试很容易为你的项目运行。

Answer 1:

那么,在第一。 你需要告诉磁带自动加载机在哪里可以找到一类的PHP文件。 这是由以下的PSR-0标准完成。

最好的办法是使用命名空间。 对于磁带自动加载搜索Acme/Tests/ReturningTest.php文件,当你请求Acme\Tests\ReturningTest类。 有一些伟大的名字空间的教程在那里,只是搜索和阅读。 请注意,命名空间是不是进入了PHP的自动加载的东西,它的东西,可用于自动加载。

作曲家带有一个标准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选项。



Answer 2:

[UPDATE2另一简单的替代方法是使用在autoload-dev在指令composer.json ( 参考 )。 好处是,你不需要维持两个bootstrap.php中(一个用于督促,一个用于开发)只是为了自动加载不同的类。

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

[ 更新 ]沃特·J的答案是更完整。 但雷能帮助谁想要建立在PSR-0自动加载人民tests/文件夹。
PHPUnit的扫描所有文件,这种模式*Test.php 。 所以我们并不需要自动加载他们自己。 但是,我们仍然希望自动加载的其他支持下类tests/例如夹具/存根或一些父类。

一个简单的方法是看如何作曲项目本身是建立PHPUnit的测试。 这其实很简单。 注意以“引导”就行了。

参考: 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('Composer\Test', __DIR__);

上面最后一行是命名空间作曲家\测试下自动加载PHPUnit的测试类。



Answer 3:

这些答案都不是我所期待的。 是PHPUnit的负载测试文件,而不是存根/夹具。 Chaun马云的回答不剪,因为运行vendor/bin/phpunit已经包括了自动加载的,所以没有办法让磁带自动加载机的一个实例它在这一点上叠加推动更多的路径。

我终于发现了这个在文档:

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

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


Answer 4:

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

vendor/bin/phpunit --generate-configuration

(或者只是phpunit --generate-configuration如果PHPUnit的在你的路径设置)。 该选项已经从版本phpunit5向上。

此选项会提示你输入你的引导文件( 供应商/ autoload.php),测试和源目录。 如果你的项目设置与作曲家默认值(见下面的目录结构)的默认选项将是你所需要的。 只要按下回车三次!

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>


Answer 5:

如果你正在使用PHPUnit的7 ,你可以从你的类src/文件夹自动加载在这样的测试:

  1. 确保您的composer.json文件看起来与此类似:

     { "autoload": { "classmap": [ "src/" ] }, "require-dev": { "phpunit/phpunit": "^7" } } 
  2. 应用变化 composer.json运行命令:

     composer install 
  3. 最后,你可以运行测试tests/文件夹:

     ./vendor/bin/phpunit tests/ 


文章来源: Autoloading classes in PHPUnit using Composer and autoload.php