所以我目前正在使用 laravel (v8) 框架开发一个更大的 Web 应用程序。显然我有一个开发环境和一个生产环境,很快甚至还有一个临时环境。由于有必要测试我的类(模型、控制器等),我已经编写了一些单元测试。在这样做时,我遇到了一个问题:出于各种原因,我真的不想在实际数据库(甚至不在开发环境上)运行测试,仅举两个主要的原因:
所以我的问题是如何设置我的 Laravel 应用程序,以便它使用内存数据库(sqlite)来运行单元测试,并使用常规 mysql 数据库来进行常规应用程序操作?
这没有很好的记录,因为我越来越多地发现很多 Laravel 环境/基础设施的东西,而且这些东西特别困难,因为在缓慢的迁移时间之间,测试调试起来很荒谬,并且没有简单的方法来查看是否实际上正在使用内存数据库,找出问题所在以及问题所在是一个艰难而缓慢的过程。
这是我经过一天的尝试和错误后最终确认有效的一组步骤。
复制
.env
文件的内容以创建名为 .env.testing
的文件。将 APP_ENV
的值更改为 testing
,并删除所有 DB_
条目。
确保您的
phpunit.xml
具有以下行并取消注释它们:
<env name="DB_CONNECTION" value="memory_testing"/>
<end name="DB_DATABASE" value=":memory:"/>
或者如果使用 Laravel 8 及更早版本:
<server name="DB_CONNECTION" value="memory_testing"/>
<server name="DB_DATABASE" value=":memory:"/>
将以下数组添加到
connections
中的 database.php
:
'connections' => [
'memory_testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
...
最后,运行
php artisan optimize:clear
清除缓存。
您的单元和功能测试现在应该使用内存中的 SQLite 数据库,而您的本地测试应该继续使用
.env
文件中配置的数据库。
您可以执行以下操作:
class TestCase extends Illuminate\Foundation\Testing\TestCase
{
public function createApplication()
{
$app = require __DIR__.'/../bootstrap/app.php';
//Load .env.testing environment
$app->loadEnvironmentFrom('.env.testing');
$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
return $app;
}
}
您可以使用 SQLite 进行测试。只需将以下行添加到项目根目录下的 phpunit.xml 文件中
<PHP>
...
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
...
</php>
当您进行测试时,这将使用您的database.php 文件中的SQLite 连接进行迁移和数据库操作。
普通应用程序将使用您的 MySQL 数据库连接进行调整。