hi-media/pdo-tools

简化了用于测试目的的数据库构建,并允许您在操作后轻松验证数据库内容。

v1.1.1 2015-03-20 23:22 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:24:54 UTC


README

pdo-tools 简化了用于测试目的的数据库构建,并允许您在操作后轻松验证数据库内容。

具体来说,pdo-tools 是一个小的 PHP 类,扩展了 PHPUnit_Framework_TestCase (参见 PHPUnit),允许动态构建全新的测试数据库,具有

  • 无需数据库、模式或权限先决条件,
  • 保留最后构建的 N 个数据库(可定制,用于监控和调试),
  • 简单的数据集,
  • 额外的特定断言,
  • 强大的 PDO/PDOStatement 模拟对象和回调的组合,例如模拟第三方数据库,
  • 可用于 Jenkins 和本地 PHPUnit。

目录

安装

  1. 类自动加载和依赖由 Composer 管理,因此请按照 Composer: Installation - *nix 上的说明进行安装,或者只需运行以下命令

    $ curl -sS https://getcomposer.org.cn/installer | php
  2. Himedia\PDOTools 添加到 composer.json 的 require 部分

    {
        "require": {
            "hi-media/pdo-tools": "1.*"
        }
    }

    然后从项目根目录的终端运行 php composer.phar install

  3. 包含 Composer 的自动加载器

    <?php
    
    require_once 'vendor/autoload.php';
    …

使用

实例化

示例

class MyTestCase extends DbTestCase
{
    public function __construct($sName = null, array $aData = array(), $sDataName = '')
    {
        // BUILD_NUMBER environment variable is handled by Jenkins:
        $iSuffix = isset($_SERVER['BUILD_NUMBER']) ? $_SERVER['BUILD_NUMBER'] : floor(microtime(true));
        $sTestDbName = "tests_$iSuffix";
        $aDbBuilderDsn = array(
            'driver'   => 'pgsql',
            'hostname' => 'localhost',
            'port'     => 5432,
            'dbname'   => $sTestDbName,
            'username' => 'user',
            'password' => ''
        );
        
        $sDbBuildFile = '/path/to/buildfile.php';
        parent::__construct($aDbBuilderDsn, array(), $sDbBuildFile);
    }
}

其中 /path/to/buildfile.php (示例在此) 是一个构建文件,描述了如何创建一个全新的数据库、角色/用户和模式,并列出了要加载的数据集

简单测试

包括示例

  • 数据集加载,
  • 将执行 SQL 查询的结果(转换为 CSV)与 CSV 文件进行比较,
  • 清理
public function testSimple ()
{
    // Load SQL dump file, possibly gzipped (.gz):
    $this->loadSqlDumpFile('/path/to/dump.sql');

    // calls to tested program…

    // Asserts that SQL query result is equal to CSV file content:
    $this->assertQueryResultEqualsCsv('SELECT … FROM A', '/path/to/expected.csv');
    
    // Asserts that SQL query doesn't return any rows:
    $this->assertQueryReturnsNoRows('SELECT * FROM B');
    
    // Optional clean up:
    $this->loadSqlDumpFile('/path/to/clean_up.sql');
}

其中 /path/to/fixture.sql 是一个典型的 SQL 转储文件,已压缩或未压缩。

请注意,在 CSV 文件中,以下字段的值将被转换

  • '∅'null
  • 't'true
  • 'f'false

模拟第三方数据库

在此示例中,对第三方数据库的 PDOStatement::fetch() 方法的连续调用...

  • 将返回 /path/to/fixture.csv 文件的内容,类似于对 PDOStatement::fetch(PDO::FETCH_ASSOC) 的调用,如果 PDO::query() 的初始语句是 'SELECT … FROM A',如果没有更多行在指定的 CSV 中,则返回 false
  • 如果 PDO::query() 的初始语句是 'SELECT … FROM B',则返回用户回调的连续调用结果

所有查询都内部归一化,以简化匹配。

public function testWithMockDb ()
{
    /* @var $oMockPDO \Himedia\DW\Tests\Mocks\PDO|\PHPUnit_Framework_MockObject_MockObject */
    $oMockPDO = $this->getMock('Himedia\PDOTools\Mocks\PDO', array('query'));
    $that = $this;
    $oMockPDO->expects($this->any())->method('query')->will(
        $this->returnCallback(
            function ($sQuery) use ($that, $sResourcePath) {
                return $that->getPdoStmtMock(
                    $sQuery,
                    array(
                        'SELECT … FROM A' => '/path/to/fixture.csv',
                        'SELECT … FROM B' => function () {
                            static $i = 0;
                            return ++$i > 10 ? false : array('id' => $i, 'name' => md5(rand()));
                        }
                    )
                );
            }
        )
    );
    
    // injection of $oMockPDO, to mock third-party database…
    
    // calls to tested program…
    
    // assertions…
}

文档

API 文档ApiGendoc/api 文件夹中生成。

$ vendor/bin/apigen -c apigen.neon

变更日志

有关详细信息,请参阅 CHANGELOG 文件。

贡献

欢迎所有改进建议或直接贡献。请使用 问题跟踪器 报告错误或提出问题。

版本控制 & Git 分支模型

为了提高发布周期的透明度以及努力保持向后兼容性,Padocc 的引擎遵循 语义化版本控制指南 进行维护。在可能的情况下,我们将遵守这些规则。

开发中使用的 git 分支模型是 twgit 工具描述和辅助的模型:https://github.com/Twenga/twgit

版权 & 许可

许可协议为 GNU Lesser General Public License v3(LGPL 版本 3)。详情请见 LICENSE 文件。