les*_*gar 23 php unit-testing laravel laravel-5
我正在尝试在Laravel 5.1中设置单元测试.在文档后面我看到了这个:
Laravel的设计考虑了测试.实际上,开箱即用支持使用PHPUnit进行测试
和
运行测试时,Laravel会自动将配置环境设置为测试.Laravel在测试时自动配置会话和缓存到阵列驱动程序,这意味着在测试时不会保留会话或缓存数据.
太棒了.但是...... 如何在运行测试时告诉Laravel使用SQLite数据库连接?
config/database.php中只有这个注释代码:
/* We might use this connection for unit tests
'sqlite' => [
'driver' => 'sqlite',
'database' => storage_path().'/database.sqlite',
'prefix' => '',
],
*/
Run Code Online (Sandbox Code Playgroud)
我们可能会用这个 :)
有没有办法在全球范围内为所有测试设置?我是否需要在每个测试用例中设置connecton?
任何帮助赞赏.
Fab*_*nes 34
实际上它很简单.
在您的storage/文件夹上创建一个测试数据库,使用该名称,database.sqlite或者如果您想要更改config/database.php文件配置的其他名称或其他位置,这些是默认配置:
'sqlite' => [
'driver' => 'sqlite',
'database' => storage_path('database.sqlite'),
'prefix' => '',
],
Run Code Online (Sandbox Code Playgroud)
您有两个选项,您可以编辑自己,.env也可以只指定要运行迁移的数据库的名称:
php artisan migrate --database=sqlite
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢编辑.env文件,那么我们必须添加一个新变量:
DB_CONNECTION=sqlite
Run Code Online (Sandbox Code Playgroud)
这是因为当.env文件中没有此变量时,Laravel默认使用MySQL :
//config/database.php file
'default' => env('DB_CONNECTION', 'mysql'),
Run Code Online (Sandbox Code Playgroud)
现在我们的应用程序指向我们的sqlite数据库,我们现在可以运行我们的迁移和种子.之后,如果你只是想继续运行MySQL DB_CONNECTION=sqlite从.env文件中删除.
既然您已经在测试数据库上进行了迁移,那么最后一步就是指定SQLite作为测试的默认数据库.
在根文件夹中,您有一个phpunit.xml文件,打开它并在<php>节点下有一个新变量:
<env name="DB_CONNECTION" value="sqlite"/>
Run Code Online (Sandbox Code Playgroud)
现在您的应用程序正在使用MySQL,而phpunit正在使用SQLite.
请记住,如果您将其更改为.env将其更改回默认数据库;
运行迁移时要小心,如果您在迁移本身上指定了连接,它将尝试在该连接上运行它.
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AdminUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('manage')->create('admin_users', function (Blueprint $t) {
$t->increments('id');
$t->string('name');
$t->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('manage')->dropIfExists('admin_users');
}
}
Run Code Online (Sandbox Code Playgroud)
无论您在文件上还是在迁移命令中指定,迁移都将始终在连接管理上运行.env
我有一个不同的解决方案.我在内存中使用sqlite数据库.
首先我更改默认值,然后在config中添加一个新连接到database.php
'default' => env('DB_CONNECTION', 'mysql'),
...
'testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
Run Code Online (Sandbox Code Playgroud)
然后我将以下行添加到phpunit.xml
<env name="DB_CONNECTION" value="testing"/>
Run Code Online (Sandbox Code Playgroud)
我保持.env文件不变.这样数据库连接将默认为'mysql'
这是完整的phpunit.xml以获得更清晰的信息
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false">
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">app/</directory>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="./report/" charset="UTF-8"
yui="true" highlight="false"
lowUpperBound="50" highLowerBound="80"/>
</logging>
<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"/>
<env name="DB_CONNECTION" value="testing"/>
</php>
</phpunit>
Run Code Online (Sandbox Code Playgroud)