Can';一旦我发布了PHP包,就不要使用PHPUnit测试它

Can';一旦我发布了PHP包,就不要使用PHPUnit测试它,php,phpunit,composer-php,autoload,Php,Phpunit,Composer Php,Autoload,我使用PHP5.6创建了一个简单的PHP库。 它包括PHPUnit测试用例,我成功地创建了这个包。 然后我发现我也可以在其他项目中使用composer直接从GitHub安装这些包。我可以在开发阶段独立运行测试。但是一旦我发布了包,我就不能运行测试,因为它没有正确地找到自动加载程序文件 <?xml version="1.0" encoding="UTF-8"?> <phpunit bootstrap="vendor/autoload.php" colors="true"

我使用PHP5.6创建了一个简单的PHP库。 它包括PHPUnit测试用例,我成功地创建了这个包。 然后我发现我也可以在其他项目中使用composer直接从GitHub安装这些包。我可以在开发阶段独立运行测试。但是一旦我发布了包,我就不能运行测试,因为它没有正确地找到自动加载程序文件

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php"
     colors="true"
     processIsolation="false"
     stopOnFailure="false"
     syntaxCheck="false"
     convertErrorsToExceptions="true"
     convertNoticesToExceptions="true"
     convertWarningsToExceptions="true"
     testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader">

<testsuites>
    <testsuite>
        <directory>tests</directory>
    </testsuite>
</testsuites>

测验
我已经在根目录中添加了xml文件。当自动加载文件独立时,其路径是正确的。但一旦安装,目录结构将是不同的

如果我们使用一次
require\u
autoloader文件,问题仍然存在,因为安装后目录结构会发生变化

"repositories": [
    {
        "url": "https://github.com/jerintk/Validator.git",
        "type": "git"
    }
],
问题:

  • 在将包安装到任何框架(laravel/Symfony)或任何其他项目中之后,我们可以测试它吗
  • 最佳做法是什么?使用包的开发人员是否需要测试
  • 如果是,那么有什么解决办法?在这两种环境中是否有其他方法可以自动加载问题

  • 我认为您最好查看其他存储库,看看它是否有效

    对我来说

    cd供应商/phpunit/phpunit&&composer安装&phpunit
    =>工作正常
    cd-doctrine/collections/&&composer安装和phpunit
    =>工作正常

    看来它应该对你有用

    如果您查看他们使用的其他供应商的
    phpunit.xml.dist

    bootstrap=“./tests/Doctrine/tests/TestInit.php”
    (Doctrine)
    bootstrap=“tests/bootstrap.php”
    (phpunit)

    看起来你的文件没什么不同。是否确实从供应商文件夹中的packages目录中运行了
    composer安装

    更新: 我将您的存储库添加为默认Symfony安装的依赖项

    "repositories": [
        {
            "url": "https://github.com/jerintk/Validator.git",
            "type": "git"
        }
    ],
    
    require
    块中:

    “Jthedev/Validators”:“开发主机”

    然后我跑了

    composer更新

    它运行良好。您需要运行composer update并签入新的composer.lock,因为它已过期

    从那里我把你的回购目录光盘化了

    cd供应商/Jthedev/validator

    然后我跑了

    composer安装

    vendor/phpunit/phpunit/phpunit

    得到

    OK(2个测试,2个断言)

    更新二 (因为这太长了,无法发表评论)

    @JTheDev
    composer update
    为laravel项目添加依赖项,但它不会在
    vendor/your project
    目录中创建vendor文件夹。如果composer为每个项目分别安装了所有依赖项,如:

    vendor/
      my-project/
        vendor/
          dependency-A
          dependency-C
      another-library/
        vendor/
          dependency-A
          dependency-B
    
    这将浪费大量的空间和带宽。相反,composer会获取所有依赖项,并将它们安装在单独的文件夹中,它们相互协作,因为composer会使用该项目的
    vendor/autoload.php
    加载它们。您所说的是在
    vendor/your project
    中创建vendor文件夹。这是不正常的-通常您只需要在开发自己时运行测试,但无论如何,您的问题是当您的项目作为另一个项目的依赖项添加时,如何为您的项目运行测试

    为此,您需要在
    供应商/您的项目
    目录中运行composer install,这意味着:

    cd供应商/Jthedev/Validators&composer安装和供应商/phpunit/phpunit/phpunit

    最终更新(希望如此) 从聊天室:

    只有在项目目录中运行composer install时,才会生成自动加载程序。您是正确的,供应商文件夹通常不应该在那里,但如果您想做您正试图做的事情,您需要它。这不是传统。通常,开发人员在项目根文件夹中运行测试,而不是依赖项,但您的问题是“当它是依赖项时,如何运行测试”。答案是您需要在项目文件夹中创建供应商和自动加载文件


    只有在项目文件夹内运行composer install时,测试才会运行。但是,如果不这样做就不能运行测试,这不是问题。

    我认为我的问题需要编辑,否则就不清楚了。当这个包是独立的时,我对它没有任何问题。供应商文件夹位于根文件夹中,phpunit.xml也位于根文件夹中。但当我们将该包安装到框架中时,XML文件将驻留在供应商文件夹的深处。在这种情况下,软件包无法跟踪自动加载器。那是我的问题。如果你克隆我的GitHub回购,它不会导致任何问题。但是当你在另一个软件包中安装它时,你不能测试它。我不知道你的意思。你是说
    cd供应商/yournamespace/yourpackage&&composer安装&phpunit
    作为依赖项添加时不起作用?或者您希望您的软件包测试只需使用
    phpunit
    即可从根文件夹自动运行吗?不,不,对不起,意思不对。假设您正在为packagist开发一个包。如果有人在他们的项目中安装它。那样的话。请记住,包是独立于框架的。像碳、邮枪等。。。无论框架如何,包都应该工作。它正在工作,但不是测试。希望一切都清楚。您可以尝试安装my GitHub repo并运行测试。@JTheDev,如果有人通过Composer从一个只需要您的库的项目根运行
    phpunit
    ,您是否希望您的库的测试运行?没有那么多。我希望至少当他们在供应商文件夹和我的包中运行测试时,测试应该成功。