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,作为框架来说,必须能正确处理这种情况。
  • 相关阅读:
    二维数组和最大字数组求取 2
    spring冲刺第七天
    spring冲刺第六天
    寻找水王
    spring冲刺第五天
    spring冲刺第四天
    spring冲刺第三天
    spring冲刺第二天
    大道至简读书笔记3
    spring冲刺第一天
  • 原文地址:https://www.cnblogs.com/x3d/p/5551518.html
Copyright © 2011-2022 走看看