itsource

Composer 및 autoload.php를 사용하여 PHPUnit에서 수업 자동 로딩

mycopycode 2023. 9. 14. 23:14
반응형

Composer 및 autoload.php를 사용하여 PHPUnit에서 수업 자동 로딩

제가 방금 Composer를 통해 Sebastian Bergmann의 PHP Unit version 3.7.19를 설치하고 유닛 테스트를 하고자 하는 수업을 작성하였습니다.

저는 모든 수업을 사용하지 않고 각 단원 시험에 자동으로 로딩하고 싶습니다.include아니면require내 시험에서 가장 높은 점수를 받았지만 이것은 어렵다는 것을 증명하고 있습니다!

내 디렉토리 구조는 다음과 같습니다(후행/슬래시는 파일이 아닌 디렉토리를 나타냅니다).

* composer.json
* composer.lock
* composer.phar
* lib/
    * returning.php
* tests/
    * returningTest.php
* vendor/
    * bin/
        * phpunit
    * composer/
    * phpunit/
    * symfony/
    * autoload.php

나의 composer.json 파일은 다음과 같습니다.

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

돌아오는.php 클래스 파일은 다음을 포함합니다.

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

반환되는 Test.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'을 찾을 수 없습니다.

나는 그것을 알아챘다.composer된을 autoload.php줄을 지어 들어오다vendor/autoload.php이게 내 문제와 관련이 있는지는 잘 모르겠어요

또한 Stack Overflow에 대한 다른 답변에서 사람들은 PSR-0을 작곡가에서 사용하는 것에 대해 언급했습니다.namespace명령어는 PHP로 되어 있지만 둘 다 성공적으로 사용하지 못했습니다.

◦! 걱정 없이 그냥 객체할 수 .include아니면require.


업데이트: 2013년 8월 14일

저는 이제 프로젝트를 위해 PHPUnit 테스트를 쉽게 시작하고 실행할 수 있도록 PHPnit 스켈레톤이라는 오픈 소스 프로젝트를 만들었습니다.

처음에는.당신은 오토로더에게 클래스의 php 파일을 어디서 찾을 수 있는지 알려줘야 합니다.이는 PSR-0 표준을 따르는 것으로 이루어집니다.

가장 좋은 방법은 네임스페이스를 사용하는 것입니다.합니다를 합니다.Acme/Tests/ReturningTest.php이 a했을 a때일를a일때une을d이a를Acme\Tests\ReturningTest클래스. 훌륭한 네임스페이스 튜토리얼이 있습니다. 검색하고 읽어보세요.네임스페이스는 오토로딩을 위해 PHP에 들어온 것이 아니라 오토로딩에 사용할 수 있는 것임을 유의하시기 바랍니다.

PSR-0 와 됩니다 는 됩니다 )와 함께 됩니다.vendor/autoload.php자동 로더에 파일을 검색하도록 지시하는 경우lib디렉토리 입니다.그러면 사용할 때.ReturningTest그것은 찾을 것입니다/lib/ReturningTest.php.

이것을 당신의 것에 추가합니다.composer.json:

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

자세한 내용은 설명서에서 확인할 수 있습니다.

이제 오토로더는 테스트를 실행하기 전에 실행할 파일인 부트스트랩 파일이 있다는 것을 PHP 유닛에 알려주어야 하는 클래스를 찾을 수 있습니다.사용할 수 있습니다.--bootstrap부트스트랩 파일의 위치를 지정하는 옵션:

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

그러나 PHP 장치 구성 파일을 사용하는 것이 좋습니다.

<!-- /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선택.

[업데이트2] 또 다른 간단한 대안 접근법은autoload-dev의 지시composer.json(참조).다른 클래스를 자동으로 로드하기 위해 bootstrap.php 2개(prod용, dev용)를 유지할 필요가 없다는 장점이 있습니다.

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

[업데이트] Water J의 답변이 더 완성되었습니다.하지만 제 것은 PSR-0 오토로딩을 설치하려는 사람들을 도울 수 있습니다.tests/폴더.
은 Pphunit이을진든다을sp 패턴으로 .*Test.php으로 로드할. 그래서 우리는 그것들을 우리 스스로 자동으로 로드할 필요가 없습니다.하지만 우리는 여전히 아래에 있는 다른 지원 수업들을 자동으로 로드하기를 원합니다.tests/고정 장치/클래식 또는 일부 부모 클래스와 같은.

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__);

위의 마지막 줄은 namespace Composer 아래에 있는 phpunit 테스트 클래스를 자동으로 로드하는 것입니다.\테스트.

그 어떤 대답도 제가 찾던 것이 아니었습니다.예, PHP는 테스트 파일을 로드하지만 스터브/고정 장치는 로드하지 않습니다.Ma의 은 Chaun Ma를 운영하고 있기 않습니다.vendor/bin/phpunit이미 자동 로드가 포함되어 있기 때문에 해당 시점에서 자동 로드의 인스턴스가 스택으로 더 많은 경로를 푸시할 수 있는 방법은 없습니다.

저는 결국 문서에서 이 내용을 발견했습니다.

여러 디렉토리에서 동일한 접두사를 검색해야 할 경우 다음과 같이 배열로 지정할 수 있습니다.

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

자동 로딩 및 부트스탭으로 php유닛을 설정하는 정말 간단한 방법이 있습니다.phpunit's 사용--generate-configuration당신의 를 만들기 위한 옵션phpunit.xml 초 안에 구성할 수 있습니다.

vendor/bin/phpunit --generate-configuration

(아니면 그냥)phpunit --generate-configurationPATH)에 pphunit이 설정되어 있는 경우.이 옵션은 버전 phpunit5 이상부터 사용할 수 있습니다.

이 옵션을 선택하면 부트스트랩 파일(vendor/autoad.php), 테스트 및 소스 디렉토리를 입력하라는 메시지가 표시됩니다.프로젝트가 Composer 기본값(디렉토리 구조 아래 참조)으로 설정되어 있으면 기본 옵션만 있으면 됩니다.RETURN을 3번만 누르면 됩니다.

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

기본 phpunit.xml이 제공되는데, 이는 사용하기 좋습니다.기능을 할 수 든수을다수할예론을해(다예수u:할e론yol을tf을esecolors="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>

PHP Nit 7을 사용하고 있다면 수업을 할 수 있습니다.src/다음과 같은 테스트에서 자동 로드할 폴더:

  1. 를 합니다.composer.json파일은 다음과 유사합니다.

    {
        "autoload": {
            "classmap": [
                "src/"
            ]
        },
        "require-dev": {
            "phpunit/phpunit": "^7"
        }
    }
    
  2. 변경사항을 적용하려면composer.json 명령run령:

    composer install
    
  3. 마지막으로 테스트를 실행할 수 있습니다.tests/폴더:

    ./vendor/bin/phpunit tests/
    

언급URL : https://stackoverflow.com/questions/15710410/autoloading-classes-in-phpunit-using-composer-and-autoload-php

반응형