来 ! 玩玩PHPUnit的数据库测试 (上)

小编 2026-06-12 阅读:988 评论:0
前言 我一生的文章都会放在这里,我的博客,我希望每一行代码,每一段文字都能帮助你。https://github.com/CrazyCodes/Blog 大家好,我是CrazyCodes,今天我们来聊聊50%(不完全统计,不必纠结比例 ?...

前言

我一生的文章都会放在这里,我的博客,我希望每一行代码,每一段文字都能帮助你。https://github.com/CrazyCodes/Blog

大家好,我是CrazyCodes,今天我们来聊聊50%(不完全统计,不必纠结比例 ?)的程序员都感觉没有啥用的数据库测试。

实际测试是重中之重,正常下来一个需求应当先写测试用例后实现功能代码,如果没有在开发前做测试,那你可以选择写一个错误的断言,使用错误断言来验证代码是否符合预期,而不是根据功能去写测试,这是写测试的一种逆向思维。

啥是数据库测试?

很多人可能玩过单元测试,设定呀,断言呀,等等条件。但单元测试具有局限性,现如今大部分代码与数据库耦合度较高,无法独立进行单元测试,例如要做了登录模块,大概逻辑如下

那可以用单元测试的地方有哪些呢? 1. 对用户名添加正则表达式(或者是规则)进行单元测试 2. 对用户密码添加正则表达式(或者是规则)进行单元测试 但是否发现验证用户是否存在就无法使用单元测试进行预期的判断了?这时候就需要做数据库测试了,数据库测试实际很简单,大概的流程如下

我们不看官方文档的例子,因为那对新人来说很多名词难于理解,如果你准备好了,那接下来,让我们通过实操来初试数据库测试吧!

准备测试数据

在准备数据前,来看看PHPUnit为我们准备的几种测试数据文件的格式。

Flat XML DataSet (平直 XML 数据集)

<?xml version="1.0" ?>
<dataset>
    <user id="1" username="zhangsan" password="12345" created="2019-03-25 17:15:23" />
    <user id="2" username="lisi" password="12345" created="2019-03-25 12:14:20" />
</dataset>

就是如上这样,上述的结构大概意思如下 – user 表名 – username user表内的username字段 – password user表内的pssword字段 – created user表内的created字段 每一个以 /> 结束为一条测试数据

XML DataSet (XML 数据集)

<dataset>
    <table name="user">
        <column>id</column>
        <column>username</column>
        <column>password</column>
        <column>created</column>
        <row>
            <value>1</value>
            <value>zhangsan</value>
            <value>123456</value>
            <value>2019-03-25 17:15:23</value>
        </row>
        <row>
            <value>2</value>
            <value>lisi</value>
            <value>123456</value>
            <value>2019-03-25 17:15:23</value>
        </row>
    </table>
</dataset>

上述XML与第一个XML表达形式不同,但大概是一个意思 – 首先声明了使用哪张表 <table name="user"> – 每行数据的包裹标签为 <row><value> 标签一一对应标签 <column> 就跟SQL语句

UPDATE table_name SET field1=new-value1, field2=new-value2

一样。什么?你需要创造的测试数据太多?一个一个填会不会累死?那下面就是你的福音了

MySQL XML DataSet (MySQL XML 数据集)

Unit 可直接使用MySQL导出的数据集,你可以在MySQL控制台使用命令

mysqldump --xml -t -u [username] --password=[password] [database] > /path/to/file.xml

这是直接导出指定库的所有表数据,如果想指定库你可以这样做

mysqldump --xml -t -u [username] --password=[password] [database] [table1] [table2] > /path/to/file.xml

导出的数据大概如下

<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <database name="testdatabase">
        <table_data name="user">
               <field name="id">1</field>
               <field name="username">zhangsan</field>
               <field name="password">123456</field>
               <field name="created">2019-03-25 17:15:23</field>
        </table_data>
    </database>
</mysqldump>

YAML DataSet (YAML 数据集)

user:
  -
    id: 1
    username: "zhangsan"
    password: "123456"
    created: 2019-03-25 17:15:23
  -
    id: 2
    username: "lisi"
    password:"123456"
    created: 2019-03-25 17:15:23

相信看到这里,我不用解释你也能看懂了。

其他

更多的文件格式请参照 https://phpunit.readthedocs.io/zh_CN/latest/database.html#dataset-datatable 并不是你喜好哪个格式就用哪个,要根据业务来,通过上面的几种方式,我们可以看出,类似于动态的数据,例如字段 created 我们不需要他是一个固定的值,而是根据时间变化,这种情况你只能让

世界上最好的语言 PHP

来帮你了。

 [
                    [
                        'id' => 1,
                        'username' => 'zhangsan',
                        'password' => '123456',
                        'created' => '2019-03-25 17:15:23'
                    ],
                    [
                        'id' => 2,
                        'username' => 'lisi',
                        'password' => '123456',
                        'created' => '2019-03-25 17:15:23'
                    ],
                ],
            ]
        );
    }
}
?>

当然你需要实现一个自定义的数据库测试类,官方提供的这个已经够用了,你也可以随意更改以达到你的测试目的

 $rows) {
            $columns = [];
            if (isset($rows[0])) {
                $columns = array_keys($rows[0]);
            }

            $metaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $columns);
            $table = new PHPUnit_Extensions_Database_DataSet_DefaultTable($metaData);

            foreach ($rows AS $row) {
                $table->addRow($row);
            }
            $this->tables[$tableName] = $table;
        }
    }

    protected function createIterator($reverse = false)
    {
        return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
    }

    public function getTable($tableName)
    {
        if (!isset($this->tables[$tableName])) {
            throw new InvalidArgumentException("$tableName is not a table in the current database.");
        }

        return $this->tables[$tableName];
    }
}
?>

准备验证数据

验证数据与测试数据格式一样。都是官方文档的那几种。例如你希望插入数据库后的结果是

<dataset>
    <user id="1" username="zhangsan" password="12345" created="2019-03-25 17:15:23" />
    <user id="2" username="lisi" password="12345" created="2019-03-25 12:14:20" />
</dataset>

那在执行测试时,unit则会将该xml文件对比数据库中的数据。一样则通过测试。就是这么简单。

致谢

充分掌握上述的格式以及官方文档内的demo,概念等,才能将数据库掌握在自己手中。下一章我会根据上述准备的数据准备一次“实战演习”,我已经帮你开了头,剩下的就看你自己的了。

感谢你看到这里,希望本篇文章可以帮到你。

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表