Laravel 5 应用程序始终使用“测试”环境配置

Posted

技术标签:

【中文标题】Laravel 5 应用程序始终使用“测试”环境配置【英文标题】:Laravel 5 app always using 'testing' environment configuration 【发布时间】:2015-02-10 21:06:15 【问题描述】:

我有一个 Laravel 5 应用程序,它有两个环境和两个配置:测试(用于 phpUnit 配置,内存数据库)和本地(我的开发配置)。

即使环境配置为local,应用程序也只会加载resources/config/testing 文件夹中的配置。我可以从APP_ENV 环境变量看到同一个应用程序中的环境,它是local

我是否应该不使用测试配置目录来配置我的测试?

在 Laravel 5 中配置测试环境的更好方法是什么?

【问题讨论】:

请分享您的环境设置代码 我的 .env 文件只包含 APP_ENV=local 之类的基本内容——我下班回家后会复制完整的文件 【参考方案1】:

Laravel 5 不再正确地级联配置文件,因此您的测试配置文件将覆盖您本地配置文件中的任何内容。

现在您不应该为每个环境都有任何子文件夹,而是在根文件夹的 .env 文件中设置配置设置。

此文件未签入到 repo 以确保没有任何敏感内容被签入 repo。您应该为您的应用程序所处的每个环境创建一个单独的 .env 文件。

测试

对于 php 单元(功能),您可以在 phpunit.xml 文件中设置环境变量,例如 ..

<php>
    <env name="APP_ENV" value="testing"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
</php>

对于行为(验收)测试,Laracasts Laravel Behat 扩展允许您创建一个 .env.behat 文件来更改环境变量。

对于 phpspec(单元)测试而言,环境应该无关紧要,因为您可以单独测试各个方法并模拟其他所有方法。

对于 selenium (integration / system / e2e) 测试,环境变量应该来自服务器上的 .env 文件,无论您在哪里进行测试。

【讨论】:

我使用 phpunit 进行集成测试,所以我需要使用单独的数据库。这解决了我的问题,谢谢! 赞成,但也希望看到 Codeception 的解决方案。【参考方案2】:

我刚刚用来在 sqlite 上运行测试的附加点,而主应用程序通常默认为 mysql

向 phpunit.xml 添加类似的内容,正如 craig.michael.morris 所解释的那样:

<env name="DB_DRIVER" value="sqlite"/>

而对 config/database.php 的更改

'default' => env('DB_DRIVER', 'mysql'),

在 config/database.php 的 'sqlite' 部分中

'database' => ':memory:',

【讨论】:

感谢您的回复:在 Laravel 5.1 而不是 DB_DRIVER 上,我不得不像这样使用 DB_CONNECTION&lt;env name="DB_CONNECTION" value="sqlite"/&gt; 我从 config/database.php 文件中获得了这个值。 几天前我自己发现了这一点,然后碰巧看到了你的评论 :) 点个赞!【参考方案3】:

1) 打开配置文件database.php 并在'connections' =&gt; [ 中添加以下内容

'sqlite_testing' => [
    'driver'   => 'sqlite',
    'database' => ':memory:',
    'prefix'   => '',
],

内存中的这个sqlite将用于您的测试

2) 打开.env 文件并确保它具有以下内容:

DB_CONNECTION=mysql

3) 打开phpunit.xml 并在&lt;php&gt; 标签内添加以下内容:

<env name="DB_CONNECTION" value="sqlite_testing"/>

在这里您可以添加所有与测试相关的环境变量

4) 在您的测试中,您是否使用数据库连接使用数据库迁移特性:

use DatabaseMigrations;

有关 DatabaseMigrations 的更多详细信息,请参阅文档https://laravel.com/docs/5.1/testing#resetting-the-database-after-each-test

【讨论】:

以上是关于Laravel 5 应用程序始终使用“测试”环境配置的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 和 Vue.js 刀片测试

在laravel 5.2中,Laravel手动登录始终不匹配

Laravel 5.8 验证 - 始终遵守任何规则

Laravel 5.3 $model->save() 值始终为空,但是批量分配有效

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

通过 Codeception 使用存在规则测试 Laravel 5 路由