初识 PHPunit stub 模拟返回数据
这是这段时间以来结合 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
初识 PHPunit stub 模拟返回数据的更多相关文章
- vue项目中使用mockjs模拟接口返回数据
Mock.js 是一个模拟数据生成器,利用它,可以拦截ajax请求,直接模拟返回数据,这样前后端只要约定好数据格式,前端就不需要依赖后端的接口,可以直接使用模拟的数据了. 网上介绍mock的教程也较多 ...
- Fiddler使用 断点 模拟返回 AutoResponder Mock 模拟数据 相关学习记录
断点 测试中有时需要改变发出去的请求信息,需要用到打断点的方法.断点包含两种方式: before response:在request请求的时候,未到达服务器之前,一般用来修改请求参数 after re ...
- 10-Mock模拟接口返回数据
1.安装mock 方法一:pip安装 命令行直接输入:pip install mock 方法二:官网下载mock安装包安装 下载安装包后,解压,命令行进入解压目录,执行python setup.py ...
- mock模拟接口返回数据
mock,是python中模拟接口返回数据 1.安装 pip install mock import unittest from mock import Mock def add(a,b): pass ...
- MOOC(5)- mock模拟返回响应数据
1.安装mock 1)pip install mock 2)或者下载离线安装包 2.mock散装使用 import unittest from mock import mock from day_20 ...
- iOS项目之模拟请求数据
如何在iOS开发中更好的做假数据? 当工期比较紧的时候,项目开发中会经常出现移动端等待后端接口数据的情形,不但耽误项目进度,更让人有种无奈的绝望.所以在开发中,我们常常自己做些假数据,以方便开发和UI ...
- App开发:模拟服务器数据接口 - MockApi
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...
- java URL实现调用其他系统发送报文并获取返回数据
模拟本系统通过Url方式发送报文到目标服务器,并获取返回数据:(实现类) import java.io.BufferedOutputStream; import java.io.BufferedRea ...
- Java抓取网页数据(原网页+Javascript返回数据)
有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同! 本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据:(2)抓取网页Javascript返回的数 ...
随机推荐
- paip.禁用IKAnalyzer 的默认词库.仅仅使用自定义词库.
paip.禁用IKAnalyzer 的默认词库.仅仅使用自定义词库. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...
- struts1的一些基本用法和操作
入职两周了,项目是用struts1+ibatis框架搭建的,数据库是oracle,其他还行,关键是struts1之前没用用过,所以只好在网上狂查文档,最后大致整理了一些struts1的基本使用方法. ...
- SSM环境搭建(接口编程方式)
一直用ssm在开发项目,之前都是直接copy别人的项目,今天趁着项目刚刚交付,自己搭建一下ssm环境,做个记录 一.创建项目.引入jar包,因为版本不一样,就不贴出这部分的内容了.个人平时的习惯是,先 ...
- JavaScript将输入的数字金额转换成对应的中文大写金额
// 将输入的数字金额转换成对应的中文大写金额 // idNumber输入的数字金额,idCHN输出的中文大写金额 function TransformNumberIntoCHN(idNumber, ...
- 深入理解CSS线性渐变linear-gradient
× 目录 [1]定义 [2]渐变线 [3]色标 [4]重复渐变 [5]多背景 [6]应用场景 [7]IE兼容 前面的话 在CSS3出现之前,渐变效果只能通过图形软件设计图片来实现,可拓展性差,还影响性 ...
- Session监听器
Session监听器,是用来监听session对象创建和关闭的.有时我们需要在session创建或关闭时执行一些操作.这是就可以使用Session Listenner. .在项目的web.xml文件中 ...
- 在MVC5和webAPI下是用Autofac依赖注入
很多书本中都提到依赖注入,控制反转等概念,这些都是为了实现松耦合层.组件和类目的. 常见的是使用Repository类分离Controller和Model的直接联系.而为了解除Repository类和 ...
- c#基础之数组
最近看了c#的数组,比c++的数组更加直接,.net也提供了很多直接直接操纵数组的方法,非常方便,所以就想做个总结. 利用数组,我们可以使用变量来声明相同类型的多个数据项的集合,数组中的每个数据使用索 ...
- Java Management extentsions(jmx)与tomcat
1,概念:一个可以使用JMX管理器来管理的Java对象称为JMX管理资源(JMX manageable resource).事实上,一个JMX管理资源也可以是一个应用程序.一个实现或者一个服务.设备. ...
- 使用 CSS3 动画实现的 3D 图片过渡特效
这是一个基于 CSS3 动画实现的图片过渡效果,共有 Flip.Rotation.Multi-flip.Cube.Unfold 等6种效果,它们将证明 CSS3 Transform 和 Transit ...