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

Posted

技术标签:

【中文标题】在 laravel 8 中设置单元测试环境【英文标题】:Setting up a unit testing environment in laravel 8 【发布时间】:2021-05-12 09:19:39 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

你可以这样做:

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

出于某种原因,这对我不起作用。除了这个,你还需要设置 ENV_APP 或其他东西吗?

以上是关于在 laravel 8 中设置单元测试环境的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中设置 PHPUnit 测试

如何在 Spring 测试中设置环境变量或系统属性?

在 WAMP 环境中设置 Concerto 自适应测试平台时出错

为啥在测试类中设置的 spring.profiles.active 在实际测试类的环境属性中不可用?

如何从单元测试中更改应用程序的 NSProcessInfo 环境字典?

如何在Jmeter中设置和获取环境变量来测试API