如何正确更改测试环境变量 - Codeception 和 Laravel 5.1
How to properly change testing environment vars - Codeception and Laravel 5.1
我正在尝试使用 sqlite 数据库进行测试,因为我不想触及我的实际数据库:
在我的 unit.suite.yml 文件中:
class_name: UnitTester
modules:
enabled: [Asserts, UnitHelper]
config:
Db:
dsn: 'sqlite:app/tests/_data/testdb.sqlite'
user: ''
password: ''
dump: app/tests/_data/dump.sql
在我的 TestCase.php 文件中,我有一个函数可以重置和迁移数据库并为测试播种:
Artisan::call('migrate:reset');
Artisan::call('migrate');
Artisan::call('db:seed');
我还将 sqlite 设置添加到 app/config/testing/database。php:
<?php
// Codeception testing environment uses SQLITE
return [
'default' => 'sqlite',
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => 'app/tests/_data/testdb.sqlite',
'prefix' => ''
],
]
];
我可以验证 database.php 文件正在被读取,但仍然有一些东西阻止了 sqlite 的使用,我仍然最终使用了我的 REAL 数据库 (MySQL)。我如何强制 Laravel/Codeception 使用我的测试数据库?
所以我受够了,决定做这件骇人听闻的事:
在 .env 中我添加了这个:
DB_DEFAULT=mysql
然后我将我的 sqlite_testing 配置添加到 database.php 文件中,然后像这样更改了默认设置:
'default' => env('DB_DEFAULT', 'mysql'),
最后,我将此添加到 TestCase.php 的开头:
putenv('DB_DEFAULT=sqlite_testing');
我坚持使用它,因为它确实有效,但任何 comment/suggestions 都值得赞赏。我在 laracasts 网站上找到了这个解决方案:
https://laracasts.com/discuss/channels/testing/how-to-specify-a-testing-database-in-laravel-5
长话短说:
APP_ENV=testing php artisan serve
如果你 运行 "php artisan help" 你会看到:
--env[=ENV] The environment the command should run under.
- --env=testing 不再更改 .env 文件。所以这个信息是不完整的。
- 像 config/testing/database.php 这样的文件可以在 Laravel 4.2 上运行,但不能在 Laravel 5
上运行
- PHPUnit 通过 phpunit.xml 设置环境变量,但它不适用于 Codeception。
- Codeception有一个module for Laravel 5,在那里你可以设置environment_file为.env.testing 然后您可以使用此文件进行测试。但是,它不适用于验收测试,因为这些测试会打开浏览器。
在这种情况下,您可以自定义 app.php 并将其添加到 return $app: 之前
if (!empty($argv) && in_array('--env=testing', $argv)) {
$app->loadEnvironmentFrom('.env.testing');
}
然后你可以用"php artisan serve --env=testing"
启动你的服务器
这是一个变通方法,我希望 Laravel 的人能尽快定义执行此操作的正确方法。
更新:这种方式不那么混乱:
APP_ENV=testing php artisan serve
然后:
if (getenv('APP_ENV') === 'testing') {
$app->loadEnvironmentFrom('.env.testing');
}
更新 2:您似乎不需要 5.2 中的上述条件,或者可能根本不需要?
经过一番搜索,我们假设在 phpunit.xml 中包含变量。有一些预先包含的
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
</php>
但是我想使用 .env 文件。所以总有办法:)
您现在需要做的就是使用适当的 env 文件调用应用程序 loadEnvironmentFrom($file)。因为我只需要它进行测试,所以我添加了 .env.testing.example 和 .env.testing(从 git 中排除)。我在 /tests/TestCase.php
中添加了对方法的调用
public function createApplication()
{
$app = require __DIR__.'/../bootstrap/app.php';
//THIS IS IT :)
$app->loadEnvironmentFrom('.env.testing');
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
return $app;
}
我为此目的使用 tests/_bootstrap.php
:
<?php
// This is global bootstrap for autoloading
putenv('MY_ENV_NAME=my_env_valye');
在项目根目录的 codeception.yml 文件(参见文档 https://codeception.com/docs/06-ModulesAndHelpers#Dynamic-Configuration-With-Parameters)中检查参数的值,应该类似于以下内容
params:
- .env.testing
我正在尝试使用 sqlite 数据库进行测试,因为我不想触及我的实际数据库:
在我的 unit.suite.yml 文件中:
class_name: UnitTester
modules:
enabled: [Asserts, UnitHelper]
config:
Db:
dsn: 'sqlite:app/tests/_data/testdb.sqlite'
user: ''
password: ''
dump: app/tests/_data/dump.sql
在我的 TestCase.php 文件中,我有一个函数可以重置和迁移数据库并为测试播种:
Artisan::call('migrate:reset');
Artisan::call('migrate');
Artisan::call('db:seed');
我还将 sqlite 设置添加到 app/config/testing/database。php:
<?php
// Codeception testing environment uses SQLITE
return [
'default' => 'sqlite',
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => 'app/tests/_data/testdb.sqlite',
'prefix' => ''
],
]
];
我可以验证 database.php 文件正在被读取,但仍然有一些东西阻止了 sqlite 的使用,我仍然最终使用了我的 REAL 数据库 (MySQL)。我如何强制 Laravel/Codeception 使用我的测试数据库?
所以我受够了,决定做这件骇人听闻的事:
在 .env 中我添加了这个:
DB_DEFAULT=mysql
然后我将我的 sqlite_testing 配置添加到 database.php 文件中,然后像这样更改了默认设置:
'default' => env('DB_DEFAULT', 'mysql'),
最后,我将此添加到 TestCase.php 的开头:
putenv('DB_DEFAULT=sqlite_testing');
我坚持使用它,因为它确实有效,但任何 comment/suggestions 都值得赞赏。我在 laracasts 网站上找到了这个解决方案:
https://laracasts.com/discuss/channels/testing/how-to-specify-a-testing-database-in-laravel-5
长话短说:
APP_ENV=testing php artisan serve
如果你 运行 "php artisan help" 你会看到:
--env[=ENV] The environment the command should run under.
- --env=testing 不再更改 .env 文件。所以这个信息是不完整的。
- 像 config/testing/database.php 这样的文件可以在 Laravel 4.2 上运行,但不能在 Laravel 5 上运行
- PHPUnit 通过 phpunit.xml 设置环境变量,但它不适用于 Codeception。
- Codeception有一个module for Laravel 5,在那里你可以设置environment_file为.env.testing 然后您可以使用此文件进行测试。但是,它不适用于验收测试,因为这些测试会打开浏览器。
在这种情况下,您可以自定义 app.php 并将其添加到 return $app: 之前
if (!empty($argv) && in_array('--env=testing', $argv)) { $app->loadEnvironmentFrom('.env.testing'); }
然后你可以用"php artisan serve --env=testing"
启动你的服务器这是一个变通方法,我希望 Laravel 的人能尽快定义执行此操作的正确方法。
更新:这种方式不那么混乱:
APP_ENV=testing php artisan serve
然后:
if (getenv('APP_ENV') === 'testing') {
$app->loadEnvironmentFrom('.env.testing');
}
更新 2:您似乎不需要 5.2 中的上述条件,或者可能根本不需要?
经过一番搜索,我们假设在 phpunit.xml 中包含变量。有一些预先包含的
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
</php>
但是我想使用 .env 文件。所以总有办法:)
您现在需要做的就是使用适当的 env 文件调用应用程序 loadEnvironmentFrom($file)。因为我只需要它进行测试,所以我添加了 .env.testing.example 和 .env.testing(从 git 中排除)。我在 /tests/TestCase.php
中添加了对方法的调用public function createApplication()
{
$app = require __DIR__.'/../bootstrap/app.php';
//THIS IS IT :)
$app->loadEnvironmentFrom('.env.testing');
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
return $app;
}
我为此目的使用 tests/_bootstrap.php
:
<?php
// This is global bootstrap for autoloading
putenv('MY_ENV_NAME=my_env_valye');
在项目根目录的 codeception.yml 文件(参见文档 https://codeception.com/docs/06-ModulesAndHelpers#Dynamic-Configuration-With-Parameters)中检查参数的值,应该类似于以下内容
params:
- .env.testing