00:00
OK,把笔记打开,今天咱们要讲的内容呢,可以说是相对来说比较重要,而且听起来呢,应该是有一点小小的难度,对不对?那今天我们要讲的一个是单元测试,第二个呢,就是要GR和这个。这个管道叫channel,但是这两个东西虽然听起来比较麻烦,但实际上特别好玩,就他可以做一些很好很有意思的东西出来了,所以说我经常讲,就说我说如果说各语言它的这个核心,或者他跟别的语言不一样的地方,它的特色,我感觉这个歌和管道是它一个很很重大的一个特色,包括他前面讲的接口编程也是它一个特色啊,这个呢,大家所说听起来呃会比较好玩,比较好玩,我也会尽量把它讲的透彻一点,那么先来看给大家讲一下单元测试,各位我们来看一下单元测试来吧。打开这个幻灯片,我们来看看单元测试,那一样,我们新建一个章节对不对。
01:01
好。新建一个章节,我们做到第二集。然后呢,我们是直接定位到幻灯片。下一个。好,我们取个名字叫单元测试。单元测试。好,给他来一个标题,这个是第15章了。那么单元测试是什么呢?听其名而知,其肯定是关于一个测试的一个框架。对吧,我们学Java也好,学PHP也好,它都有自己的一个测试框架,那么这个单元测试呢,往往是针对一个模块,或者是针对一个函数来进行这样一个测试的,那么看一下它的基本介绍。首先还是老规矩,先看一个小小的需求,有这个需求呢,引出我们的单元测试,大家看这里有一个可爱的函数,对吧?这个函数非常的简单,爱的upper,就说我传进去一个N。
02:01
我传进去一个N值,然后呢,我进行一个累积,从一加加到多少呢?加到N,得到一个结果。就这么简单一个题,所以说这个函数本身是非常简单的,当然你在实际开发中,将来这个函数可能很复杂。将来的函数可能会会很复杂,那这个时候呢,我们有一个需求是我们怎么确认它运行的结果是正确的。确认这个结果是正确的,当然有同学一看,说韩老师这个东西有什么可讲的,那么这个地方我输一个五,输一个十,我看看结果等是不是等于55不就得了吗?可以,确实是如此,但是大家想到你们将来面对调用的这个函数可能很复杂,也有可能这个函数是你的一个队友写的。比如说你队友写了一个对数据库或者red的一个操作,然后呢,你希望把这个数据取出来,然后再干什么事情,你。
03:01
这个结果你你可能很清楚的知道结果,但是它本身函数很复杂,这是第一种,第二种有可能你调用的是对方的第三方的第三方的一个接口,然后你给他传一个参数,你希望它返回一个结果,好这个时候呢,我们就涉及到去测试它的结果是否正确。对吧,所以说第一这个需求咱已经出来了,就什么呢?在开发中我们经常有这样一个需求,我先写到这里。给大家来个标题二说一下啊,在我们工作中,工作中我们会我们会遇到这样的情况,遇到遇到这样的情况,什么情况呢?情况啊,就是去确认。去确认。确认。啊。确认一个函数或者一个模块,一块模块的结果,结果是否正确。
04:00
是否正确,这时如下面,比如下面刚才老师提的这么一个概念,这个需求肯定是客观存在的,你不管是你是一个程序开发人员,你还是一个测试人员,你都必须要面对这样的情况,那么今天这样一个情况咱们怎么解决呢?还是老规矩啊,还是老规矩,第一个我们先看看传统的方法能不能解决。那么传统的方法解决呢,还是比较简单的,一个最简单最直接的想法就是说我在一个main函数里边去,我调用你给我的一个函数或者是一个模块,我看看实际输出的结果和我预期的结果是不是一样就完了。对不对,这是一个非常非常这个直观的原始的一个想法,如果一致说明正确,如果不一致说明正确,然后如果不一致说明错误,然后修改就完了。好,那么我们来看看传统方法怎么解决,然后再说传统方法的缺点,最后引出我们这个测试框架,好,那现在呢,我们看传统方法的解决方案。
05:05
来一个传统方法解决方案给大家一个就说传统方法。传统的方式方式来进行测试,对吧,传统的方式进行测试,给他来一个标题二,那么诶,我这应该来一个标题三。来个标题三好,然后刚才我已经讲到了,传统方法怎么做呢?就这个思路。好,我给大家板书一下,那么我们开始来玩一把,来测试一下啊,来看一下,具体看一下看一下。来代码实现,代码实现,那现在呢,我们就要开始玩这个东西了,那么在玩的时候呢,你们注意它的缺点在什么地方,打开我们的Vs code,我们新建一个文件夹对不对?文件夹我的名字叫chapter。CHAPTER15,这是我们第五个幺五,然后呢,我新建一个一个这个这个文件夹叫testing。
06:02
Test测试的DEMO01在这里呢,我们可以新建一个主文件夹main,然后在这个地方写上main点构对不对面点购好main点购好的,然后呢,我们来简单的写一下这个代码package主包。Package主包,然后import,肯定呢,我会引入form这个包包,然后写上这个主函数,主函数好,我们把刚才这个函数呢写一下,就是一个一个被测试的啊,被测试的函数,这个函数很简单,放个I Apple。Up,然后呢,你给我传一个n int,最后返回一个结果对不对,返回一个结果,那这个地方我们怎么写呢?结果先给他来一个初始化,一个for I等于一从一开始加,加到多少呢?小于等于这个N,对,然后I加加,最后进行一个累积。这就完了,然后把这个结果呢return回去。
07:02
对这个就写完了,那写完后我们传统的测试方法。啊,传统的测试方法怎么办呢?就是在main函数中,就在这个命函数中测试函数,函数中使用,看看结果,看看结果是否正确。是否正确?好,这个很简单,那我就这样写了啊同学们,我呢把这个I的up往这一写,这些插件先不去管它,Res等于多少呢,I的up。传进去一个十,大家都知道,从一加到从一加到十呢,应该是等于55,对不对,这个大家小学都学过,然后呢,如果我就这样写了啊,如果res不等于55,我们就认为错了,那么就说出一句话。我们就输出一句话,什么话呢?就说呃,ADD up,执行错误。爱的upper。
08:00
Up错误了,错误的原因是什么呢?那就是我们期望的返回值,返回值等于返回值等于一个值,然后期望值,期望值等于多少呢?来写到这,好,这个时候干脆我们就格式化一下。最后呢,来一个换行。写进去对不对,返回值我们认为应该是55啊,返回值它是这个res,那呢,我们期望是多少呢?55,那如果说它等于这个呢,好,那就好办了,如果等于这个的话,L对吧?L,我们就说测试正确,那说返回之后期望值是正确的。就这样子,也说出一句话。返回,呃,正确了。因为它的返回值和期望值是一样的,来我们玩一把啊,这个代码非常简单哈,非常简单,然后呢,我们来。回到上一级,回到上一级,CD00进入到我们的CHARACTER15,然后呢,CD到test DEMO go,哦,CD组目录go run。
09:08
没点个跑起来,我们看一下,这个时候呢,运行过后我们发现结果跟我们想的是一样的,是说I up测试正确返回值55,希望55,如果我返回的是不正确假设我写错了啊,比如说我的代码不小心写成了N减一假设啊,但当然我就是假设,假设写成了N减一,那这个时候呢,我一测试对吧,它返回是什么呢。At up,错误返回45,希望55,好,这是我们传统的一个测试方法,那么这种传统测试方法有什么缺点呢?好,我们先来做一个简单的分析,找到它的缺点,大家才知道为什么我们需要单元测试这个技术,好,先到这好的代码已经是在这儿了,下面呢,我们来分析一下这个传统的方法的一个缺点是什么,各位。
10:01
来,走一个。啊,同学们,我们写到这里来,我总结这么几句话啊,同学们,我们要善于总结,第一点大家看一下,首先我们从这地方可以看出来。如果说。如果说这个。我们需要用传统方法的话呢,大家可以看到。它第一个是不方便,为什么说不方便?首先因为你要把这个爱的upper直接放到命里面去写。那你想一想,你这个函数假如啊正在运行,假如你的项目已经运行了。你方这去测试,即使你没有没有在生产环境,你即使在别的地方,比如说你这写了一个程序,假设正在运行,你还得把它停一下,停下过后呢,你还要改这个组,你还得去改人家这个代码,很麻烦的。就说你至少要涉及到去改现在有可能正在运行的代码,这个肯定是不方便,所以说第一个不方便。不方便。
11:01
不方便的原因是我们我们需要需要在在这个主主函数中,主函数中去调用,去调用,这样就需要去修改。去修改我们的代码。修改这个主主函数啊,如果现在,如果现在这个项目正在运行,现在项目正在运行。正在运行,那么就更加的麻烦,运行就有可能就有可能啊,可能去就可能。可能却停止项目。啊,停止项目,当然有同学可能这样说的,说老师那我我我自己开做一个测试环境就可以了嘛,当然也可以,我说如果啊,如果你现在就想简单的测试一个函数对不对,那你只能去搭建一个完整的跟你这个真实的正在运行的这个项目一模一样的,你才能去测试,假设不一样,你还不敢保证你在那地方测试正确了,那在真实环境里面可能他又错的,这个不好说。
12:06
因为他就跟你的这个环境有关系的。有些时候测试是可以直接做一个真正的测试环境,但有时候的测试你必须在生产环境,大家明白我意思吧,因为生产环境有很多数据,你的那个你你在那个,你测试环境是没有的,没有办法说老师诶这就是我们有些同学没有经验,就是有些同学说老师这个测试我是不是。完全可以自己搭建一个测试环境,理论上是可以的,但是以前我们在新政工作的时候就有有这种情况,你就必须在这个生产环境测试,因为里面那个数据,比如打个最简单比方,你生产环境的那个数据量产生的假设是几千万,你在测试环境,有这个环境吗?你没有,第二个你在真实环境,你要去调用对方第三方的一个一个文件,你在生环境有吗?人家根本不给你开放,你没法说,你就说你必须在这个生产环境测,很麻烦的,说这个就很麻烦,在这第一个错误,第一个问题,第二个呢,我觉得不利于管理,不利于管理说为什么说不利于管理呢?各位同学看啊,你现在是各位,你现在是测一个函数,那我假设我这还有第二个函数,或者第二个功能模块有at,你来你来给我测一个爱特UP2会不会正确,当然这个爱UP2呢,是另假设是另外一个功能。
13:21
比比如说是get它的一个和对吧,那你这个时候还得把这个注销,注销完了过后你再去判很麻烦,因为它是融在一起的,它是把你这个测试噌的一下把它放在一个主函数,你想一想。相当于土。你为了去测一个,你没准还得这样子,这个多好玩,也得把它注销了,然后说我要测试爱你麻不麻烦,显然这个很很不方便,因为你把所有的测试只能写在一个主函数里面去,显得很麻烦,不利于不利于管理,自己测的时候都不知道,诶我测的到底是哪一个函数啊,我测的是哪一个功能模块对不对,很麻烦,所以说各位同学,第二个我们是不定管理,因为我们需要将,比如因为当我们当我们测试多个函数或者多个模块时,模块时都都写在了,都需要需要写在哪里呢?写在这个main函数中。
14:22
函数中函数入不利于,不利于不利于我们的管理和清晰们的思路啊思路,所以说呢,这个地方也不好,所以说大家看到。第一个不好,第二个也不好,那现在所有的这个不好,就在发出一种呼唤,赶紧出现一个新的东西吧,对不对?引出,引出我们要讲的清楚,引出什么呢?引出这个叫单元测试。单元测试,那么这个go浪呢,跟别的编程语言一样,一般的编程语言都会有一个叫测试框架的东西,我们的go里面它有一个叫testing测试框架。
15:04
Testing叫测试框架,这个框架待会我讲原理啊,你把这个原理一听就知道哦,这个家伙还是挺好的,那么testing这个测试框架呢,可以很好的解决这个问题,很好的很好啊,很好的解决问题,那我们测试变得比较的简单好了,同学们,那关于我们这一个,呃,就是单元测试的需求和引出呢,我们就先给同学们介绍到这里。
我来说两句