我刚才塞巴斯蒂安伯格曼通过作曲家安装PHPUnit的版本3.7.19,并写了一个班,我想单元测试。
我想有自动加载到每个单元测试所有我的班, 而无需使用include
或require
在我的测试的顶部,但这被证明是困难!
这是我的目录结构是什么样子(一个尾随/斜杠表示目录,而不是一个文件):
- composer.json
- composer.lock
- composer.phar
- LIB /
- 测试/
- 供应商/
- 斌/
- 作曲家/
- 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中类这样我就可以使用,而不必担心创建对象include
或require
。
更新日期: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/
文件夹自动加载在这样的测试:
确保您的composer.json
文件看起来与此类似:
{ "autoload": { "classmap": [ "src/" ] }, "require-dev": { "phpunit/phpunit": "^7" } }
要应用在变化 composer.json
运行命令:
composer install
最后,你可以运行测试tests/
文件夹:
./vendor/bin/phpunit tests/
文章来源: Autoloading classes in PHPUnit using Composer and autoload.php