单个插件测试用例可以使用 plugin:test Artisan 命令执行,后跟插件代码。例如,以下命令将运行在 plugins/acme/demo 目录中找到的测试。
php artisan plugin:test acme.demo如果您已全局安装
phpunit,您也可以从插件目录调用此命令。
测试插件的第一步是在插件的根目录中创建一个名为phpunit.xml的文件。以下是一个名为**/plugins/acme/blog/phpunit.xml**的文件示例,适用于Acme.Blog插件。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
backupGlobals="false"
backupStaticAttributes="false"
bootstrap="../../../modules/system/tests/bootstrap.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
>
<testsuites>
<testsuite name="Plugin Test Suite">
<directory>./tests</directory>
<exclude>./tests/browser</exclude>
</testsuite>
</testsuites>
<php>
<env name="APP_ENV" value="testing" />
<env name="CACHE_DRIVER" value="array" />
<env name="SESSION_DRIVER" value="array" />
<env name="ACTIVE_THEME" value="test" />
<env name="CONVERT_LINE_ENDINGS" value="true" />
<env name="CMS_ROUTE_CACHE" value="true" />
<env name="CMS_TWIG_CACHE" value="false" />
<env name="ENABLE_CSRF" value="false" />
<env name="DB_CONNECTION" value="sqlite" />
<env name="DB_DATABASE" value=":memory:" />
</php>
</phpunit>该 create:test 命令生成一个测试类。第一个参数指定作者和插件名称。第二个参数指定测试类名称,该名称必须以 Test 结尾。
php artisan create:test Acme.Blog UserTest所有测试都应放在 tests 目录中,该目录用于存储测试类。类名应使用 Test 后缀,类命名空间是可选的。测试类应扩展 PluginTestCase 基类,这是一个特殊的类,它会设置存储在内存中的 October CMS 数据库,作为 setUp 方法的一部分。
use Acme\Blog\Models\Post;
class PostTest extends PluginTestCase
{
public function testCreateFirstPost()
{
$post = Post::create(['title' => 'Hi!']);
$this->assertEquals(1, $post->id);
}
}在测试环境中,插件本身以及插件的任何依赖项都会自动注册和启动。这可以更精细地控制测试环境,并防止系统中其他插件干扰事件注册等操作。您可以通过将 autoRegister 属性设置为 false 来禁用当前插件的自动加载。
/**
* @var bool autoRegister feature disabled for this test.
*/
protected $autoRegister = false;您可以使用 loadPlugin 方法手动注册并启动一个插件。在某些情况下,您还需要手动迁移该插件 (参见下文)。
public function setUp(): void
{
parent::setUp();
// Runs register() and boot() methods
$this->loadPlugin('Acme.Blog');
}提供以下注册方法。
| Method Name | Purpose |
|---|---|
| loadAllPlugins() | Loads all plugins found in the system. |
| loadCurrentPlugin() | Loads the current plugin and its dependencies. |
| loadPlugin($code) | Loads a single plugin using its code, eg: Acme.Blog. |
| loadPlugins($codes) | Loads multiple plugins as an array of codes. |
默认情况下,插件测试将自动迁移核心模块、当前插件及其依赖项的数据库表。这相当于在每次测试前运行以下内容。
php artisan october:migrate
php artisan plugin:refresh Acme.Blog
[php artisan plugin:refresh <dependency>, ...]您可以通过在测试类中将 autoMigrate 属性设置为 false 来禁用此功能。这适用于测试不使用数据库的情况。
class PostTest extends PluginTestCase
{
/**
* @var bool autoMigrate feature disabled for this test.
*/
protected $autoMigrate = false;
}您可以在设置测试时,使用 migratePlugin 方法手动迁移插件。 migrateModules 方法也可以用于使系统表可用。
public function setUp(): void
{
parent::setUp();
// Migrate core modules
$this->migrateModules();
// Migrate the blog plugin
$this->migratePlugin('Acme.Blog');
}提供以下迁移方法。
| Method Name | Purpose |
|---|---|
| migrateDatabase() | Migrate the entire database, the same as october:migrate. |
| migrateModules() | Migrate only the core modules. |
| migrateCurrentPlugin() | Migrate the current plugin and its dependencies. |
| migratePlugin($code) | Migrates a specific plugin using its code, eg: Acme.Blog. |
默认情况下,单元测试使用存储在内存中的 SQLite 用于插件测试环境。 你可以在 phpunit.xml 文件中修改此设置。 这里的配置值基于 /config/database.php 配置文件。
<env name="DB_CONNECTION" value="sqlite" />
<env name="DB_DATABASE" value=":memory:" />