单元测试是独立的,所谓的独立是指有独立的运行容器,独立的数据库。

这样做有什么好处呢?

(1). 不会跟正常的容器产生冲突,继而影响正常业务。

(2). 数据库独立防止数据被修改影响单元测试结果。

这两天攻克了单元测试的两个问题:模拟数据库、mockery的调用。现在把原理解析一下。

1. 模拟数据库

那这样,我们来想一下。正常的创建一个数据库要有那些流程?

(1)定义表结构

(2)往表中插入数据

其实测试使用的模拟数据库总的来说也就这两个流程。

来来来,敲黑板,重点来了。

database目录下有三个文件夹,migrations中存储的是表结构文件,factories中存储的是创建模拟数据的方法,seeds没研究,暂时不知道干啥用的。

这个时候可能会有人问:创建表结构文件是什么鸡儿?它有啥用啊。

我们这样想一下:我们要创建模拟数据库,那数据库中肯定要有表吧。表长什么样子呢?你不给定义laravel怎么知道呢?那在哪里定义呢?就在migrations下面定义!!!

来给大家举个例子:

看见这个文件没?它就是定义表结构的地方。它长这个样子:

我们再仔细看看这个文件名:

哇,这名字这么长。还有日期,中间还有一串数字,让我怎么写嘛。

兄弟,别急。我有一计可保你平安。

在项目下面执行这句话:你就会得到你想要的结果

php artisan make:migration test --path=database/migrations/pandaRead

look here:

创建了新的文件,有木有,有木有。然后你就可以在up中写你表结构的定义了。

有同学可能会问这表里面的东西都是干啥的呀?作者云:内事不决问百度,外事不决问谷歌。

知道了为啥定义表结构和怎么设定表结构。

这个时候可能又会有兄弟问了:唉,你这个migrations下面为啥还有个pandaRead目录啊?你创建它干啥啊?

问的好!!!

一个大型的项目它所涉及到的数据库往往不止一个,而且各个数据库涉及到的业务往往不交叉,所以我们往往只会模拟一个数据库中的所有表。如果一次性的把所有数据库中的所有表都创建了,会很浪费资源。因此:给每个库定义一个文件夹,文件夹下面存储某个库下面的表结构文件,这样你在加载数据的时候可以根据文件夹把涉及到的所有表都一下子给创建了。

那又会有同学问了,什么时候创建表呢?表创建在哪里呢?

我就喜欢你这样问题多的小朋友!!!

来来来,诸位看官且把目光移到这里。

看到TestCase这个类了吗?它将会是你创建的所有测试文件的父类!!

那举个例子:

看到了没,所有的类都继承了TestCase这个类。

那我们是不是可以想:既然所有的类都继承了TestCase这个类,那我们的配置是不是可以写到TestCase这里呢?当然可以!!!

等等???什么配置,我还没反应过来怎么就讲到配置了呢?

小老弟,别急。来来来,看这里,思考这几个问题:

(1)我们的表创建在哪里呢?创建到文件里?数据库里?还是内存里?我们要在哪里告诉系统呢?

(2)刚才我们定义了表结构文件,但是定义了并没有加载啊。在哪里加载他们呢?

想明白了吗?这些东西我们都要告诉laravel,不然即使laravel再强大,它也无能为力啊!!!

那在哪里告诉它呢?敲黑板,敲黑板,重点来了哈。

我们来看看TestCase.php这个类中到底有什么东西。

创建表的地方,数据库连接的方式都在这里配置。

创建表没什么好讲的了,我们来讲讲数据库的连接方式:

config(['database.connections.mysql' => config('database.connections.testing')]);

这句话其实就是给数据库添加配置:在database配置文件中,connections.mysql的配置

这样数据库的配置就搞定了。

别急我们再看下这个方法,一层一层的剥离下去,我们看看它到底做了什么

parent::setUp();

最终其实它创建了一个新的容器。

优秀啊,优秀啊!!!这样你每执行一个单元测试的时候,都会创建一个新的容器,各个文件的单元测试之间就不会相互影响了。厉害啊

现在我们再来看看模拟数据:

这个时候可能会有人问:什么是模拟数据啊?你想啊,你测试是不是需要数据?数据谁来创建?你可以选择自己创建,同时你也可以选择交给机器去创建,那你要创建什么样的数据呢?在哪里定义呢?你创建一条数据可以自己创建,创建10条也可以自己创建,那你要创建1000条,10000条呢?还自己创建吗?这个时候你就需要机器来帮你做这件事情了!!

没错。就是在这里定义。举个例子:

它里面是长这个样子的。里面的数据根据你的需要自己配置。Generator可是很强大的啊啊啊啊啊啊!!!建议大家看看

诺,看见了没?给那个类创建什么数据都在这里面定义好了。那什么时候插入呢?

看见没,我们可以直接用工厂创建,然后最后可以直接插入到数据表中!!!读取数据的方式就和平时读取数据的方式一样,没什么区别了。

2. mockery

模拟数据库讲清楚了,那mockery呢?

什么叫mockery,什么时候用到mockery呢?

mockery......自己去查吧。

简单的说你可以将mock理解为替换掉类中的某个方法,或者替换掉某个类。

看这里,我们mock掉了一个类的某个方法,然后重新在容器中绑定这个类,这样容器中的类就被替换了,当我们测试的时候调用这个类的这个方法的时候,就直接按照我们mock的数据返回了,优秀啊!!!

本次分享,到这里就结束了,欢迎大家批评指正。

laravel进行单元测试的时候如何模拟数据库以及mockery的调用的更多相关文章

  1. php模拟数据库常用操作效果

    test.php <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); ...

  2. SharedPreferences 存List集合,模拟数据库,随时存取

    PS:SharedPreferences只要稍微学过一点就会用,他本身通过创建一个Editor对象,来存储提交,而editor可以存的格式为 他里面可以存一个Set<String> Set ...

  3. 在laravel环境下将图片存入MongoDB数据库

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. 单元测试系列之八:Sonar 数据库表关系整理一(续)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 简介:Sonar平台是目前较为流行的静态代码扫描平台,为了便于使用以及自己二次开发,有必要对它的数据库结构进行学习 ...

  5. JavaEE学习之Spring Security3.x——模拟数据库实现用户,权限,资源的管理

    一.引言 因项目需要最近研究了下Spring Security3.x,并模拟数据库实现用户,权限,资源的管理. 二.准备 1.了解一些Spring MVC相关知识: 2.了解一些AOP相关知识: 3. ...

  6. 单元测试系列之七:Sonar 数据库表关系整理一(rule相关)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/7510072.html 简介:Sonar ...

  7. C#全能数据库操作类及调用示例

    C#全能数据库操作类及调用示例 using System; using System.Data; using System.Data.Common; using System.Configuratio ...

  8. BMP是在Bean中完成对数据库JDBC的各种调用

    BMP是在Bean中完成对数据库JDBC的各种调用 CMP是由EJB容器自动完成对数据库的操作 会话Bean主要处理业务逻辑

  9. 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测

    如何使用T-SQL备份还原数据库及c#如何调用执行? 准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup ...

随机推荐

  1. VS统计项目代码行数

    ctrl + shift + F 输入:b*[^:b#/]+.*$ 选项图如下

  2. 减小ipa包大小

    1.删除不用的文件和图片 2.打release模式 3.色调单一图片采用8-bit的,对32-bit的图片采用压缩 4.对音视频采用aac压缩

  3. Spring中IOC和AOP的详细解释(转)

    原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...

  4. (转载)中文Appium API 文档

    该文档是Testerhome官方翻译的源地址:https://github.com/appium/appium/tree/master/docs/cn官方网站上的:http://appium.io/s ...

  5. 判断np.array里面为空字符串的方法

    #多在编译器里尝试新操作 import numpy as np for i range(100): eval1 = {"A": ''"} eval2 = {"A ...

  6. Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:443

    (1)端口被占用,找到对应的进行并结束.(2)Linux下查看,无进程占用443端口,确认/etc/httpd/conf.d下只有一个ssl.conf,无其他SSL配置.备份文件,如果有,apache ...

  7. stl string的erase方法

    ; i < s.size(); i++) { ') { s.erase(i,); i--; } } 删除string中的所有0.

  8. PTA第一个编程题总结

    7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数 ...

  9. Jmeter对SQL Server进行压力测试

    下载地址 https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/ 选择binary版本即可 下载的是apache-jmeter-5. ...

  10. 3、Kafka集群部署

    Kafka集群部署 1)解压安装包 [ip101]$ tar -zxvf kafka_2.11-0.11.0.0.tgz -C /opt/app/ 2)修改解压后的文件名称 [ip101]$ mv k ...