00:00
那么我们讲了这么多呢,我想给大家一点时间哈,布置一个单元测试综合,呃,案例要求,具体要求是这样子的。一个先编写一个monster结构体,里面呢有这三个字段。给monster绑定两个方法,一个叫store。呃,一个一,一个ore,这个store方法呢是将monster序列化保存到文件中,一个叫这个restore,可以将序列化的monster从文件读取,然后反序列化,最后要求同学们编程,编写一个测试用例文件,叫store_test去测试。这个和这两个函数。能不能正确使用就说,说白了,我就是让你们测试两点,一个在序列化的时候能不能正确保存到文件里面去。第二个希望大家能够把它恢复回来,能不能再重新恢复成功,并且看你这个名字对不对,我这再加一个要求啊,就是在在进行这个rest的时候,要看你保存回来的这个名字,比如说你存的这个monster是牛魔王,你看这个名字对不对,要测试他的恢复回来过后,名字是否跟原先那个一样,恢复后,恢复后看名字对不对。
01:17
啊,这个是要求我写到这里来。反序列化,然后呢,测试就是检测,检测恢复后或反序列后反序。列化后后名字。就是那个结构体的名字,名字是否是否正确。是否对对。好,这是给大家布置的这么一个题,现在呢,我把这个题呃就放到这儿,我现在把这个整个复制到我们的飞球里面去,同学们呢,现在可以做一个练习时间啊,时间我们定在大概这个呃,十分钟的样子吧,或者或者五六分钟的样子,大家练一下。
02:01
好,屏幕我就不关闭了,大家可以看着这个屏幕做,我先暂停一下视频。好了,同学们来,我们一起把这个简单的走一下啊,看看这个题怎么做好,我们一起来完成答,然后呢,我们写个叫单元的,单元测试一个综合案例,单元测试一个综合案例。好,我们一起来完成。大家看看这个怎么完成。好,来给大家一个标题二,然后首先呢,我们把这一个题的要求给大家放到这边来。这块为了省事呢,我就直接。截个图。单元测试,呃,综合要求呢,是一共有啊四个,它的要求是四个对不对,所以说我们根据这个题呢,我们就来开始做,那下面的代码实现就直接上代码实现。代码实现。那首先我们来分析,既然你做这样一个测试单元测试呢,我们最好是新建一个文件夹,就不要跟他打架了,但实际上你你要跟他放在一起也是可以的,但是呢,我个人并不是习惯这种写法,对吧,所以说呢,我们最好是新建一个文件。
03:11
啊,新建一个文件夹。来新建一个文件夹,比如说我们叫test case test case02。啊,这写错了,Test case02 test case02,然后呢,在这里边呢,我们把该有的文件就放在这个文件夹就可以了,啊,放在这个文件夹里面可以了,好,我们新建第一个文件master订购。因为我要测试的就它,所以叫master领购。啊master,然后呢,对他进行测试的这个文件呢,我们叫按照这个规范来写就可以了,我们叫做master。下划线,TXT。啊,顶购。啊,这样子就代表一个测试文件,那现在我们先把现在这里面写上我们需要测试的这些个函数,以及它的一些结构体package来了,Package page包包的名字呢,嗯,只要不起主主包就可以,其别的包都行啊,那们就叫monster吧,就简单一点monster好,现在呢,先来做一个,呃,结构体structure。
04:16
Type。Type monster monster。然后里面有什么字段,他刚才已经说的很清楚了,有名字,有名字还有一个年龄对不对啊,有名字有年龄,还有一个skill它的一个技巧。师尊。好,这就写完了,那写完过后呢,啊,他说呃,有这他说这个函数啊,这这个monster呢,有两个方法给他绑定,一个叫store。哎,一个叫洞。这是一个方法,还有一个方法呢,叫restore,就是恢复。一个是道,就是序列化,一个是reach,道就是反序列化,那么我们把它完成一下。
05:00
给他绑定,这个方法非常的简单,非常简单,那就直接这样写了,放。啊fun,然后呢,给他绑定,那么就叫取个名字简单一点啊,就this啊,一个一个习惯的写法,Monster,然后里面呢叫是store,它的名字叫大写的,那就按照它的写法吧,Store好,Store没问题。包起来。啊,那识到什么呢,他就绑定一个方法干什么呢?将它序列化并保存到文件中那。那也就是说对方会传一个monster这个实例过来,有时候到这个函数的时候,他已经有这个实例了,对有这个有这个monster,那就那就调用我们的方法就可以了,这时呢,我们需要引包。就是直接直接将将什么呢?将这个呃序列化后保存到文件中,那这两步走啊,第一步先序列化,第二步啊再保存,说先序列化,大家写先序列化。
06:02
序啊序列化。然后呢,第二步我们这要保存到文件,保存到文件那这块还得还还得引文件包啊,那就还稍微麻烦一点,Import,首先第一步呢,我们先把啊,先把这个序列化的包包引进来。叫encoding,大家应该还有印象,Encoding下面那个叫接层包,对不对,好,待会我们我们保存的时候呢,就简单一点,就直接性的一次性把它扔进去就完了啊,我简单一点就用这个IO,我们IO里面有个叫呃,IOU72还记得吧啊,这个包就简单一次性的把它写进去就完事了,我也不去啰嗦了,那些序列化,那序列化呢,调用的是杰森。里面有个函数叫muscle。Master里面呢,把这个monster传进去,你这个不是this吗?传进去,传进去过后,他这个master完了过后,序列化过后,它是不是会返回一个,返回两个数据啊,一个是。
07:03
他的data data呢里面有另外一个就是A。就是说有有没有失败,是不是是这意思吧,那这个时候我们就可以做这个工作了,那这个时候咱们怎么做呢?诶,他既然有错误,干脆我们把这个错误信息给他返回,所以说我这定一个A。我想听一个error。那这样就比较简单啊,这样就比较简单,那如果说简单一点,还可以这样写对吧。返回布尔形式吗?那也可以返回L返回如果是A的话,用用是不是空也可以判断嘛,也可以就是布尔啊A都都行,因为它如果说没有说它是一个near嘛,它是个near。啊,这个返回波尔也行,那干脆就就按那个对呃,那个小夏说的也可以也可以,那就简单了,就if AR,它不等于一个near啊,不等于near,那说明它是有错误的,我们我们可以把这个错误信息呢,直接就给它返回去,或者怎么样打印出来,都都可以看你的,看你的一个需求啊,看你的需求,比如说我们。
08:05
就说这个序列化失败了,Mar。Mar l啊,把这个信息呢,我们可以把它打出来,打出来过后呢,我们就不玩了,直接一个一个这个,呃,Force啊force。哪个?你说这个大写是吧,你再。啊对,我是要创建一个这样的,我要创建一个这样的实例,说这种小写有点麻烦,对吧,大写吧,大写那就大写吧。好,大写可以,那这边也得怎么样,也也要大写了,也要大写好,这个是,那如果说呃,它不等于这个的话呢,我们就继续往下走了,继续往下走,因为还要保保存到文件里面去,那保存文件的话,我们得写一个,先要定一个文件名。需要定一个文件名,那所以说呢,我们现在给他写个序列化后的名,文件名字,比如说fire路径。
09:05
啊发我就假设定到D盘去吧,D盘写个monster。monster.log啊,一个日志或者。看你怎么取这个名字啊,看你的习惯啊,啊写进去过后我们怎么写呢。呃,我们直接用这个IU72包里面的一个方法。对不对,他们有个什么方法就一次性的写进去了,好像叫right file是吧,Right file。这right fair,那这个函数回忆一下是怎么写的里面。是先写什么?先写,先写什么东西。是不是想写写data呀?谢谢,我们要把它写到那个文件里面去是吗?然后再写什么。然后再写什么,我们来看一下啊,一个是数据,一个是把这个文件写到哪里去,我们我们找一下这个IO下面有个u tr包诶。
10:04
找看看里面有个一个是文件名,一个是data,还有一个就是这个文件的模式,文件模式后面的无所谓,所以说先写文件东西,再写这个data data呢,我们看它的类型应该就是一个字节。是吧,是一个字节的一个切片,字节一个片,那么我们这个地方返回的是不是也是字节呢?它是不是本身也是一个字节呀,所以说字节那这样就匹配上了,就不用管它后面这个呢,随便写一个,比如说066。这样就把它写进去,文件也不用关闭它这个地方会不会也报一个返回一个值呢?我们来看看实时的看它有没有返回一个值,我们发现呢,这个方它也会返回一个L对不对,所以说这呢,我们也可以做这样一个工作,接收一下这个L。说要么你是序列化出错了,要么是保存文件出错,我认为都是都是错,所以说地方我们还可以再加一个判断,如果L不等于零二呢,这也错了,相当于说这个错误呢,是在保存,这个在保存的时候出错了,但是呢,我们也可以也认为是个错。
11:10
好,提示一句话就是保存文件,我叫right right file出错了,Right file error,那error信息打出来,然后返回一个false,那如果说这个也伸去,这个没有进来,这个也没进来,那最后呢,我们返回一个出。返回一个针。TURN。返回第二一个处。好,这个代码就写完了。啊。哪地方写冒号,哪里有错了,二十五行,二十五行这间忘了一个冒号,因为不然的话,它包括你没有定义过是吧?好呃,这张不用加加冒号了,是不是前面是不是整个呀,整个就不用再写了。好,这写完了反虚的话,各位朋友我们也来玩一把反虚的话啊,这边因为你们写东西他会报错,待会再再说,紧接着我们在学一个反虚的话,反学列话呢,它是反过来反行,反其道而行之那一样的道理,这个签名我们可以拿来用用。
12:07
哎,也返回一个布尔吧。也返回一个部。好,那这个时候呢,我们这样做叫restore。Rest,好,Rest,那么现在呢,我们要去怎么样呢?诶,同学们,我们要首先把它读出来,那第一步第一步先。先从这个文件中,文件中读取,读取这个序列化后的字符串,序列化序列化的字符串,这个很简单,一样的规矩,先把这个文件名给我定下来。啊,当然你也可以说要简单一点,也可以这样做,就直接这样也行哈,我这就干脆就放放到D盘去,放到D盘去。好,我就找他,我找他过后呢,我就用这个iou里面的一个方法,它的方法叫read read file。
13:02
那read file呢,直接把这一个文件的路径给他,给他过后呢,它会返回一个什么?我们来看一下read file,简单看一下,它会返回一个这样的东西,Read five。啊,在这直接返回就是一个bit切片,同时呢,也会有个L好,这是我们要要的东西,那首先道理一样,Data data,然后呢,有个L,有个L好搜一下再做一个判断。如果说这个L不等于near,这说明我们这个就错了,那就直接return一个false,当然我这边可以打印出一句话对吧,打印出一句话啊,打印出什么话呢?这其实这种打不打无所谓,因为我们可以用那个测试框架来打好啊,但是你打声也没什么大的问题,就read file error。然后把这个错误信息打出来就完事了,紧接着继续序列化,那序列化这个要想过来啊,第二步就是使用。
14:02
使用读渠道的,读渠道这个data这个切片,实际上它是一个这个东西。对象对什么呢?对对这个序列化反序列化反序列化序列化反序列化的这个对象呢,存在这个Z里面就可以了,反序列对象直接存到这里面去,那简单怎么做呢?用这个接肾包包。Jason里面有一个叫on Martha。A marha这里面传的是什么字段,我们看一下应该是至少要传两个信息进去,传两个信息进,一个是这个带这个数据,另外一个呢,就是把这个数据恢复到哪个地方去。对不对,应该是这样子的,我们看这个对不对啊,找到这个接绳包我们来。如果想不起来,大家也不用着急哈,想不起来的话呢,你自己搜一下就可以了,在Jason啊,N Co cody在上边,N cody在上边,好,N cody上边有一个JA森,我们看一下on marha是不这样写的。
15:07
我lawyer marha,阿marha呢,我们在这找到了marha,这找果然是这样啊啊marha这首先是它的一个be bet BAT这个切片的111个类型,然后呢,Interface啊interface好,这样就可以了,这后一个L也把这个L搜一下。好,如果说这个地方反斜的话,失败了,我们写一句话,If l,它不等于near。不对,Near代表出错了吗?代表出错了near,好,我就输出一句话,就说on Mar出错。The marha。就是反序列化,有个L,把信息输出来,然后返回一个方式,最后如果这个地方没有出错,这边也没出错,那么就返回一个针。TE。URUE。好,返回一个针。
16:01
触啊,返回一个处。T rut rue,好,写完了,那写完过后呢,我们来做一个测试,这边我们打一个包,这个包跟它一样,都在都在Mo包里面去,当然这边可能要引些东西啊,有些东西需要引的话,我们再引,至少第一个testing肯定是要引进来的,好,然后呢,我们写自己的测试函数,第一个函数呢,我们首先要知道它的函数名儿必须是大写的T的打头,然后我们测的第一个函数叫这个rest到。啊,先吃这个stop吧,SQ,然后这边呢,参数不要忘了,一定是这样写的啊,这是个固定的写法,点T。好点T好这个这是它的一个测试用例。这是一个测试用例。用例。那这是谁呢?用于测试这个stop。到这个这个函数。啊,方法应该测出它的方法。
17:00
呃,那这个时候怎么去测呢。怎么去测呢?相当于说你在这要去调它这个道,那你首先得先创建一个monster,所以说这个函数的这个这个呢,你先你先要创建它,要创建它那个也简单哈,那就这样写先。第一步,你在测试的时候,它稍微麻烦一点,先创建。先创建一个monster啊,先创建一个monster monster这个对象,呃,实例。那这个也很简单,Monster走,直接来一个monster monster好给他赋值就行了。第一个是内蒙,内蒙呢,我们比如叫做红孩儿。红孩儿。从海尔。好,然后呢,他的年龄啊,对他的年龄我把它写进去age,比如说这个红开灯年龄呢,Age。AG。啊,AG这个年龄,年龄呢,比如说是十岁了,然后呢,他的技巧。
18:02
对,他的必杀技是什么呢?土火啊土火。好,它是土火土三维真火,好完事,它写完了过后呢,我们怎么去调它呢?很简单,那就说因为函数它是在一个包,所以说直接可以调它了,就是食道就可以掉了,直接用这个方法调用master。点啊这个a monster stop。To判断它是不是等于一个针拿到一个结果集。二走维到。瑞到,其实这个地方按理说返回error应该更好一点,好啊,因为我在这一层还可以把信息拿到啊,这样在这输出应该更更好一点,待会我再调一下,呃,就是说如果十道返回一个error应该更好。你说是是指针是吧。没关系,因为我们前讲过,这个地方是一个对象,这个对象他在真正调的时候,调方法的时候,是刚才这个,呃,张岱说的时候,我他说我必须这样做。
19:06
我其实这种是可以不需要这样做是吧。可以的,你看我这样写应该也没问题,Rest。然后瑞到的时候就相当于去存储,那我就做一个判断,如果RS等于真,那就不用再判断了。那如果是为真的话,我们就说明这个测试成功,如果为假相当于错了,相当于错了,如果错的话呢,我们把日志输出来,T点什么呀,应该是选什么非。F,这个F对不对,F好写一句话就说这个,呃,错误就是这个函数测试错误了,错错误了,错误原因期望是期望为一个什么值。对吧,如果目前来说我们希望是为处,那实际呢,实际。实际为多少呢?也输出来好,我们期望是真,但它返回的呢,是RS。
20:04
好,最后把这个日志再输出一下t log f,就是这个是正确日志,就说测试成功。啊,就是这样,想要测试成功。测试成功。好,我们现在可以测一下了先。二我保存一下,看哪里有错误。Mon。Monster。刚才诶还有错误,这边还有错误,哪哪错了。是不是少了一个包包?Forat这个包包。好,再看还有哪错。Jason。啊,第第几个地方,第这一行是吧。M是小写的,对,M是小写的还有错吗?再看看,哎,我们发现好像没有错了,这地方有一个问题,刚才张岱的一个疑惑,说诶老师你这个地方,你这个方法,这个食道呢,它是跟这个一个指针这个类型绑定的,那这个地方在调的时候,咱们是不是呃,必须是一个以指针的形式做呢?
21:14
其实我当时在讲这个地方讲过,其实你这两种形式都可以,对吧,但是实际上它到底是以引用还是还是以这个呃值传递,还是这个指针传递,主要还是取决于你这个位置,对吧,我曾经讲过这个其实它还是个引用,本质还是个引用。所以说这这个地方呢,其实可以不用这样写,但你这样写可能更更安全一点,你感觉说我返回来是个地址啊,地址呢我才调应该更安全,这种写法呢,应该更稳健一点啊,但实际上呢,你这样不写说我就返回对象。返回一个实例,用这个实例去调,因为它调的时候,它本质还是按照那个指针填的,我今前讲过这个细节啊,就看你的习惯,那最好是还这样子吧,啊大家可能这样子觉得更安全一点,好,我们来玩一把,好进入到刚才我们写的代码里边去,然后CD到我们写的这个案例,我们叫做。
22:09
还是CHAPTER15里面有个test case2进去DR,好,这是我们写的代码,我们就直接go test-V,我我也不去指定那个了啊,全部都执行。我一直以为看效果。好看看效果过后呢,发现你看见没有,他这现在果然是认为我这个有木马了。好,他既然认为我有木马,我也没办法,我只能先退出来,只要他出现,他发现有木马的话,没有办法,他他始终一直要提示。它会一直提示,提示到。你没办法为止啊。好,我都退出去了啊,退出去我再玩一把。再玩一把哦,刚才我们这个代码整个从这推出去的,找到go project src go code,然后幺五里面的T02再进去再测。
23:04
好,Go。GOTXT干杯跑下。抛一下,好,同学们看到我现在是没有问题的啊,没有问题说明目前这个存放是OK的,那反过来我们紧接着再测它的一个就是反序列化,各位同学反序列化来,反序列化呢,我们就这样子写,快速的写一下前面这一部分,改个名就行了。我写在一起啊,都写在一个文件里边,当然你你也可以分开写rest。这个函数的签名是一样的。好,然后怎么把它恢复回来呢?各位同学怎么先还是要先创建先创建。创建一个master实例,但是这个实例呢,它是个空的,就说这个实例你不需要给他先指定这些个字段的字段的值,不需要不需要指定字段的子指定字段的子指定字段。
24:01
哎,字段的指先不要指定。字段的值好,那就那就这样玩呗,那就这样做就行了,我现在声明一个就行,不要这样做了,直接哇。Master。然后呢?这个地方我来一个master就行了。Monster,可以了。因为我不需要给他。字段复出值吗?因为我准备是从序列化里面过来,好,这一步做完了过后,同学们,第二步我们该做什么事情呢?非常的简单哈,郭同学,那现在呢,我们只需要通过这个master。调用它的方法,调用它的什么restore。Rest,其实同学们也不用担心,因为你这儿还是老规矩啊,他传过来呢,也是个例子,当然你你要担心一点,说老师我觉得这个有点不安全,你也可以这样写,你要确实很害怕,你也可以这样写。
25:00
你也可以这样写。也可以,就相当于说我是一个空的,没有初始化的,但是呢,它这个指针这样调,你可能觉得更安全,其实你刚才按韩老师写也是没问题的啊,原因我解释过,原先,然后瑞士道瑞士到过后就就可以了,然后同样的道理也是返回一个RS。对不对,三一,那我根据它来做一个判断了,如果那这个代码我就粘接复制一下。粘贴复制一下。就说如果这个结果。不为真就返回这个错误,当然我还想做一个判断,我还想判做一个判断,我还想判断就是你的这个monster的名字是不是红孩儿。他的名字到底是是不是红孩儿,我还想做一个判断,我还想进一步判断。哎,你又虽然你把这个给我恢复了,但是你这个monster和我原先写这个monster对不对呢?诶我还想做一个判断,对吧,我还想判断说进一步判断,进一步判断,我可以这样判断,如果我我怕我怕什么呢?我怕我进去过被别人替换了,把把我这个文件给我替换了,那我可以这样写master。
26:08
把他的这个,把他这个名字取出来啊,把他名字他等不等于这个红孩儿。好,我看看它等不等于红海儿。红孩儿。红海儿好,那如果是它等于红海儿就没问题,它如果不等于红海儿对吧,如果它不等于红海儿,我也跟他说这个也是错的。我还是说这个错。啊,错错误的原因就有可能是你,你要么是文件写错了,你有可能是你虽然是把它恢复了,但是你找到另外一个文件去了。对吧,或者是有别的程序把我的这个序列化的文件给我改了啊,我希望是什么呢?我希望是红孩儿。我期望他是一个红孩儿名字,我期望是红孩儿。对,然后实际上呢,你给我返回的是什么,返回的这个值。哎,你说明你可能把我的这个这个序列化文件偷偷的给我给我改了,或者你读的文件读错了,好那么这个如果都OK的话呢,我们说测试成功。
27:11
测成功,好,我们看看有什么问题没有,保存一下。保存一下,这有问题。On。On the。Has no has restores好,我看这restore是怎么调用的monster。还是没迟到啊。我我写错了吗。好,S也是大写的是吧,S也是大写的说这这还是一个文件的问题,好现在应该可以了,应该可以了,那么玩一把吧,我们来看一下两个是不是都是对的,两个同时测啊,两个同时测,那测试的时候这个顺序就比较重要了,因为一个是往里面保存,一个是这个这个存,那这个顺序呢,呃,我们也可以同时来看看他测试的顺序是不是按照这个从上到下来执行,如果是从上到下的话,就应该是正确的,如果是反过来的话,那你还得分开写哦,还得分开写,我们来走一下吧。
28:15
我们先看看对不对哦,我们看到都是正确的,我们看到都是正确,你看这个地方A是正确的,这也正确的,那我现在稍稍的改一下。比如说我想单独的测试这个,呃,Test rest,你看啊,我单独想测试它这一个用例,那么我们是写成什么呢?呃,Test test.run对不对?然后我写上什么呢?叫做reador restor,好跑一个。我们发现这个测试呢,也是正确的,那我把这个名字改一下,比如说不小心有人偷偷的把我们这个文件的名字给我们改了,比如说他把红海儿改成了红海儿一个波浪号。好,这个时候我们再来测一下,看看有没有可能是报错了呢?
29:02
好,我们再来测一下,我们发现这有错误,好看到看检测出来了,他说错误啊,我希望是红海尔,但是实际是红海尔不能好错了,那这样子有我们就有可以去防止对吧,我们读的文件和那个写的文件可能不小心写错了,导致写错误,那我再多说一句啊,同学们,同学们可能会感觉到说,诶说老师你讲的这个测试用例好像也没有什么不得了,因为这些东西我一看就看出来了,我再说一遍啊,我们现在写的这些函数啊,都非常的简单。其实其实你你这个一眼就能看出来,但实际上以后这个写的这接口函数啊,它比较复杂。它比较复杂,比如说咱们去做一个很复杂的一个计算,这个结果我希望有个结果,那反回来不是,而这个运算的代码呢,它是这个函数又掉了另外一个函数,还掉了别的函数,那就很复杂了。所以说如果放在一个简单的函数测试是没有什么实际意义的,它更多的是将来我们这个被测试的函数,它功能很复杂。
30:07
你可能期望是这个值,但是它就是不稳定。甚至将来咱们这地方有可能不是简单的直接调用,而是一个负循环,我在说这个意思啊,说你可能是有很多测试数据,你不停的是产生的,比如说那个测试数据是有一一十万个,而测试数据是放在文件里面的,你把这个文件测试数据先一个读进来,读进来之后反复的去调。才看它是不是正确的,如果你是放在这一个地方去看,你你觉得没什么价值。打个比方,我们将来写的一个,比如说,比如说你写这个冒泡排序法。冒犯反一句话,正确还是不正确呢?好,我不知道,所以你有两个方案,你就是写了一个无序的,让去测试,你一个无序的是不是一定测试成功,就是就是成功不一定,那你严格的测试,你应该是至少要写,比如说1000个无序的这个数组,然后1000个无序数组,然后测试1000次,发现结果都是正确的,这1000个结果都是我期望的好,正确了。
31:08
我可以先用一个已经已经测试好的一个一个方法,我说这个结果,那有我有一个写的好的那个,我测试完全没问题的一个算法,先给他把这个结果拿过来,跟你被测试函数那个结果进行比对,哦,发现正确,说明你这个也是稳定的,明白我意思吧,这才是一个测试的本质,如果只看这一个,你会觉得很无聊吗?这个东西。所以这个东西,这个东西肉眼就就看出来了,对不对,但实际上我们开发中遇到的问题很复杂,不是你想的那么简单,将来这个测试数据可能是个循环读取的,就是测试的数据是是很多的,然后要测试很多次很多次才确定,才确定这个函数是稳定的函数,这模块是稳定的,你要这么去啊,你要这么去思考的话呢,就觉得这个有意义了。
32:01
啊,你要觉得诶还真是有点意义,你如果说你你不这样,那那这个就没有意义,意义不是很大,好所以同学们要要去放在一个更更高的一个层面来看待我们这个测试,呃,单元测试的一个价值啊,面试官问你,但是发现诶这个人可能有点开发经验,对吧?好的,你说一下。嗯。对,第一个就是这个。哪个就这个地方是吧。啊,这个地方有没有返回值,其实非常简单,我们看一下这个手册,一看就知道了,来打开我们的这个testing,啊,打开我们的test,因为它这是有个案例的,我们发现呢,它没有返回值对吧,这个很确定它是没有返回值啊对。它实际上。嗯。我是处于在一个支部。
33:04
于是呢,我写那个开发支付的时候。这个上那一个单元由我们来。对,就是。但是呢,有一个哥们呢,假设他是负责那一个。或者是他负责产品类。对,那么所以那一块的逻辑。那假设呢,在这个过程当中发过或者。我们通常会先看那一个支付,或者退退款那个。那过程里面的那个,呃。单元测试那一个流程是不是走得通?最后就收到一个产品的们。那个。就是支付或者退款那边那些模块少一些。过来这边用,因为他要先看你那个东西能不能走得过,然后他才能够让他那一个所谓的单元测试那个流程能够走得通。你那边走不通,他就直接。测试他就会报告,就是前面,这就是他走到产品的流程的时候,实际上那个错误是出现在另外一个模块的,对吧,另外一个模块的小组,他就叫到另外一个小组的模块。
34:10
就是那个过程呢,能够过得去的话,他就知道其实那一个支付模块或者退款模块。那一些人呢,没问。玩笑就是就是那说的,最终走出来那bug。是在我我明白你意思行,我明白这里面呢,好像它的顺序以及它的相互关联用性。对,这这也可能就是说你的意思就是说,呃,有一种情况就是说我们去测试一个,比如说我们测试test的at up这个函数,但这个函数呢,其实它又调用了很多其他的地方的,是这意思吧,就说比如说比如说这边我们有一个张三写的啊,OK,我们这样分析一下就行了啊张三张三里面他他写了一个文件,比如说叫我们就叫张三,张三点构吧,好或叫李四点构,比如说这边还有更复杂的,可能张三又去叫别的了,这这个很很难讲,对不对,好,那比如说这个李四的啊,这是李四的。
35:05
在李四写的呢,它的理四点构啊,那么这个李四和张三里面,它有很多的函数,就它有它有自己的函数一啊,当然还有函数二,我就不写了,函数一对吧,还有函数二啊,这边还有很多还有很多。OK,呃,然后呢,我这个我在测这个函数的时候,比如说这个T的at up这个函数,那这个函数里边呢,对这个函数里边呢,他又去,诶,他又去调用了李四的啊,他又去调,他在这里面他用到理四的这个函数函数一,甚至诶他有可能用到了这个,呃,他用到张三的,甚至还用到理四的函数二,那这样子的话呢,就就有一个问题,就说当我测试这个地方的时候,可能这个结果它是不正确的,但这个结果到底是这个这个函数带来的,还是张三的函数一,还是李四的函数二带来的错误,是这意思吧?啊这样就不太好定位,不太好定位。
36:03
嗯。对,就是如果是。他知道就是测试人员,他是知道那个单元你是哪个模块。而他在开发的过程中当中呢,有时候那些人会就是比如说我是产品模块了,那么我会看你出模块的东西的时候,我不会看你原代码,我只会看你写的用例。对,因为我会调你的用力,我看一下你用力保的什么结果,然后他再功能。对是这样子的啊呃,关于这种问题呢,它解决方案第一种就是细化,第一种细化就是说你这个张三写的一个函数,你这个张三写的函数和李四写函数,一个函数,它一定是要完成一个功能的,它一定会有一个准确的一个结果,这这点大家必须要接受。也就是说,也就是说我的一个比较简单方法,我虽然不能定位这个,但是我可以先测,我每一个函数,我都可能要测一下,做一个严谨的一个产品,或者是这个产品本身,它这个呃很重要,那么我肯定张三的每一个函数,它都应该做一个小测试,它确保它的这个没问题,那么没有问题的话,我再测一一,如果一旦错了,那肯定就是他的错误,这是一个方案。第二个就是刚才就是那个小夏说的,那么我们每一看书也也是有适当这个日志的,对吧?日志呢,我也因为我在调的时候,它本质仍然是通过你去调,再调它,那你们出错了,他这个错误日志还是能够体现出来的,还是也也能看到。
37:28
也能看到这个日志,但是这个日志呢,肯定要有个格式了,每个我们就只每一种语言,它有自己的这种日志,这个日志它是很详细的,什么时间,哪个文件,哪个模块,它甚至都可以直接定,直接把它打出来的,一般日志都有这个功能,现在日志都可以自定义的,像Java,像这个bap,它都会这样定位,说是哪一个文件,哪一个函数,那直接就可以看到是哪一行啊也可以定位,这两个方式都可以解决好。啊,如果还有什么想法,什么私下里再去交流和沟通啊,交流沟通,但是这个呃,小鹏提的这个问题呢,还是非常好的,一看就确实说做经验做开发,他想到这去,诶怎么去怎么去做这个事情。
38:09
好,我们先截取一段视频啊。
我来说两句