这是这段时间以来结合 PHPunit 文档和大牛们的讲解,想记录下自己学习到的知识,未来参考补充,完善学到的东西

我们一般使用单测对公司业务里的代码进行测试,他会帮忙找到你的一个个小小的思考不够全面的地方。(虽然大牛说过开发可以先写单测再来写实现的代码,然而现在的我感觉离那个还是有好多距离来着)

  stub(桩件):

    “将对象替换为(可选地)返回配置好的返回值的测试替身的实践方法称为上桩(stubbing)”——这是官方文档给出的上桩解释

  也许这个形容有点抽象来着,大概的表达了这么个意思:比如说你有一个方法,依赖了数据库查询,当数据库一切正常时,这个单元测试是OK的,但是当数据库挂掉的时候,这个单测就会挂掉。这就不符合咱们 

单测的一些意义了,单测应该是纯净的,只验证你的逻辑这些,所以呢,我们就需要把这些mock掉,怎么mock呢?就是你可以自定义一个数据库的返回,比如刚才说的我需要数据库的某个字段返回1的时候,单测就能成功,

这时候我们不能完全依赖数据库,万一被别人改了怎么办?我就自己定义这个字段返回1;以后就算网络不通,这个字段在这里都会返回1,是一个定义死了数据,这样就等于把数据库查询给mock了

然后就可以开始愉悦了······················

在这个过程中我遇到了这些拦路虎:

1.如何mock

2.怎么把mock的对象传进去

解决方法呢?

1.用桩件mock 然后在指定返回(详情见代码呀)

2.可以给这个被测试的类构造一个public 属性的参数,再在construct里面实例化这个被mock的类,再将mock传入这个参数里面这个参数

    

====前提

    我想测试的是这样一个方法:switchClothes($username)  ----通过名字查询数据库,性别是1的,就返回裤子,是0的,就返回裙子;

<?php
Class Switch{ public $server;
       public function __construct() {

           $this->srv=new database();
           }

           public function switchClothes($username){ 
         $gender=$this->server->find("id=$username");
         if($gender==0){           return "裙子";
        }else{
  
         return "裤子";
        }
      }
    }  

    查询数据库我封装了一个Database类里面的: find()

====开始写测试

首先我需要测试的是switchClothes这个类,可是在这个类里我需要去通过实例化database这个类用select方法,查询数据库再来得到我到底是要裤子还是裙子。所以,,真的是太麻烦了,我只是单纯的想测测这个方法的逻辑好么,万一数据库挂了,万一这个username不存在,我难道还要专门去数据库创造这样一条数据么,太麻烦了也不够好。万一需要测试包含更新数据的方法,难道还要真的修改数据么?

stub就华丽丽降临了。妈妈再也不用担心我要去操作数据库,再也不担心接口不通神马的了。

    

    我可以对这个类进行上桩。说通俗点,我觉得就是对这个类进行了一个模拟,做了一个假的database类;

    如上如  A=switchClothes  B=database类  D=数据库   C=stub 的那个类

    本来应该是A调用B,B查询数据库的.

    但是C的存在就走了红色那条线,C不会去查数据库,C是被我掌控的,我可以指定里面的find()方法返回1或者0 至少在A看来它和B一样,反正会给我返回个0或者1来的。这就等于C 将A与B,D这个体系隔绝了开来,减少了耦合;

    然后,就可以开始构造我需要的C了。

    

<?php
use PHPUnit\Framework\TestCase; class StubTest extends TestCase
{ public function testStub()
{
// 为database类建立桩件。
$stub = $this->getMockBuilder("database")//类名
->setMethods(array('find')) //可以是多个方法
->getMock(); // 配置桩件。
$stub->method('find')//想要设置返回值的方法
->willReturn(0);//设置返回值
     $ser=new Switch();
     $ser->server=$stub; //将桩件赋值给server
     $ser->switchClother("1"); //调用被测试的方法
       // 现在调用将返回 '裙子'。

     $this->assertEquals('裙子', $stub->find()); } } ?>

这就是C了。

单测的时候,走红色那条路就行了。

all

   

    

   

    

  

  

  

最新文章

  1. Redis学习-基础环境介绍(二)
  2. Redis配置文件参数说明
  3. Net分布式系统之五:C#使用Redis集群缓存
  4. Socket编程基础——面向连接TCP
  5. 使用pt-stalk分析MySQL的性能波动 (转)
  6. JS——时间日期控件
  7. 开发基于Handoff的App(Swift)
  8. 【freemaker】之循环,判断,对象取值
  9. windows 开机启动(为了关闭虚拟机的那么多开机进程)
  10. asp.net 中excel 导入数据库
  11. SQL Server中的sysobjects
  12. Linux系统管理员不可不知的命令:sudo
  13. Word 2016插入公式快捷键
  14. 12C CLONE PDB and config service_listener
  15. Python2中while 1比while True更快
  16. CSS可见区域全局居中
  17. centos6下redis cluster集群部署过程
  18. 触摸屏 adb调试
  19. jdango 部署之nginx+uwsgi
  20. Multi-target tracking by Lagrangian relaxation to min-cost network flow

热门文章

  1. Atitit 电子商务订单号码算法(java c# php js 微信
  2. MVC利用URLRoute实现伪静态
  3. Visual-Studio-2015-Cheat-Sheet Visual Studio 2015 快捷键列表
  4. KendoUI系列:Window
  5. java中并不是任意多个接口都可以实现多实现
  6. Deep learning:四十四(Pylearn2中的Quick-start例子)
  7. Spring MVC异常处理详解
  8. 最简明的JavaScript闭包解释
  9. Windows Azure Virtual Network (6) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (1)
  10. js基础篇——call/apply、arguments、undefined/null