我正在尝试开发一个 Laravel Composer 包并在其中运行单元测试。在过去几天阅读了各种过时且相互矛盾的指南和博客文章后,我完全不知道如何解决这个问题。
这是我目前所知道的:
我可以让 Orchestra Test Bench 从给出的示例中进行一些基本测试,但我不太明白发生了什么,文档几乎没有解释任何内容。当涉及到测试我的应用程序的路由时,我无法让任何东西工作。
我不明白Orchestra和Dusk是否可以一起演奏,或者我是否必须在它们之间做出选择。如果是这样,我应该使用哪一个? 如果我应该使用 Laravel Dusk,那么如何从我的包目录中运行它?
我同意:
我不应该从主 Laravel 安装运行测试。测试应全部包含在包内
为了避免在您的应用程序中安装 Laravel 并手动引导它来测试您的包,您可以使用 Orchestral Testbench。
Orchestral 的文档今天相当不错,但如果您想对某些 Eloquent 模型进行单元测试,我无论如何都会给出一个如何使用它的简短示例。
首先,确保您的包有一个
ServiceProvider
类,该类指向您的迁移文件,如 docs 中所述。
然后,将
orchestral/testbench
包引入到您的包中,并在 tests/TestCase.php
中创建一个文件。
文件
TestCase
应执行以下操作:
getPackageProviders
SQLite
在内存中设置
getEnvironmentSetUp
setUp()
这是一个例子:
<?php
namespace MyVendorName\MyPackageName\Tests;
use MyVendorName\MyPackageName\MyServiceProvider;
class TestCase extends \Orchestra\Testbench\TestCase
{
public function setUp(): void
{
parent::setUp();
$this->artisan('migrate', ['--database' => 'testbench'])->run();
}
/**
* add the package provider
*
* @param $app
* @return array
*/
protected function getPackageProviders($app)
{
return [MyServiceProvider::class];
}
/**
* Define environment setup.
*
* @param \Illuminate\Foundation\Application $app
* @return void
*/
protected function getEnvironmentSetUp($app)
{
// Setup default database to use sqlite :memory:
$app['config']->set('database.default', 'testbench');
$app['config']->set('database.connections.testbench', [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
]);
}
}
回答你的第二个问题:Laravel Dusk 与 Orchestral Testbench 配合得很好。与上面类似,您需要模拟数据库来测试您的 Eloquent 包模型,您必须使用 Orchestral 模拟路由和视图,以便使用 Laravel Dusk 进行浏览器测试。
欲了解更多详情,请查看我的博客文章。
这是我在开发包时所做的事情:
1) 创建一个名为
src/tests
的文件夹。
2)在这个文件夹中,我遵循“正常”结构:
注意:Dusk 允许您像真实用户单击链接、填写表单等一样测试您的应用程序。测试应用程序用户界面(即使它使用 JavaScript)真的很酷。因此,如果您的软件包不包含任何接口,您可能不需要 Dusk。
3)所有测试都使用 Laravel 的基本测试套件,因此您需要包含 Dusk 的完整 Laravel 安装(仅当您使用浏览器测试时才需要 Dusk)。
因此,对于单元和功能测试,我扩展了
\Tests\TestCase
。浏览器测试扩展
\Tests\DuskTestCase
。4)现在使用测试路径运行测试:
phpunit /path/to/packages/pascall/icms
或者,对于黄昏:
php artisan dusk /path/to/packages/pascall/icms
(或者您可以
cd /path/to/packages/pascall/icms
然后运行 phpunit
。
我从未使用过 Orchestra,因为我的团队发现此选项更直接、更容易,所以我无法帮助您。
缺点:
我做了其他人说的所有事情,但我的问题没有解决,除非我改变 Laravel 根的
<testsuites>
中的 phpunit.xml
:
<testsuites>
<testsuite name="Unit">
<directory suffix="Test.php">packages\YourVendorName\YourPackageName</directory>
</testsuite>
</testsuites>
将此行代码添加到 phpunit.xml 并支持所有包
<testsuite name="Unit">
<directory>packages/*/src/tests/Unit</directory>
</testsuite>
<testsuite name="Feature">
<directory>packages/*/src/tests/Feature</directory>
</testsuite>