vierge-noire/cakephp-test-suite-light

基于 Sql 查询的 CakePHP 应用程序测试套件

v3.0 2023-10-09 18:13 UTC

README

为 CakePHP 应用程序提供的快速测试套件

适用于 CakePHP 5.x

composer require --dev vierge-noire/cakephp-test-suite-light "^3.0"

适用于 CakePHP 4.x

composer require --dev vierge-noire/cakephp-test-suite-light "^2.0"

适用于 CakePHP 3.x

composer require --dev vierge-noire/cakephp-test-suite-light "^1.0"

安装

监听器

对于 CakePHP ^4.3 应用程序,不需要额外的监听器。请参阅此处的文档。

CakePHP 4.3 之前

请确保您在您的 phpunit.xml(或 phpunit.xml.dist)配置文件中替换本机 CakePHP 监听器为以下内容,默认位于应用程序根目录

<!-- Setup a listener for fixtures -->
     <listeners>
         <listener class="CakephpTestSuiteLight\FixtureInjector">
             <arguments>
                 <object class="CakephpTestSuiteLight\FixtureManager" />
             </arguments>
         </listener>
     </listeners>

在每个测试之间,该软件包将截断之前测试中使用的所有测试表。

固定数据将在您在 配置 中定义的测试数据库中创建。

重要:您不应将 CakePHP 本机监听器 添加到您的 phpunit.xml 文件。只需要一个监听器,即 安装 部分中描述的监听器。

截断表

在 CakePHP ^4.3 中

在测试用例类中使用 CakephpTestSuiteLight\Fixture\TruncateDirtyTables 特性,以便在每个测试开始之前清理数据库。

CakePHP ^4.3 之前

默认情况下,该软件包将清空所有测试数据库中的脏表。

如果您想忽略特定测试用例的截断,可以使用 CakephpTestSuiteLight\SkipTablesTruncation 特性

如果您想忽略特定的连接,可以在您的 config/app.php 中将 skipInTestSuiteLight 键设置为 true。例如:

In config/app.php
<?php
...
'test_connection_to_be_skipped' => [
    'className' => Connection::class,
    'driver' => Mysql::class,
    'persistent' => false,
    ...
    'skipInTestSuiteLight' => true
],

这可能在您有连接到云中第三方服务器的情况中很有用。

测试生命周期

以下是固定数据工厂固定数据管理器执行的唯一步骤,以及如何禁用它。

截断表

固定数据管理器在每个测试的开始截断脏表。这是唯一执行的操作。

脏表是主键至少增加了一次的表。脏表的检测是通过专用的类进行的 SQL 查询。这些是 TableSniffers,位于软件包的 src/TestSuite/Sniffer 文件夹中。这些是为以下目的提供的:

  • SQLite
  • MySQL
  • Postgres(Postgresql 支持 >= 11。对于较低的 Postgres 版本,需要自定义 Sniffer。)

如果您使用不同的数据库引擎,可以提供自己的。它应该扩展 BaseTableSniffer 类。

然后,在您的 config/app.php 文件中将驱动程序映射到每个相关连接的自定义表 Sniffer。例如:

In config/app.php
<?php
...
'test' => [
    'className' => Connection::class,
    'driver' => Mysql::class,
    'persistent' => false,
    ...
    'tableSniffer' => '\Your\Custom\Table\Sniffer'
],

临时与非临时脏表收集器

当前测试套件的一个优点在于,测试数据库在每个测试之前被清理,而不是之后。这使得开发人员能够在测试数据库中执行查询,并观察特定测试留下的数据库状态。

当前插件通过触发器在专用表中收集脏表。默认情况下,该表是永久的,但可以设置为临时,以便在代码中保持不可见。

为此,在您的测试数据库设置中,将键'dirtyTableCollectorMode'设置为'TEMP'

使用CakePHP测试夹具

仍然可以使用原生CakePHP夹具。为此,您可以按照以下方式加载它们,如这里所述。

统计工具

套件附带一个统计工具。这将存储每个测试的执行时间、测试名称、脏表数量和列表。

要激活它,请在以下方式中将FixtureInjector的第二个参数设置为true。

<!-- Setup a listener for fixtures -->
     <listeners>
         <listener class="CakephpTestSuiteLight\FixtureInjector">
             <arguments>
                 <object class="CakephpTestSuiteLight\FixtureManager" />
                 <boolean>true</boolean>
             </arguments>
         </listener>
     </listeners>

统计信息将在每个测试套件之后存储在tmp/test_suite_light/test_suite_statistics.csv中。

借助您的IDE,您可以轻松排序结果并跟踪慢速测试,以提高其性能。

请注意,统计工具不会在数据库中执行任何查询。它使用在激活与否的情况下都会收集的信息。它对测试的整体速度没有显著影响。

作者

  • Juan Pablo Ramirez
  • Nicolas Masson

支持

如果您需要专业帮助,请联系我们:[email protected]

您喜欢我们的工作吗?ko-fi

许可证

CakephpTestSuiteLight插件在MIT许可证下提供。

版权所有 2020 Juan Pablo Ramirez和Nicolas Masson

许可协议:MIT许可证。文件的分发必须保留上述版权声明。