测试您的数据库

测试类

为了利用 CodeIgniter 提供的内置数据库测试工具,您的测试必须扩展 CIUnitTestCase 并使用 DatabaseTestTrait

<?php

namespace App\Database;

use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;

class MyTests extends CIUnitTestCase
{
    use DatabaseTestTrait;

    // ...
}

由于在 setUp()tearDown() 阶段执行的特殊功能,您必须确保在需要使用这些方法时调用父类的方法,否则您将失去此处描述的大部分功能

<?php

namespace App\Database;

use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;

class MyTests extends CIUnitTestCase
{
    use DatabaseTestTrait;

    protected function setUp(): void
    {
        parent::setUp();

        // Do something here....
    }

    protected function tearDown(): void
    {
        parent::tearDown();

        // Do something here....
    }
}

设置测试数据库

运行数据库测试时,您需要提供一个可以在测试期间使用的数据库。框架提供了特定于 CodeIgniter 的工具,而不是使用 PHPUnit 内置的数据库功能。第一步是确保您已在 app/Config/Database.php 中设置了 tests 数据库组。这指定了仅在运行测试时使用的数据库连接,以确保您的其他数据安全。

如果您团队中有多个开发人员,您可能希望将凭据存储在 **.env** 文件中。为此,请编辑该文件以确保以下行存在并包含正确的信息

database.tests.hostname = localhost
database.tests.database = ci4_test
database.tests.username = root
database.tests.password = root
database.tests.DBDriver = MySQLi
database.tests.DBPrefix =
database.tests.port = 3306

迁移和种子

运行测试时,您需要确保数据库具有正确的架构设置,并且每个测试都处于已知状态。您可以使用迁移和种子来设置数据库,方法是在测试中添加几个类属性。

<?php

namespace App\Database;

use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;

class MyTests extends CIUnitTestCase
{
    use DatabaseTestTrait;

    // For Migrations
    protected $migrate     = true;
    protected $migrateOnce = false;
    protected $refresh     = true;
    protected $namespace   = 'Tests\Support';

    // For Seeds
    protected $seedOnce = false;
    protected $seed     = 'TestSeeder';
    protected $basePath = 'path/to/database/files';

    // ...
}

迁移

$migrate

此布尔值确定数据库迁移是否在测试之前运行。默认情况下,数据库始终迁移到由 $namespace 定义的最新可用状态。如果为 false,则迁移永远不会运行。如果您想禁用迁移,请设置为 false

$migrateOnce

此布尔值确定数据库迁移是否只运行一次。如果您想在第一个测试之前运行一次迁移,请设置为 true。如果不存在或为 false,则迁移将在每次测试之前运行。

$refresh

此布尔值确定数据库是否在测试之前完全刷新。如果为 true,则所有迁移都将回滚到版本 0。

$namespace

默认情况下,CodeIgniter 将在 **tests/_support/Database/Migrations** 中查找它应该在测试期间运行的迁移。您可以通过在 $namespace 属性中指定一个新的命名空间来更改此位置。这应该不包括 **Database\Migrations** 子命名空间,而只包括基本命名空间。

重要

如果您将此属性设置为 null,它将从所有可用的命名空间运行迁移,例如 php spark migrate --all

种子

$seed

如果存在且不为空,则指定一个种子文件的名称,该文件用于在测试运行之前使用测试数据填充数据库。

$seedOnce

此布尔值决定数据库播种是否只运行一次。如果您想在第一次测试之前运行一次数据库播种,请设置为 true。如果不存在或为 false,数据库播种将在每次测试之前运行。

$basePath

默认情况下,CodeIgniter 将在 tests/_support/Database/Seeds 中查找它应该在测试期间运行的种子。您可以通过指定 $basePath 属性来更改此目录。这应该不包括 Seeds 目录,而是包含子目录的单个目录的路径。

辅助方法

DatabaseTestTrait 类提供了一些辅助方法来帮助您测试数据库。

更改数据库状态

regressDatabase()

在上述 $refresh 期间调用,如果您需要手动重置数据库,此方法可用。

migrateDatabase()

setUp() 期间调用,如果您需要手动运行迁移,此方法可用。

seed($name)

允许您手动将种子加载到数据库中。唯一的参数是要运行的种子的名称。种子必须存在于 $basePath 中指定的路径内。

hasInDatabase($table, $data)

将新行插入数据库。此行将在当前测试运行后删除。 $data 是一个关联数组,包含要插入表中的数据。

<?php

$data = [
    'email' => '[email protected]',
    'name'  => 'Joe Cool',
];
$this->hasInDatabase('users', $data);

从数据库获取数据

grabFromDatabase($table, $column, $criteria)

返回指定表中 $column 的值,其中行与 $criteria 匹配。如果找到多个行,它只会返回第一个行。

<?php

$username = $this->grabFromDatabase('users', 'username', ['email' => '[email protected]']);

断言

dontSeeInDatabase($table, $criteria)

断言数据库中不存在与 $criteria 中的键值对匹配的记录。

<?php

$criteria = [
    'email'  => '[email protected]',
    'active' => 1,
];
$this->dontSeeInDatabase('users', $criteria);

seeInDatabase($table, $criteria)

断言数据库中存在与 $criteria 中的键值对匹配的记录。

<?php

$criteria = [
    'email'  => '[email protected]',
    'active' => 1,
];
$this->seeInDatabase('users', $criteria);

seeNumRecords($expected, $table, $criteria)

断言数据库中找到与 $criteria 匹配的记录数量。

<?php

$criteria = [
    'active' => 1,
];
$this->seeNumRecords(2, 'users', $criteria);