测试您的数据库
测试类
为了利用 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);