zoukankan      html  css  js  c++  java
  • 项目中初试PHP单元测试

    只能叫初试,前面虽然做了一些PHPUnit与团队所用框架的整合,但在整个团队还没有人可以主动推动这个事情,而作为Leader最重要的一种能力应该是“让正确的事情发生”,所以今天开始着手对现有代码的Model进行单元测试用例和代码的编写。

    Db测试用例选择了MysqlDump工具生成Mysql专用xml格式文件存储,这样对开发人员来说应该是最方便的。生成的文件类似格式如下:

    <?xml version="1.0"?>
    <mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <database name="bbg_mall">
    	<table_structure name="admin">
    		<field Field="id" Type="int(11) unsigned" Null="NO" Key="PRI" Extra="auto_increment"  />
    		<field Field="username" Type="varchar(20)" Null="NO" Key="" Extra=""  />
    		<field Field="password" Type="varchar(32)" Null="NO" Key="" Default="" Extra=""  />
    		<field Field="login_time" Type="int(10)" Null="NO" Key="" Default="0" Extra="" />
    		<field Field="login_num" Type="int(11)" Null="NO" Key="" Default="0" Extra="" />
    		<field Field="pid" Type="smallint(6)" Null="YES" Key="" Default="0" Extra=""  />
    		<key Table="admin" Non_unique="0" Key_name="PRIMARY" Seq_in_index="1" Column_name="id" Collation="A" Cardinality="21" Null="" Index_type="BTREE" Comment="" Index_comment="" />
    		<key Table="admin" Non_unique="1" Key_name="member_id" Seq_in_index="1" Column_name="id" Collation="A" Cardinality="21" Null="" Index_type="BTREE" Comment="" Index_comment="" />
    		<options Name="admin" Engine="InnoDB" Version="10" Row_format="Compact" Rows="21" Avg_row_length="780" Data_length="16384" Max_data_length="0" Index_length="16384" Data_free="0" Auto_increment="45" Create_time="2015-11-20 11:10:32" Collation="utf8_general_ci" Create_options="" Comment="" />
    	</table_structure>
    	<table_data name="admin">
    	<row>
    		<field name="id">1</field>
    		<field name="username">admin</field>
    		<field name="password">324d1907d9ca6733d399b87affe48c74</field>
    		<field name="login_time">1448011176</field>
    		<field name="login_num">1276</field>
    		<field name="pid">0</field>
    	</row>
    	</table_data>
    </database>
    </mysqldump>
    
    
    

    相关命令:

     mysqldump -uroot -p --xml your_db_name admin > test/data/Application/Admin/Model/admin.xml 
    

    测试什么呢?

    无非是增删改查的各种场景,相对于常规框架如TP底层提供的“增删改”,在DbModel中封装过一次后,一般要求能过滤掉异常情况,确保按正常逻辑作用。

    “查”则主要是判断各种复杂的sql查询及数据拼装后,与预期的结果是否相符。

    php这种动态类型语言,最大的问题就是,很适合一个人开发,但一旦到团队环境中,基于数组的各种随机数据结构,是导致开发效率低下和维护成本上升的最大因素。

    单元测试在这种场景下,更多的像是一种证明,告诉团队其他成员我的代码执行后要返回这个格式的结果,我可以证明这一点,具体返回的数据格式,你去找具体的测试用例一看便知。

    测试代码

    <?php
    
    namespace AdminModel;
    
    /**
     * Generated by PHPUnit_SkeletonGenerator on 2016-06-01 at 15:17:36.
     */
    class AdminTest extends TimeCheerTestDatabaseTestCase
    {
    
        /**
         * @var Admin
         */
        protected $object;
    
    /**
         * Sets up the fixture, for example, opens a network connection.
         * This method is called before a test is executed.
         */
        protected function setUp()
        {
            parent::setUp();
            
            $this->object = new Admin;
        }
    
        protected function getDataSet()
        {
            return $this->createMySQLXMLDataSet(TEST_PATH . '/data/Application/Admin/Model/admin.xml');
        }
    
    /**
         * @covers AdminModelAdmin::getList
         * @todo   Implement testGetList().
         */
        public function testGetList()
        {
            $this->assertEquals(1, $this->getConnection()->getRowCount('admin'), "Pre-Condition");
        }
    
    /**
         * @covers AdminModelAdmin::add
         * @todo   Implement testAdd().
         */
        public function testAdd()
        {
            $this->assertFalse($this->object->add([]));
    //TODO 更多条件测试
        }
    
        /**
         * @covers AdminModelAdmin::update
         * @todo   Implement testUpdate().
         */
        public function testUpdate()
        {
            $this->assertFalse($this->object->update([]));
            $result = $this->object->update(['id' => '-2']);
            $this->assertFalse($result);
    //TODO 更多条件测试
        }
    
    /**
         * @covers AdminModelAdmin::del
         * @todo   Implement testDel().
         */
        public function testDel()
        {
            $this->assertTrue($this->object->del(1));
        }
        
        /**
         * @covers AdminModelAdmin::del
         * @todo   Implement testDel().
         */
        public function testDel2()
        {
            $this->assertFalse($this->object->del(0));
        }
    

    测试的效果

    1. 完善每个方法的过滤机制,确保正确的事情发生、不正确的事情不会发生;
    2. 意外的发现DbModel框架底层update方法对执行结果的判断不足的bug,即当mysql未发生实际的数据更新时,sql语句本身还是返回true,但affected_rows为0,作为框架来说,必须能正确处理这种情况。
  • 相关阅读:
    DEDECMS里面DEDE函数解析
    dede数据库类使用方法 $dsql
    DEDE数据库语句 DEDESQL命令批量替换 SQL执行语句
    织梦DedeCms网站更换域名后文章图片路径批量修改
    DSP using MATLAB 示例 Example3.12
    DSP using MATLAB 示例 Example3.11
    DSP using MATLAB 示例 Example3.10
    DSP using MATLAB 示例Example3.9
    DSP using MATLAB 示例Example3.8
    DSP using MATLAB 示例Example3.7
  • 原文地址:https://www.cnblogs.com/x3d/p/5551518.html
Copyright © 2011-2022 走看看