在 laravel 8 中设置单元测试环境

问题描述 投票:0回答:3

所以我目前正在使用 laravel (v8) 框架开发一个更大的 Web 应用程序。显然我有一个开发环境和一个生产环境,很快甚至还有一个临时环境。由于有必要测试我的类(模型、控制器等),我已经编写了一些单元测试。在这样做时,我遇到了一个问题:出于各种原因,我真的不想在实际数据库(甚至不在开发环境上)运行测试,仅举两个主要的原因:

  1. 数据完整性
  2. 当我使用单独的内存数据库进行测试时,它们的运行速度会更快。

所以我的问题是如何设置我的 Laravel 应用程序,以便它使用内存数据库(sqlite)来运行单元测试,并使用常规 mysql 数据库来进行常规应用程序操作?

php database laravel tdd laravel-8
3个回答
2
投票

为 Laravel 测试设置内存 SQLite 数据库

这没有很好的记录,因为我越来越多地发现很多 Laravel 环境/基础设施的东西,而且这些东西特别困难,因为在缓慢的迁移时间之间,测试调试起来很荒谬,并且没有简单的方法来查看是否实际上正在使用内存数据库,找出问题所在以及问题所在是一个艰难而缓慢的过程。

这是我经过一天的尝试和错误后最终确认有效的一组步骤。

  1. 复制

    .env
    文件的内容以创建名为
    .env.testing
    的文件。将
    APP_ENV
    的值更改为
    testing
    ,并删除所有
    DB_
    条目。

  2. 确保您的

    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:"/>
    
  3. 将以下数组添加到

    connections
    中的
    database.php

    'connections' => [
    
       'memory_testing' => [
         'driver' => 'sqlite',
         'database' => ':memory:',
         'prefix' => '',
       ],
    
       ...
    
  4. 最后,运行

    php artisan optimize:clear
    清除缓存。

您的单元和功能测试现在应该使用内存中的 SQLite 数据库,而您的本地测试应该继续使用

.env
文件中配置的数据库。


0
投票

您可以执行以下操作:

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;
    }
}

参考文档:https://www.phplab.info/categories/laravel/how-to-specify-a-separate-database-for-unit-testing-on-laravel-5


0
投票

您可以使用 SQLite 进行测试。只需将以下行添加到项目根目录下的 phpunit.xml 文件中

<PHP>
    ...
    <server name="DB_CONNECTION" value="sqlite"/>
    <server name="DB_DATABASE" value=":memory:"/>
    ...
</php>

当您进行测试时,这将使用您的database.php 文件中的SQLite 连接进行迁移和数据库操作。

普通应用程序将使用您的 MySQL 数据库连接进行调整。

© www.soinside.com 2019 - 2024. All rights reserved.