发布后无法使用 PHPUnit 测试 PHP 包
Can't test the PHP package using PHPUnit, once I publish it
我使用 PHP 5.6 创建了一个简单的 PHP 库。
它包括 PHP 单元测试用例,我成功地创建了包。
然后我发现我也可以在其他项目中使用 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_once
自动加载器文件,问题仍然存在,因为安装后目录结构发生变化。
问题:
- 我们可以在将包安装到任何框架 (laravel/Symfony) 或任何其他项目中后对其进行测试吗?
- 最佳做法是什么?使用该包的开发者是否需要测试?
- 如果是,那么有什么解决办法吗?是否有任何其他方法可以在两种环境中自动加载问题?
我会说你最好看看其他存储库,看看它是否有效。
对我来说
cd vendor/phpunit/phpunit && composer install && phpunit
=> 有效
cd doctrine/collections/ && composer install && phpunit
=> 有效
看来它应该适合你。
如果您查看他们使用的其他供应商的 phpunit.xml.dist
:
bootstrap="./tests/Doctrine/Tests/TestInit.php"
(学说)
bootstrap="tests/bootstrap.php"
(phpunit)
看起来你的文件并没有太大不同。您确定 运行 composer install
来自 vendor 文件夹内的 packages 目录吗?
更新:
我将你的存储库添加为默认 Symfony 安装的依赖项。
"repositories": [
{
"url": "https://github.com/jerintk/Validator.git",
"type": "git"
}
],
并且在 require
块中:
"Jthedev/Validators": "dev-master"
然后我运行
composer update
它运行 很好。您需要 运行 作曲家更新并签入新的 composer.lock,因为它已经过时了。
从那里我进入了你的 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
它会浪费很多 space 和带宽。相反,composer 获取所有依赖项并将它们安装在单独的文件夹中,并且它们相互协作,因为 composer 使用 vendor/autoload.php
为该项目 加载它们。您所说的是在 vendor/your-project
中创建 vendor 文件夹。这是不正常的 - 通常你只需要 运行 开发自己的测试,但无论如何你的问题是关于如何 运行 当你的项目被添加为另一个项目的依赖项时你的测试。
为此,您需要 运行 composer install inside vendor/your-project
目录,这意味着:
cd vendor/Jthedev/Validators && composer install && vendor/phpunit/phpunit/phpunit
最终更新(希望如此)
来自聊天:
仅当您 运行 在项目目录中安装 composer 时才会生成自动加载器。你是对的,供应商文件夹通常不应该在那里,但如果你想做你想做的事情,你需要它。这不是传统的。通常开发人员 运行 他们在项目根文件夹中进行测试,而不是依赖项,但您的问题是 "how can I run my tests when it is a dependency"。答案是您需要在项目文件夹中创建供应商和自动加载文件
如果您 运行 composer 安装在项目文件夹中,则测试仅 运行。但是,如果测试不这样做就没有问题 运行。
我使用 PHP 5.6 创建了一个简单的 PHP 库。 它包括 PHP 单元测试用例,我成功地创建了包。 然后我发现我也可以在其他项目中使用 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_once
自动加载器文件,问题仍然存在,因为安装后目录结构发生变化。
问题:
- 我们可以在将包安装到任何框架 (laravel/Symfony) 或任何其他项目中后对其进行测试吗?
- 最佳做法是什么?使用该包的开发者是否需要测试?
- 如果是,那么有什么解决办法吗?是否有任何其他方法可以在两种环境中自动加载问题?
我会说你最好看看其他存储库,看看它是否有效。
对我来说
cd vendor/phpunit/phpunit && composer install && phpunit
=> 有效
cd doctrine/collections/ && composer install && phpunit
=> 有效
看来它应该适合你。
如果您查看他们使用的其他供应商的 phpunit.xml.dist
:
bootstrap="./tests/Doctrine/Tests/TestInit.php"
(学说)
bootstrap="tests/bootstrap.php"
(phpunit)
看起来你的文件并没有太大不同。您确定 运行 composer install
来自 vendor 文件夹内的 packages 目录吗?
更新:
我将你的存储库添加为默认 Symfony 安装的依赖项。
"repositories": [
{
"url": "https://github.com/jerintk/Validator.git",
"type": "git"
}
],
并且在 require
块中:
"Jthedev/Validators": "dev-master"
然后我运行
composer update
它运行 很好。您需要 运行 作曲家更新并签入新的 composer.lock,因为它已经过时了。
从那里我进入了你的 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
它会浪费很多 space 和带宽。相反,composer 获取所有依赖项并将它们安装在单独的文件夹中,并且它们相互协作,因为 composer 使用 vendor/autoload.php
为该项目 加载它们。您所说的是在 vendor/your-project
中创建 vendor 文件夹。这是不正常的 - 通常你只需要 运行 开发自己的测试,但无论如何你的问题是关于如何 运行 当你的项目被添加为另一个项目的依赖项时你的测试。
为此,您需要 运行 composer install inside vendor/your-project
目录,这意味着:
cd vendor/Jthedev/Validators && composer install && vendor/phpunit/phpunit/phpunit
最终更新(希望如此)
来自聊天:
仅当您 运行 在项目目录中安装 composer 时才会生成自动加载器。你是对的,供应商文件夹通常不应该在那里,但如果你想做你想做的事情,你需要它。这不是传统的。通常开发人员 运行 他们在项目根文件夹中进行测试,而不是依赖项,但您的问题是 "how can I run my tests when it is a dependency"。答案是您需要在项目文件夹中创建供应商和自动加载文件
如果您 运行 composer 安装在项目文件夹中,则测试仅 运行。但是,如果测试不这样做就没有问题 运行。