srlabs / laravel-testing-utilities
Laravel 应用测试的辅助工具
Requires
- php: ^8.0
- illuminate/contracts: ^9.0
- illuminate/database: ^9.0
- illuminate/support: ^9.0
README
本包旨在收集一系列有助于Laravel应用程序开发和维护的实用工具。
要安装此包,请运行
$ composer require srlabs/laravel-testing-utilities
然后,将服务提供者添加到 app/config/app.php
文件中的服务提供者列表
'providers' => [ // ... 'SRLabs\Utilities\UtilitiesServiceProvider' // ... ],
测试助手
此实用工具使得实现Chris Duell在其博客文章Speeding up PHP unit tests 15 times中描述的测试策略变得简单。当运行需要使用数据库持久层的测试时,运行迁移和为每个测试填充数据库可能会花费非常长的时间。Chris建议提前创建一个sqlite数据库文件,并在每个测试之前创建该文件的新副本。
此包提供了一个Artisan命令('utility:testdb'),该命令将运行您的迁移和种子并将它们保存到预定义的sqlite文件。一旦完成,还有一个配套的特质,您可以将它添加到测试中,在运行测试时将预演数据库文件复制到测试数据库位置。
您需要在您的 config/database.php
文件中定义一个sqlite数据库连接。连接名称可以是您想要的任何名称,但如果您没有提供,则包将假定名称为'预演'。
默认 '预演' 连接
$ php artisan utility:testdb
自定义 'sqlite_testing' 连接
$ php artisan utility:testdb sqlite_testing
您还可以指定一个数据库填充器类
$ php artisan utility:testdb sqlite_testing --class="SentinelDatabaseSeeder"
此命令将迁移和填充您指定的sqlite数据库。
当您准备好在测试中使用此新的sqlite文件时,将 TestingDatabase
特质添加到您的测试类中,并按如下方式使用它
use SRLabs\Utilities\Traits\TestingDatabaseTrait; class FooTest extends TestCase { use TestingDatabaseTrait; public function setUp() { parent::setUp(); $this->prepareDatabase('staging', 'testing'); } public function testSomethingIsTrue() { $this->assertTrue(true); } }
在此示例中,“预演”代表预先编译的sqlite文件所表示的数据库连接,“测试”代表将被测试使用的单独的数据库连接。每次调用 setUp()
方法时,测试sqlite文件将被预演sqlite文件替换,有效地将数据库重置为干净的开始点。您可能需要做一些额外的配置,以便让phpunit使用您的“测试”数据库。
(可选) 在运行PHPUnit时自动运行
使用此方法将使 artisan utility:testdb
在运行任何测试之前执行,只有 当有新的迁移更改时。
1. 创建文件 bootstrap/testing.php
<?php define('ARTISAN_PATH', realpath(__DIR__ . '/../artisan')); /* |-------------------------------------------------------------------------- | Check for new migrations and reseed if necessary |-------------------------------------------------------------------------- | */ passthru('(php '.ARTISAN_PATH.' migrate:status --database='.(getenv('DB_CONNECTION') ?: 'testing').' | grep -q "| N |") && php '.ARTISAN_PATH.' utility:testdb'); /* |-------------------------------------------------------------------------- | Include Standard Autoload File |-------------------------------------------------------------------------- | */ require __DIR__ . '/autoload.php';
2. 更新 phpunit.xml
<phpunit ... bootstrap="bootstrap/testing.php" ... > ... <php> ... <!-- Change this to your connection name (if customized) --> <env name="DB_CONNECTION" value="testing"/> </php> </phpunit>