当前位置: 首页 > 知识库问答 >
问题:

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

董高洁
2023-03-14

我刚刚通过Composer安装了塞巴斯蒂安·伯格曼(Sebastian Bergmann)的PHPUnit版本3.7.19,并编写了一个我想进行单元测试的类。

我想让我的所有类自动加载到每个单元测试中,而不必在测试的顶部使用includerequire,但事实证明这很困难!

这就是我的目录结构(尾随/斜杠表示目录,而不是文件):

  • composer.json
  • returningTest.php
  • bin/
    • phpUnit

    我的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致命错误:在第8行的/files/code/PHP/db/tests/returningTest.PHP中找不到类“Returning”

    我注意到作曲家供应商/autoload.php中生成了一个autoload.php文件,但不确定这是否与我的问题相关。

    另外,在其他一些关于堆栈溢出的回答中,人们提到了在composer中使用PSR-0和在PHP中使用namespace命令,但我没有成功地使用这两个命令。

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

    更新日期:2013年8月14日

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

共有3个答案

翟学文
2023-03-14

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

我最终在文档中发现了这一点:

如果需要在多个目录中搜索同一前缀,可以将它们指定为数组,如下所示:

{
    "autoload": {
        "psr-0": { "Monolog\\": ["src/", "lib/"] }
    }
}
曾嘉福
2023-03-14

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

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

[更新]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('Composer\Test', __DIR__);

上面的最后一行是自动加载命名空间Composer\Test下的phpUnit测试类。

柯振濂
2023-03-14

嗯,一开始。您需要告诉自动加载程序在哪里可以找到类的php文件。这是通过遵循PSR-0标准来实现的。

最好的方法是使用名称空间。当您请求Acme\Tests\ReturningTest类时,自动加载程序将搜索Acme/Tests/ReturningTest.php文件。有一些很棒的名称空间教程,只需搜索和阅读即可。请注意,名称空间不是为了自动加载而进入PHP的,而是可以用于自动加载的。

Composer带有一个标准的PSR-0自动加载器(在供应商/autoload.php中)。在您的例子中,您想告诉自动加载程序搜索lib目录中的文件。然后,当您使用返回测试时,它将查找/lib/返回est.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选项输入该目录的路径。

 类似资料:
  • 问题内容: 我刚刚通过Composer安装了Sebastian Bergmann的PHPUnit版本3.7.19,并编写了一个我想进行单元测试的类。 我想将所有类都自动加载到每个单元测试中, 而 不必使用它或将其放在测试的顶部,但这证明很困难! 这是我的目录结构的样子(后跟/斜杠表示目录,而不是文件): composer.json composer.lock composer.phar lib /

  • 这篇文章是对 PHP自动加载功能 的一个总结,内容涉及 PHP自动加载功能 、PHP命名空间、PSR0/PSR4标准 等内容。 一、PHP 自动加载功能 PHP 自动加载功能的由来 在 PHP 开发过程中,如果希望从外部引入一个 Class ,通常会使用 include 和 require 方法,去把定义这个 Class 的文件包含进来。这个在小规模开发的时候,没什么大问题。但在大型的开发项目中,

  • 似乎composer在运行post install命令时无法加载psr-4类。 这是我的composer.json: 包含: 运行输出: 生成自动加载文件Composer脚本\Composer脚本::postInstall 类存在:bool(false) PHP致命错误:在第19行的 /var/www/project/ComposerScript.php中找不到类模块\公共\服务\路由器服务 从a

  • 我遇到了使用作曲家psr-4自动加载功能和PHPUnit的问题。问题发生在我的本地机器以及TravisCI版本上。单元测试无法找到我的类,而普通脚本可以找到。 当然,任何配置都有问题,但我无法找出我做错了什么。提前感谢你的帮助。 这是我的项目文件结构: 公共/ src/ http/ urlhelper。php 小黑 超文本传输协议/ urlhelper.test.php 这是我的作曲家的作品。js

  • Laravel版本5.6 我正试图通过“自动加载”下的文件将一些类添加到我的项目中。 Composer.json 每当我执行时,两个文件都会出现错误,表示找不到文件。 PHP警告:未捕获错误异常:require(C:\laravel projects\project\vendor\composer/./../app/helpers/dbUsers.PHP):无法打开流:C:\laravel pro

  • 我有一个项目结构: 在index.php我创建2个新对象: 我的Test.php 我的App.php 我的自动加载对象在composer.json: 在index.php中成功创建了对象测试,但在创建新应用程序时,出现错误: 致命错误:未捕获错误:在第8行的/home/denis/Coding/xuborxcms/public/index.php中找不到类'Xuborx\Cms\App' 此外,当