czukowski/phpunit-sql

PHPUnit 的 SQL 字符串测试辅助工具

9.0 2020-02-20 05:28 UTC

README

PHPUnit

一个用于测试 SQL 字符串相等性的约束和断言方法,忽略空格。这对于测试查询构建器的结果(尤其是长且复杂的查询)与存储在文件中的格式良好的“期望”查询可能很有用。

这并不能取代验证查询实际完成预期工作的需要。

安装

选择您的版本!版本号遵循主要的 PHPUnit 版本号,因此对于给定的 PHPUnit N.x,安装命令看起来像这样

composer require czukowski/phpunit-sql "~N.0"

用法

在测试用例类中使用 Cz\PHPUnit\SQL\AssertTrait 特性,这将启用比较 SQL 查询相等性的方法,除了空格和终端分号。一个 SQL 查询可以是字符串或可以转换为字符串的对象。SQL 查询的数组也是可接受的,可以用来比较一系列查询。为了比较的目的,只有一个 SQL 查询元素的数组等于该 SQL 查询元素本身,因此不需要每次都记住将参数转换为数组。

  1. assertEqualsSQLQueries 方法将验证两个查询或一系列查询的相等性。

    $this->assertEqualsSQLQueries($expected, $actual);
  2. assertExecutedSQLQueries 方法将验证一个查询或一系列查询是否由数据库抽象层执行。为了能够做到这一点,测试用例类必须实现一个 getDatabaseDriver 方法,该方法返回一个实现 Cz\PHPUnit\SQL\DatabaseDriverInterface 接口的对象。这可以是具有伪造数据库驱动程序的数据库抽象层连接类或其他东西,它被注入到测试的应用程序代码中。

    $this->assertExecutedSQLQueries($expected);

    接口实现可在 Cz\PHPUnit\SQL\DatabaseDriverTrait 中找到,以便轻松包含到自定义实现中。

  3. loadSQLQueries 方法将从文件加载 SQL 查询或一系列查询,并返回查询的数组。通过分号分隔查询时,仅当分隔符之后的查询从下一行开始时才起作用。除此之外,查询内部和它们之间可能有新行和空白行,在加载时不会被删除。默认情况下,该方法将在当前类的文件名命名的子文件夹中查找文件(可能为测试用例)。可以通过覆盖 getLoadFilePath 方法来更改此行为。

    $this->loadSQLQueries($expected);

    断言方法将展平查询的数组,因此可以加载多个文件,而无需进一步处理。

    $this->assertExecutedSQLQueries([
        $this->loadSQLQueries('SelectItems.sql'),
        $this->loadSQLQueries('InsertNewItems.sql'),
        $this->loadSQLQueries('DeleteOldItems.sql'),
    ]);

不符合您的特定需求? 没问题,AssertTrait 非常简单,您可以克隆并调整它以适应您的项目,或者提出一个完全不同的实现。

已知问题

为了比较 SQL 查询,使用了一个相当天真的标记函数将查询字符串转换为数组。当查询中使用了不常见的运算符或 SQL 语法时,它可能无法涵盖一些边缘情况(特别是 DDL 未经过测试),但这应该很容易修复。

许可

此作品在 MIT 许可下发布。有关详细信息,请参阅 LICENSE.md。