php - 클래스 - spl_autoload_register__ autoload




Composer 및 autoload.php를 사용하여 PHPUnit에서 클래스 자동로드 (2)

필자는 작곡가를 통해 Sebastian Bergmann이 만든 PHPUnit 버전 3.7.19를 설치했으며 단위 테스트를 원하는 수업을 작성했습니다.

나는 모든 테스트를 내 테스트의 상단에 include 시키거나 require 하지 않고도 각 단위 테스트에 모든 클래스를 자동으로 불러 오도록하고 싶습니다. 그러나 이것은 어렵다고 판명되었습니다!

이것은 내 디렉토리 구조와 같습니다 (후행 / 슬래시는 파일이 아니라 디렉토리를 나타냄).

  • 작곡가 .json
  • 작곡가. 락
  • 작곡가 .phar
  • lib /
    • returning.php
  • 테스트 /
    • returningTest.php
  • 벤더 /
    • 큰 상자/
      • phpunit
    • 작곡가/
    • phpunit /
    • 심포니 /
    • 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 치명적인 오류 : 'Returning'클래스가 /files/code/php/db/tests/returningTest.php의 8 행에 없습니다.

나는 composervendor/autoload.php 에서 autoload.php 파일을 만들었지 만 이것이 내 문제와 관련이 있는지 확신 할 수 없다는 것을 알았다.

또한 스택 오버플로에 대한 다른 답변에서는 작곡가에서 PSR-0 을 사용하고 PHP에서 namespace 명령을 사용하는 방법에 대해 언급했지만 두 가지 중 하나를 사용하지 못했습니다.

도와주세요! 필자는 PHPUnit에서 클래스를 자동로드하고 싶기 때문에 includerequire 에 대해 걱정하지 않고 객체를 생성하는 데 사용할 수 있습니다.

업데이트 : 2013 년 8 월 14 일

필자는 PHPUnit Skeleton 이라는 오픈 소스 프로젝트를 만들어 프로젝트에 대한 PHPUnit 테스트를 쉽게 시작할 수 있도록했습니다.


[ Update2 ] 또 다른 간단한 대안은 composer.json ( reference )에서 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"이있는 행을 주목하십시오.

reference : 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>

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

<?php

/*
* This file is part of Composer.
*
* (c) Nils Adermann <[email protected]>
* Jordi Boggiano <[email protected]>
*
* 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 테스트 클래스를 자동로드하는 것입니다.


음, 처음에는. 오토로더에게 클래스의 PHP 파일을 찾을 위치를 알려줘야합니다. PSR-0 표준을 따르면됩니다.

가장 좋은 방법은 네임 스페이스를 사용하는 것입니다. Autoloader는 Acme\Tests\ReturningTest 클래스를 요청할 때 Acme/Tests/ReturningTest.php 파일을 검색합니다. 밖에 멋진 네임 스페이스 튜토리얼이 있습니다. 검색 및 읽기 만하면됩니다. 네임 스페이스 (namespacing)는 자동 로딩을 위해 PHP로 들어온 것이 아니며 , 자동 로딩에 사용할 수있는 것입니다.

Composer에는 표준 PSR-0 오토로더 ( vendor/autoload.php )가 함께 제공됩니다. 귀하의 경우에는 오토로더에게 lib 디렉토리에있는 파일을 검색하라고 말하고 싶습니다. 그런 다음 ReturningTest 를 사용하면 /lib/ReturningTest.php 가 검색됩니다.

composer.json 에게 이것을 추가하십시오 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 옵션을 사용하여 해당 디렉토리의 경로를 지정해야합니다.