【问题标题】:Set SQLite as database for unit testing in Laravel 5.1在 Laravel 5.1 中将 SQLite 设置为用于单元测试的数据库
【发布时间】:2015-09-16 21:29:45
【问题描述】:

我正在尝试在 Laravel 5.1 中设置单元测试。在documentation 之后我看到了这个:

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'   => '',
],
*/

我们可能会使用这个 :)

有没有办法为所有测试全局设置这个?我需要在每个测试用例中设置连接吗?

任何帮助表示赞赏。

【问题讨论】:

    标签: php unit-testing laravel laravel-5


    【解决方案1】:

    其实很简单。

    在您的 storage/ 文件夹上创建一个测试数据库,名称为 database.sqlite,或者如果您想要其他名称或其他位置,您必须更改 config/database.php 文件上的配置,这些是默认配置:

    'sqlite' => [
        'driver'   => 'sqlite',
        'database' => storage_path('database.sqlite'),
        'prefix'   => '',
    ],
    

    您有两个选择,要么编辑 .env,要么只指定要运行迁移的数据库的名称:

    php artisan migrate --database=sqlite
    

    如果您更喜欢编辑 .env 文件,那么我们必须添加一个新变量:

    DB_CONNECTION=sqlite
    

    这是因为当.env 文件中没有这个变量时,Laravel 默认使用 MySQL:

    //config/database.php file
    'default' => env('DB_CONNECTION', 'mysql'),
    

    现在我们的应用程序指向我们的 sqlite 数据库,我们现在可以运行我们的迁移和播种。之后,如果您只想继续运行 MySQL,请从 .env 文件中删除 DB_CONNECTION=sqlite

    现在您已经在测试数据库上进行了迁移,最后一步就是指定您的 SQLite 作为测试的默认数据库。

    在您的根文件夹中有一个phpunit.xml 文件,打开它并在<php> 节点下创建一个新变量:

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

    现在您的应用程序正在使用 MySQL,而 phpunit 正在使用 SQLite。

    记住,如果您更改 .env 以将其更改回您的默认数据库;

    PS

    在运行迁移时要小心,如果您在迁移本身上指定了一个连接,它将尝试在该连接上运行它。

    <?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');
        }
    }
    

    无论您在.env 文件或迁移命令中指定什么,此迁移都将始终在连接管理上运行

    【讨论】:

    • 很高兴能帮到你。
    • sudo apt-get install php5-sqlite之后工作
    • @Ryu_hayabusa 如果您没有 sqlite PDO 驱动程序,那么是的,您必须先安装它
    【解决方案2】:

    我有一些不同的解决方案。我正在使用内存中的 sqlite 数据库。

    首先我更改默认值,然后在config中添加到database.php的新连接

    'default' => env('DB_CONNECTION', 'mysql'),
    
    ...
    
    'testing' => [
        'driver' => 'sqlite',
        'database' => ':memory:',
        'prefix' => '',
    ],
    

    然后我将以下行添加到 phpunit.xml

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

    我保持 .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>
    

    【讨论】:

    • 我一生都无法理解为什么这对我不起作用。我做了完全相同的事情,但测试仍在针对我的本地数据库运行。尝试php artisan config:clear 也没有任何乐趣
    • 嗨史蒂文,我已将整个 phpunit.xml 添加到答案中,也许这将有助于了解它为什么不起作用
    • 谢谢。我发现创建.env.testing 文件是唯一可行的方法。
    • 测试时不要在内存中使用sqlite!我使用黄昏进行测试,因为它在不同的进程中运行,黄昏的数据库与您的网站使用的数据库不同!请记住这一点。
    猜你喜欢
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2018-04-11
    • 2021-03-08
    相关资源
    最近更新 更多