Laravel:运行phpunit测试后删除数据库表

时间:2018-09-03 18:12:55

标签: php mysql laravel phpunit phpunit-testing

每次运行测试时,我的所有数据库表(迁移表除外)都将被删除,因此我必须再次运行迁移。例如,如果我有以下表格:

migrations
users
tableA
tableB

运行后:

  

phpunit --filter user_can_view_a_record ViewRecordTest   tests / Feature / ViewRecordTest.php

我的表被删除了,最后只剩下了迁移表。

我将MySQL用作数据库,并且根据我设置的配置,测试正在内存中运行:

database.php

'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            //'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'database' => ':memory:',
            'prefix' => '',
        ],

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
            'sticky' => true
        ],
]

phpunit.xml

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>

        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <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="sqlite" />
        <env name="DB_DATABASE" value=":memory:" />
    </php>
</phpunit>

谢谢

3 个答案:

答案 0 :(得分:1)

如果您使用的是phpStorm,请提供测试解决方案。

文件>>设置>>文件和框架>>测试框架。

在根文件夹中将默认配置文件设置为phpunit.xml

答案 1 :(得分:1)

Michael Ameyaw 的解决方案在PHPStorm中对我来说效果很好!谢谢。
我想提一下,这也可能是缓存问题,所以请尝试以下操作:

php artisan config:clear

答案 2 :(得分:-1)

通常,您应该具有与登台环境相同的表结构来分离数据库。这是单元测试的正常行为(我的意思是删除表)。 测试的典型流程是(对于每个测试执行):

  1. 删除所有表。
  2. 运行所有迁移(创建表,更改表等)。
  3. 装载夹具
  4. 在新数据库上执行测试。

想象一下一种情况,如果phpunit不删除所有数据,则其中一个测试会更改用户表中的数据(更改电子邮件或名字等),下一个测试将使用不正确的数据(由另一个测试更改)。 您可以检查laravel main documentation以获得更多详细信息。