srlabs/laravel-testing-utilities

Laravel 应用测试的辅助工具

v12.0.0 2022-02-09 04:42 UTC

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>