【问题标题】:Can't test the PHP package using PHPUnit, once I publish it发布后无法使用 PHPUnit 测试 PHP 包
【发布时间】:2017-07-11 01:45:31
【问题描述】:

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

<?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_once自动加载文件,问题仍然存在,因为安装后目录结构发生了变化。

问题:

  1. 我们可以在将包安装到任何框架(laravel/Symfony)或任何其他项目后对其进行测试吗?
  2. 最佳做法是什么?使用该软件包的开发人员是否需要进行测试?
  3. 如果是,那么有什么解决方案可以解决这个问题吗?有没有其他方法可以在两种环境中自动加载问题?

Repo in Github

【问题讨论】:

    标签: php phpunit composer-php autoload


    【解决方案1】:

    我会说你最好看看其他存储库,看看它是否有效。

    对我来说

    cd vendor/phpunit/phpunit &amp;&amp; composer install &amp;&amp; phpunit => 工作
    cd doctrine/collections/ &amp;&amp; composer install &amp;&amp; phpunit => 工作

    看来它应该对你有用。

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

    bootstrap="./tests/Doctrine/Tests/TestInit.php"(教义)
    bootstrap="tests/bootstrap.php"(phpunit)

    看起来您的文件并没有太大的不同。你确定你是从供应商文件夹内的包目录中运行composer install 吗?

    更新:

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

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

    require 块中:

    "Jthedev/Validators": "dev-master"

    然后我跑了

    composer update

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

    从那里我 cd'ed 进入你的 repo 目录。

    cd vendor/Jthedev/Validators

    然后我跑了

    composer install

    vendor/phpunit/phpunit/phpunit

    得到了

    OK (2 tests, 2 assertions)

    更新二

    (因为评论太长了)

    @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/your-project 目录运行composer install,这意味着:

    cd vendor/Jthedev/Validators &amp;&amp; composer install &amp;&amp; vendor/phpunit/phpunit/phpunit

    最终更新(希望如此)

    来自聊天:

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

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

    【讨论】:

    • 我认为我的问题需要修改或不清楚。当它独立时,我对包没有任何问题。供应商文件夹位于根文件夹中,phpunit.xml 也是如此。但是当我们将该包安装到框架中时,XML 文件将驻留在供应商文件夹的深处。在这种情况下,包无法跟踪自动加载器。那是我的问题。如果你克隆我的 GitHub 存储库,它不会导致任何问题。但是当你在另一个包中安装它时,你无法测试它。
    • 我不确定你的意思。您的意思是 cd vendor/yournamespace/yourpackage &amp;&amp; composer install &amp;&amp; phpunit 在添加为依赖项时不起作用?或者您是否希望您的包测试仅使用 phpunit 从根文件夹自动运行?
    • 没有没有。对不起,错误的意思。假设您正在为 packagegist 开发一个包。如果有人在他们的项目中安装它。在这种情况下。请记住,包是独立于框架的。像 carbon、Mailgun 等......不管框架如何,这个包都应该可以工作。它正在工作,但不是测试。希望很清楚。您可以尝试安装我的 GitHub 存储库并运行测试。
    • @JTheDev,如果有人从项目的根目录运行 phpunit,而您的 library's 测试只是通过 Composer 需要您的库,您是否希望运行该测试?
    • 没那么多。我希望测试至少在供应商文件夹和我的包中运行测试时会成功。
    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 2014-10-06
    • 1970-01-01
    • 2017-11-29
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    相关资源
    最近更新 更多