【问题标题】:Migrating a database in memory sqlite before a test suite在测试套件之前迁移内存 sqlite 中的数据库
【发布时间】:2016-12-30 12:11:33
【问题描述】:

我有一个用于 laravel 项目的测试套件。现在我使用磁盘文件进行测试。

问题:有没有一种方法可以在启动测试套件之前使用内存数据库并只迁移一次数据库?

明确一点:我只想迁移一次数据库。我将进行超过 100 次测试,并且我只希望执行一次迁移

【问题讨论】:

  • 我相信 OP 的问题是数据库测试很长。部分解决方案是使用内存数据库进行测试。测试运行速度快约 5-20 (YMMV) 倍。此外,在测试代码库中用测试替身替换依赖项会有所帮助。查看PHPUnit test doublesMockery。观看这些视频123
  • 为方便起见,我 pulled the explanations together 介绍了如何为 Laravel / Lumen 建立内存测试并修复 SQLite Cannot add a NOT NULL column with default value NULL 使用 SQLite 进行内存测试。

标签: sqlite laravel testing


【解决方案1】:

在您的 TestCase.php 中(或者在任何其他测试中,如果您只想在该测试中使用内存数据库)您可以覆盖 setUp() 方法

public function setUp()
{
    parent::setUp();

    $this->app['config']->set('database.default', 'testing');
    $this->app['config']->set('database.connections.testing', [
        'driver' => 'sqlite',
        'database' => ':memory:',
        'prefix' => ''
    ]);
}

您也可以在测试类正文中使用Illuminate\Foundation\Testing\DatabaseMigrations。在这种情况下,php artisan migrate:refresh 将在每次测试之前被调用

<?php

use Illuminate\Foundation\Testing\DatabaseMigrations;

class ExampleTest extends TestCase
{
    use DatabaseMigrations;

    // ...
    // test cases
    // ...
}

【讨论】:

  • 我只想在所有测试套件之前调用一次工匠迁移方法。否则只要迁移 200 次,内存数据库就没有任何改进。
  • PHPUnit 中有一个静态方法setUpBeforeClass()。你可以在那里打电话给Artisan::call('migrate:refresh')。但是,这将在每个测试用例之前调用,因此在 ExampleTest.php 一个 'AnotherExampleTest.php` 中,您仍然会有新的数据库。
  • 我只想迁移一次,在测试套件之前!否则我可以使用 @before 或将 id 添加到 setUp 方法
  • 除了您描述的一些技巧之外,没有其他选择可以做到这一点,因为测试被设计为独立的,不应依赖其他测试插入的数据。
  • 感谢 Skysplit,但 @user237329 试图避免在每个测试中迁移,而不是这样做。使用 :memory: 时我有同样的问题并且没有任何信息。
猜你喜欢
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多