粉丝2201获赞1.4万

大家好,今天我们来学习一种,就是针对任意家务的应用,然后呢进行快速默克的一个这种,而且是无侵入式的配置化解决方案, 然后怎么弄呢?嗯,我们先讲一下,就是我们现在是怎么默克的,比如说有些应用来讲 画个图吧,比如说这也是后端业务系统 啊,有有些系统 这种在被掉进来的时候,呃,掉进来的时候呢?他怎么进行默克呢?呃,其实如果去改代码,大家显得想的就是最简单的方式啊,大家可以用这种,比如说 lp, 用 lp 来干这个事情,但是呢这种的话其实大家是需要你去改造这个业务性的工程,然后这个工程里面你要去定一些 lp, 然后呢需要针对就是每个方法或者每个一样去读一些配置,但是这些东西就是全需要我们在代码里面先写好,而且这个墨客的话,到时候大家 还得去区分环境,就是这个墨客你最好不要流到产线上去,因为墨客来讲就是能干墨客这个事情。就是除了就是我们那种 嗯,限流、垄断、降级那种去返回一些默克的数据之外,基本上对于这种默克来讲都是我们测试需要模拟的一些测试数据,所以 对于 lp 来讲他可以干这个事情,但是大家为了严谨,最好在测试环境去注入这个 lp, 这个时候大家可以利用那个呃 并 fx plus pro cs 来干这个事情,就是当属于某种环境的时候才把这个 lp 注入进去。 呃,其实大家说白了就是当你的环境属于测试环境的时候,你才将这个 lp 注入进去,然后这个 lp 在测试环境,他就能去 针对你的请求进来的时候,当出现异常的时候,或者说我一定要干漠河这个事情的时候,我才会去从某些地方去读数据。好,这个读数据从哪来?对于一些,嗯, 企业来讲,你可以简单操作,就是存储 媒介,这个存储媒介你可以读文件,也可以读数据库,也可以读配置中心,这个就看大家怎么用,反正对于测试环节来讲,只要大家用的方便, 你就放哪里,然后呢?存储每件,你既然要存这个东西,你测试就想测的方便来讲的话,那么你一定到时候会还有一个这样的页面,这个页面来干这个事情 就是页面配置,那么通过这么一处理的话,相当于,哎,我用 lp 好像也挺灵活来干这个事情的, 反正大家测试也挺嗨皮的。好,那如果我的假设我现在是一个业务系统,那我现在我假设有成百上千个应用都需要干磨合这个事情的时候, 那你这个 lp 来讲的话,呃,是不是需要大家都去改代码了?哈?你可能又有人会去想,我把这种 aop 的功能,我把它打成一个架包, 好,我打成价包的时候,嗯,我让对应的业务系统去引这个价包,那你引这个价包的时候是不是还是得让人家去改代码,是不是?所以呢?我这里现在需要,嗯,跟大家讲的就是一种,就是说 我既要实现墨客的功能,我也不需要这个业务系统改任何代码, 就是直接简单配置即可。好,那我接下来怎么弄呢?其实很简单, 就是不知道大家有没有听过这个东西,这个把它断掉,这个没用了, 就是不知道大家有没听过这个加我 aj, 加我代理,这个功能很强大,就是他 有两个主要的方法,嗯,比如说吹闷,然后呢?还有一个背见的闷, 这个是他定义的规范,这个就不需要去纠结他的名字为什么是这样的。然后呢?这个 pramam 的话, 他顾名思义就是在没有方法执行之前,比如说我们的 suv 不特应用的话,那 我们有一个慢方法,就是去正式启动,然后普瑞曼呢?就是在慢方法执行之前 之前之前是哪个之前呢?其实是在程序的时候把我们的驾包里面的文件加载到 加载出来的时候,正准备去漏的。呃,生成真正的符号引用这些事情的时候,然后呢 还可以对他做一些修改,修改完了之后,这个时候才可以正式放到内存里面去。然后 a 性成分的他 这个比较特殊,他特殊的是在于就是说 pro man 他只是在卖方法之前来干这个事情,然后 aj 的 man 呢?他可以在我的这个业务系统运行的时候 来对我的业务系统某些类,就是可以说是任何类进行重定,重庆定义,或者给他增加一些什么, 呃,方法呀,内容啊什么之类的,所以他这个还是有一点强大的。所以呢,我既然想干墨客这个事情, 所以我可以这么弄,就是比如说我采采用 pen man 来干这个事情的话,那我在我程序启动的时候,呃,我就可以将这个 有配慢的,哎,我这里写个加薄吧,这样我到时候讲的时候方便点,就是 比如说我这里有一个,嗯,墨壳 a 检测点价,好,我有个墨壳 a 件的点价这个包, 那这个包的话,呃,到时候我们只需要在加瓦干价,比如说干我的 app 点价在前面,我加瓦 a 检测, 然后叉叉什么某个目录,然后莫可干 a 检测点驾, 我只要在我的启动命令里面干这个事情,那么我就能加载这个价。那加载这个价的时候,他拍卖方法里面他有 有两个方法,一个方法是有那个也是穿因,就是那个叫叫叫叫叫因,是抓因,是 抓特抓选抓特闷, 可以选一个一个这样的类吧?这个类里面其实就是能对嗯,我们的类进行重新加载,就是他可以将 一个卡死文件然后加载进去,也可以就是针对某些类进行再次修改,修改完了之后再次加载。 好,那我们讲就是朋友们里面有这个方法不?有有有,有这个变量,那这个变量 我要执行 proman 的逻辑,那这个逻辑呢?他可以干这些事情,就是执行逻辑之前我可以去看一下我的存储每件里面有多少默克的配置,然后呢? 我拿到这些所有的默克的配置之后,然后我再来看我所有加载了加载拿到的所有的卡是有哪些。我这里有个集合 a, 这里有个集合 b, 我就看我的集合 b 有,就是相对 a 和 b 取交集吧,取完交集之后我要针对剩下的人那些 累或者方法做我的逻辑,其实做逻辑就比较简单,怎么简? 就是我既然能拿到这些类了,那我拿这些类其实我就能拿到他的所有的方法,拿到所有的方法之后,我就能在方法的前面加一些逻辑,然后方法的后面加一些逻辑,然后可到时候又有人会问,就是我怎么去给他方法前面加逻辑和方法后面加逻辑的,呃, 大家推荐大家用加瓦四层这个东西的话,嗯,比较人性化的操作。呃,他底层封装了一些 a、 a、 s、 m 比较难懂的一些 api, 所以你用加 ys 的话,他可以去,比如说银色的皮肤,银色的阿福特,然后 a、 d、 d, case 这些 app 都能帮你来针对某些类的某些方法前后来干 一些事情。就是当你这么操作之后,呃,是不是最终走完之后?以前就是以前那些累,他是没有新增的一些 方法,但是经过存,经过存储媒介里面拿到些配置之后,给他加了一些方法之后,就是变成一个新的类,变成一个新的类,然后就通过他他就可以加载进来。那加载进来之后下次再调接口的时候,其实 你认为以前的 a 类似 a 的这个文件是没有一些什么前面的逻辑,其实现在已经天然就有了。当你去 掉这个 a 类的接口的时候,爆了一场之后,他一场里面他还能做一些逻辑。就是, 呃,你的逻辑就是我要么就返回我一些默克的数据,要么就是我怕遗产,这些都可以通过存储每一这个配置里面该怎么来定义好?当我正正经经把这个默克 a 键的 价包然后写完之后,其实对于我一个后单业务系统,我要想去实现我的墨客功能的话, 其实我是不需要改代码的,我直接通过这种命令来搞定就是了。然后假设我后面还有成百上千的业务系统也需要干这个磨合的事情的时候,我只需要让运维写个下脚本,然后把 所谓的应用把这种命令给他添加一个这样的,嗯,价,价格就是价位 a 进程,这样的话我所有的应用都天然支持这种功能,只是说人家怎么配, 那配的话,那到时候这个纯种媒介就可能需要大家去想办法,就是让所有的业务系统都能去这到这个地方去配,那你到这个点配。没关系,反正我每个应用我都能去纯种媒介拿到我当前应用的那些配置,然后就 ok 了, 然后即改即生效。 呃,这里要提到一点的就是说,呃,这里是在,嗯,我们启动的时候会把这些配置加载进来,然后 我刚刚说的就是几改的,几改其身下是需要我们另外一个啊 aj 的闷来干这个事情,然后呢? aj 的闷的话, 你想干的这个事情其实还需要借助另外一个类,呃,就是就是虚拟那个意思,然后, 哎,就是加把虚拟机的意思吧,那个单词我也不记得写了,没信, 我不记得起了,就这样,就是加瓦虚拟机的意思,加瓦虚拟机的意思。这这个加瓦虚拟机呢? 他有几个方法,比如说他有 app 啊,应该是还有个 titty 还是 addthit 区了,我不记得了,然后还有个 add a 检测,呃,他这两个 app 是干干什么事情的?就是,呃, 比如说你这个业务系统正在运行,然后呢?我我还有一个应用程序, 没错,硬 应用程序 b, 应用程序 b 他跑的慢,方法, 他跑的慢,方法,他就会调用 worch 迷信 呃来做一些 api 的操作,做这些操作的时候,他就会把我的麦克 a 检测去 add 进来, add 进来之后,但是想你 add 到哪里去呢?这个时候而探险就有用了,而探险就是说我要探索到这个后端业务系统这个进程, 那然后大家想我探索到这个进程了之后,我用的 a d d a 卷头,那么我这两个 a b i 一操作完之后,其实我就能把这个摸个 a 卷头,然后怼到这个业务系统,然后真正怼到怼进去之后,他 aj 的闷的方法会执行,那执行的时候我又能去把村子,村子每一件里面东西拿出来,拿出来,然后去刷新里面的一些类,那这样的话 a 型的闷才能帮我们干这个运行时之后的一个实时更新的一个这样的动作,而普瑞闷只能在启动时刻干 这个事情。好,那今天讲的就是怎么去针对我的加瓦宴去快速默克,而且要做到无侵入式的配置,这种其实不管是在嗯 嗯一些小分子,或者说在一些大分子来讲,就是这种操作其实对我们测试很有用, 而且对于开发去模拟一些场景,就是特别是在连条的时候啊,比如说上有他写的很快,你下有没写完,你只是把借口定到那的时候,那下有什么可能等你下有写完才能干这个事情?那么没关系,我漠河的数据一 怼上去,那么上一个他就开始自己慢慢去验证一些功能,当你下游写完的时候,其实差不多真实的数据也出来了,到时候我把再把这个幕后关掉,然后就可以正常的连条了。好,那今天就讲到这,谢谢大家。

好了,那么接下来呢,我们来为同学们呢介绍一下单元测试,那我们说过单元测试是对程序是不是进行测试的,嗯,好,它具体是什么样子的呢?它的单元测试呢,就是针对最小的功能单元编写测试代码, 并列测试代码干嘛呢?是不是测试我们的程序的正确性呢?那么加号程序的最小功能单元呢?是方法,因此呢,单元测试就是针对加法的方法的测试,进而呢检查方法的正确性。 好,什么意思呢?比如说这个企业里面呢,你开发好一个系统,它里面可能有成千上万个方法,那我怎么去确定这些方法他有没有问题呢?当有的时候我开发的时候,我就,我就会去测试他有没有问题啊?那个只是你自己是吧?在写的过程中做了一些细微的测试,但是一旦 整个项目做完之后,那么别人有没有影响你的方法,或者说以后你的系统在其他地方去部署的时候,新环境你是不是还是要测试一次的?你怎么能确定你的系统在任何地方都不出问题呢?你都要进行什么是不是方法这些性测试啊? 这样才能保证你整个系统是不是更加的稳健啊,然后不会出 bug。 所以编写测试代码是很重要的,那我们一般是针对方法测试啊。好,那咱们目前是怎么去对我们的这个代码进行测试的?嗯, 咱目前对咱们代码进行测试,是不是咱们自己去写了一个闷方法呀?然后呢就去调什么,是不是调这个方法,然后看他跑的结果对不对?有没有出异常吧?对,咱目前就是这么干的。那么你目前这样去测试这个方法的话,会存在什么问题呢?好,首先我们的内中是 只能写一个闷方法呀,那如果一个方法测试失败的,其他测试方法会受到什么影响?比如说我去查这个所有学生的时候,结果在查所有学生的时候崩了, 那后面这些方法有没有机会跑了?没有就没有了,所以这样并不好,对吧?那有人说我每一个都加个拆盖机,那是不是很麻烦呢?好,所以这是目前存在问题。还有一点是什么呢?他无法得到测试的结果报告,需要成员自己去观察观察这个测试是否成功。 也就是说他直营一个,你是不是要去控制台看一看呢?他没有办法生成一个测试报告的。而且在企业里面你项目上线的话呢,如果你在这个服务器环境去测试的话,那他可能是没有控制台的, 那你这个测试信息你怎么去收集呢?所以他没有测试方法不方便。好,第一三点的是无法实 自动化测试。什么叫自动化测试呢?你想以后我们的项目它里面的方法可能有几万个方法。那你,你不可能说每次是不是一个人去跑啊?你是不是到处去找没有方法去跑啊?那你测试一次的话,你可能 是要跑一天呐,你到处去找累,到处去跑,没有方法,那怎么靠谱呢?那我们如果用用我们的某些技术的话来进行测试的话呢?人家做的话,测试的意思是这样的,人家可以一键把几万个方法全跑晕,直接按一个按钮,然后就全部一个的测试, 知道了吧?他可以,所以说我们问法是不能实现自动化测试,而以后人家有些技术是可以实现自动化测试的。好,那么既然我们说目前的这种测试方式不好,那么就要知道单元测试有没有一些比较好的方式进行呢?有叫借用那些单元测试框架, 这是一个框架,那么经历呢?是使用加语言实现的单元测试框架,他是开源的,也就说他是有什么前人或者一些 牛的一些公司是帮我们做好的一些技术给我们直接使用的。对,好大据啊,加纳开发者都应当学习并使用简体编写单元测试代码,对我们的程序进行测试,可以说他已经形成的加纳标准测试知识,标准测试技术, 也就说全球所有的乘务员可能对代码对加代码进行测试,可能是不是都会用到这样一个工具啊,这样一个框架来进行啊?那么此外呢,几乎所有的 idea 开发工具,就是 id 一开发工具啊, 都会集成我们的节能题,包括咱们 idl 是不是也会集成节能题框架啊?这样我们可以直接在 idl 中编写并运行节 具体测试。也就是说咱们的 idl 其实已经整合了这个知识啊,你可以直接拿来用的。那么吉利目前最新的版本是五,但是咱们可能会用四,因为同一门的这个 idl 有的版本是比较老的,它可能里面整合四整合的是比较好的。 那你用五能用四其实都可以,就像我们用 j d k 八或者用 j d k 十一,可能我们用的技术是不是还是一些经典技术啊?没有关系,对吧?好,那我们到时候可能会选择用 j d k 四啊, 那么锦鲤这样一个单元测试框架来帮我们进行方法的测试,他有什么优点呢?好,他优点是这样的,他可以灵活的选择执行哪些测试方法,可以一键执行全部测试方法,也就是说在某种程度上,人家是不是可以实现自动化测试啊?比如说我项目要上线之前,我把急用题刨一把,他就 可以把我的项目里面所有方法全部测试一遍,他是有能力全部做到测试的,这样我就可以知道我的所有方法到底哪些成功,哪些失败,对吧?或者我的业务一旦修改了,我,我没有安全感,我也可以再测一次。 那么第二点是他可以,他可以生成什么呢?全部方法的测试报告就哪一方法正确,哪一方法失败,他都会给你显示出来, 他可以一键生成测试报告。然后呢,他的这个形式就是这个样子,是吧?比如说这个方法失败的,他是红色的,成功了就怎么样,绿色的,他都会很明显的提醒出来啊。那第三点是单元测试中的某个方法,如果测试失败的,他不会影响其他测试方法的测试, 因为他的每个方法可以说都是独立进行的。然后呢,即使抛了异常或者失败了,他不会干扰别人的,别人的方法的这个测试啊,所以他是很灵活的。好,关于 精力单元测试框架呢,我们就介绍到这,接下来呢,我们来总结一下,那么精力单元测试是做什么的?嗯,他是测试我们是不是方法的正确性的对,好,那么精力单元测试的优点是什么呢? 首先人家是不是可以实现某种程度的自动化测试啊?他可以选择执行哪些测试方法,或者一键执行全部测试方法的测试,但是你一定要注意啊,前提是你要写测试方法了, 公司里面你的项目做完之后,你还要写一些测试方法是不?来测试你的情谊中的方法有没有问题啊?他一般是一个方法对应一个测试方法, 到时候你才能去一键把这些测试方法跑完的。那第二点是只有你可以生成测试报告,如果测试良好是绿色,如果测试失败是红色。第三点是单元测试中的某个方法测试失败不会影响 其他测试方法的测试,当然他有很多的优点啊,我们这里只是说一些大家能够直接能看懂的一些优点啊,那我们先认识他对吧?我们就说到这下节课我会带着同学们呢去用节省力,是不是进行快速入门啊?来教同学们如何去测试方法。 好,咱们呢就先说到这,好在上节课呢,我们已经为大家介绍了单元测试的一个概数,那我们知道他是对那种方法正确性是不是进行测试的,那么接下来呢,我们要带着什么呢?去快速入门啊? 那我们知道单元测试我们用的是什么?是不是用的是杰伦尼这样一个框架啊?那我们怎么去用他对方法的预计结果或者针对性进行测试呢?好,那我们首先分析一下,那我们第一步一般来 会将框架的架包是不是导入到项目中啊?对啊,这是别人第三方做好的技术,一般是不是都要倒进来,那么这架包呢?我其实已经放在课件里面,那第二步我们要做什么事情呢? 第二步其实我们就是相当于是要把这个盈利驾包是不是放到一个来宝包里面去,然后把它再加到我们的依赖库啊?还有印象吧? 好,那大家注意啊,我们埃利尔通常已经整合好了节省力框架,我说过他是不是属于标准测试框架,那一般来说我们的工具会整合好他,既然工具已经整合好了,我们一般是不需要自己去把这个驾包考进来的。 一般 idr 是有的,但是我们会发现很多同学的 idr 呢,他其实并没有提前就把这些价包呢下载下来,他虽然能集成,但是没有下载。所以说大家在用这个经历的框架时候,你最好先怎么样?先联网, 第一次联网就可以了,他会帮你把这个价格下来,自动下来,从此以后你就再也不需要打了,知道了吧,但如果你第一次联网下载失败的话呢,那就麻烦一点点,那你也可以采用什么? 是不是采用手工导入两个架包就可以了?这两个架包我待会会给大家的,大把这两个架包考虑到你的什么项目的来本里面去,然后把它加到依赖库啊,跟我们之前导法是一样,这真的鱼是没有整合好的情况,你最好联网整合好就可以了啊。 好,那我们第二步要干嘛呢?第二步我们就可以编写测试方法,然后该测试方法必须是公共的无参数、无法位置的非静态方法,也就是说要做成实力方法, 意思就是说这个方法只是帮咱们去刨一刨,调一下某调一下我们自己写的方法对不对就完了,所以他的要求是公开,无参无返为止。第三点是我们要在侧 方法上使用一个叫 ad test 注解,标注该方法是一个测试方法,那你加这个 in test 注解是非常重要的, 这个才是能够真正声明,是不是这个测试方法是一个测试方法呀。第四步呢,我们在测试方法中完成被测试方法的预期针对性测试。 好,这有点绕,但一定要注意啊,测试方法他只是一个什么工具方法,他是对你项目中的一些功能方法是进行测试的,是吧?所以我们应该在测试方法中完成被测试方法的预期执行性的测试,比如说你可能只是调一下,看看有没有抛异常 或者预期,这个方法应该返回一个什么结果给你,这个都可以用一些程序去实现。那最终呢,我们要选中测试方法,然后呢选择节能体运行,如果测试良好是绿色,如果测试失败呢,是红色。 那么这就是我们单元测试的一个快速入门的过程。好,大概明白这个过程呢,详细的使用,咱们还是到什么 id 中心演示一下。好,那我们从这边呢,打开我们的 id, 在 id 这个位置呢,我已经为大家建好了一个模块,这个模块呢是单元测试反射注解和做代理应用的意思, 在这边呢,我已经为大家建好了一个包,叫第一杠 unitty。 那我们来思考一下,我们用解 unit 做单元测试。首先我是不是要有一些业务方法呀?对,为什么要有业务方法呢?因为我是对方法真实性进行测试的,你要给我一些方法,我是才能对你进行测试啊。对,所以我模拟的一些业务方法啊。 那这个业务方法呢?是干嘛呢?就是帮我们呢,用登录名和密码是不进行登录的,登录成功就成功,登录失败就失败。然后呢,我这里面可能还有功能呢,是查询所有用户的名字。 那以后开发手这里面可能会有四五百行代码,可能是会出异常啊,所以我在这里面呢,直接写了一个异常模拟这个方法,是不是到时会出 bug 啊?好,那接下来我们要对他们进行什么 正确性?是不是测试?那怎么做呢?按照节律框架的观点,你首先是不是需要单独写一个测试类,然后写一个测试方法呀?知道,因为你要写着代码才能做测试啊,所以我们会在这个地方呢,右键另一个类,那么这个类呢?我们一般把它叫 test, 加你的业务类的名字 use service, 这样就代表我们的测试类是不是已经有了?测试类是独立出来的,所以他要单独写的。然后呢,我们第二步要干嘛呢?第二步是要写测试方法啊。好,我们一般采用什么呢? 一个业务方法对应什么?一个测试方法都有自己专属的测试方法。那我们应该怎么写测试方法呢?好,其实我们可以这么写啊,他应该是一个公开的没有返回值的,是不是也没有参数的?而方法名我们一般习惯性的把它叫 test, 再加上被测试方法的名字, 这样别人一眼就知道你是对按照登录名进行登录的。这个方法是不是进行测试的?对,好,测试方法呢?注意点,我来为大家记录一下。 第一点是什么呢?它必须是公开的无参数,然后怎么样无返回值的方法。 好,这是关于测试方法的注意点啊。第二点是什么呢?好,一定要注意一下,测试方法 它必须使用 at test 注解是标记啊,所以说还要注意按照框架的使用来看的话,我要用 attic 注解,这很明显是不是属于别人框架的东西啊,我是不是应该把急用的框架导进来啊?但是我刚刚说过了, idl 其实已经是不可以自动整合节能力框架,所以我们不需要倒进来啊,你不需要说在这里建一个莱宝包,然后怎么样再把驾班考进来的,它可以自动集成的。那怎么做?你直接写一个在这个地方。 好,那现在肯定是没有倒进来的,对不对?他虽然说 ida 可以集成,但是没有把这个价包关联进来的。那么当第一次倒的价包的时候呢,建议你们联网,那这样你的 id 如果没有这个经济框架的话呢,他会去网上把它下来,知道吧,以后就不需要再联网, 就永远就有了。那怎么做呢?好,我电脑已经联网了,我只要按二的键加回的键。他这边是不是有一个接力四和接力五两个版本的?那两个版本的都可以用法的,其实都差不多, 那经历四呢?比较稳定,大家应该知道老版本是不是相对来说比较稳定啊?是,所以我们就用经历四。好,那我就选择第一个,然后呢一回车他就说我要把经历四导到你的。什么,是不是导到你的项目中来啊?那我就直接点确定呗。 ok, 直接这边点确定就完了。好,这个时候大家会发现下面就会出现一个金绿色的一个什么框架包,是这两个架包,我这边是不是也已经可以使用了?是,已经倒进来了,那朋友们如果倒失败了怎么办?你可以把这两个架包是不是考到你这个 level 里面去,再把它添加到依赖库也可以啊?对,也行的,那也是一种方法, 所以我到时候把这两个价包发给朋友们的。好,那这样我的这个测试方法其实是不是有了?接下来我要正式进行什么是不是业务功能的测试了?那么业务功能怎么测试?是不是应该是要创建一个业务对象, 因为这些方法都是什么实力?方法是要拿对象掉,然后呢,我再来掉他的一个方法叫 login。 假如说我现在认为登录名是 at 密,密码是一二三四五六。 好,我这是一个正确性的一个测试,也就说我认为我这次测试是不是要登录成功啊?很明显,我一开始就确定的是 s b 和一二三四五六嘛,那我这边就怎么样, 是不是可以拿一个电量去接他这个登录的结果呀?对,好,同学们想一想。那么我现在预期这个结果应该是正确的,但是团队开发的时候,我的项目 代码是不是有可能会被其他成员动啊?大,在一个项目里面开发,那万一别人把我的业务动了,我这个方法是相对就出了 bug 啊,我这边是不是要反应出来啊?所以经历夸奖,其实他也提供了一种叫预期正确性测试的一个知识点, 你可以去测试你这个结果是不是你预期的结果,如果是测试通过,如果不是呢?测试失败,他不一定非得说看这个有没有异常的,他也可以预期正确性测试,那怎么来进行什么呢?怎么进行 预期结果的正确性测试呢?好,他用了一个知识叫淡眼 大奖。断言什么意思?断言是不是预言呐?我断言你将来怎么样,会出人头地,是不是?这个意思?是,所以说你要进,那你说我现在要断言这个 rs 结果是不是应该是登录成功?万一 以后代言失败说明怎么样?别人是不是动了我的业务啊?对啊,肯定改了我的数据,对不对?我可能一定要这个数据吗?来怎么代言呢?人家仅用的框架也提供了一个东西给大家,大的可以了解一下,我们毕竟是快速入门,我直接带大家用就可以了。他有一个类叫阿瑟特,这个单词就是断言的意思, 是不是这个人家的框架提供的?对,肯定在框架里面,可以去找一找呢?答个经理题,然后呢,在经理这个下面,是吧?继续找 在这里,对吧?然后呢,你看这里有一个是不是叫 authort 呀?断眼,你可以直接调这个,它里面有个方法呢,叫 authort s e r a s s 一二七,然后呢?有个叫 equers, 是代言结果相不相等的问题啊,你看他可以呢,填一个 什么?期待值和实际值,是不是代言这两个结果是不是一样的?对,然后你你,你看这个,他有个期待值,实际值前面还有个消息,我们一般用这个方法,前面这个消息代表是代言失败提示的消息。好,那我们应该怎么办呢?在这地方,比如说一旦代言失败,我的这边提示 您的怎么样?您的公认业务数据是不可能出 bug 啊, 或者就说你的登录业务可能出现问题,是不是提醒别人有这个错误?然后我们刚刚说过了,你要代言结果的话,你是不是应该填一个你期待值啊?那我期待值是多少啊? 是不是登录成功啊?要一模一样,你必须这个值一模一样,有的时候他在这边随便写这么长,打个感叹号,那你能期待人家后面带感叹号,你怎么能确定呢?你要看人家这个 结果嘛,对不对?你是人要代言的。然后呢?然后这个地方再来写个什么呢? 它这个地方其实是填实际值,实际值是 r s r s 是代表我是不是实际。呃,那就不对,实际值还是要放在哪里呢?放在后面。嗯,他刚提示我,我以为这个是放在前面的。好,这样就对了,这是不是期待值啊?他这边有提示,这边是什么 实际值?实际值是不是由你自己是不是测方法得到的结果呀?对,好,那我们这个测试方法其实就已经怎么样?是不是已经写好了?现在我是不是可以进行测试了? 好,怎么测试呢?你可以在这个方法任何一个位置直接右键就在这个位,任何一个位置都可以啊,直接右键,然后你会发现这边是不是有个叫 run test logan name, 是不是直接是执行这个单元测试类啊?他不是 笨方法,但是人家是不是一样可以跑?你看点一下,点一下就开始进行单元测试了,好,然后执行完之后呢?你往下看。我之前说过,我说绿色是怎么样 是成功,他现在有没有出 bug, 没有,说明我这个业务功能有没有毛病,没有。好,我再举个例子,比如说有一天有个成员呐,他不小心是把我的数据动了,或者这个数据是从其他地方发过来了,那这个数据是不是很明显有问题啊?而我现在要求是一定要是什么 m 和一二三四五六,我的业务是一定要这样子,绕线能不能测出来?可不可以测出他的错误?能。 好,那咱们是不是也是右键刨一把,刨完之后呢?大家看,我们是能够把这个问题测出来的,他是不是已经发现是登录业务有问题?红颜色,而且他说到您的功能业务是不是可能出现 bug 啊? 你说这让我们感觉登录更具体。好,这样一旦别人动了我的这个方法正确性 动作这个方法导致正确性有问题,我这边是马上可以反应过来了,他说我期待的只是登录成功,而实意只是什么,因为我们以后的密码错误,我就知道我的登录业务可能有 bug, 我就去检查一下, 好,能听懂吧。那下面这个视频要查询所有的用户啊,所有用户的名字,我是不是也要写个测试方法?那这个测试方法呢?我们把它叫 public void, 比如说 test select names。 好,然后呢?我们在这边呢做什么事情呢?其实你直接去调一下就行了,调什么呢?调由得 service 点 service names。 好,那有的时候这里需不需要断言呢?你这里不需要去断言,因为你你这个方法是没有返回值啊,而且 代言,也就说你需要代言才代言,也不是什么时候都要去代言的,那就让我不用代言,那这样的好处是什么呢?这样做的好处就是说我就看这个方法是不是有没有出 bug 就行了,如果没有出 bug, 他这个调用是不是就成功了?对,如果出现 bug 呢? 这个钓鱼会失败,到时候测试方法会标是不是红红色给你啊?来,我们来测一下,这个方法直接右键直跑呢? test 的时候呢,有 lames 点一下好,点一下。之后呢,我们来看一看,红颜色的是失败的,他说你这个方法内部是出现一个处理异常啊,那不就知道,哦,我这个测试失败了。 好,这是单独测。那接下来我再给大家说一种测试方式,我可以把这个类里面所有测试方法是自动化的跑一遍,因为人家单位测试就是个一键测试吧,我可以在这个类上面的直接他是测试整个类,看到没有?就是跑整个类啊,跑整个测试类啊, 然后在这个地方任何一个空白的位置,右键也是跑整个类的好,跑整个类的话,你会发现他把两个方法是不是都测试一把啊?那这个方法黄颜色什么意思呢?黄颜色意思就是说你的方法可能没有出异常,但是你预期的结果是不是有问题啊?所以他警告你,警告你什么?你的数据是不是可能被别人动了? 这都是黄颜色,而这个地方红色就代表你的方法是不是真的出 bug 了?对,所以他这个测试报告很完整。那即使你这里有一千个测试方法,我也只需要什么一键,是不是就可以跑完了?是啊,你之前就不是这样的,之前你肯定要一个人去测的哟,而且中间出现问题,别的方法是不是就测不了了?他这个可以一起测, 这样在企业里面就是一种自动化测试机制。而且他更厉害的是什么呢?他可以把这个系统里面,就这个模块里面所有测试方法跑一把,你可以右键的。 那这里面其实有几千个测试类,几千个测试方法是不是都可以一键测试完的?你看我直接右键跑一把了,它可以自动去寻找了,是不是也找到这个类, 看懂吧,他这个就强大,人家一键测试完了。好,那回到我们的 ppt, 关于单元测试的一个快速入门呢?我们就说到这,那咱们来总结一下 杰瑞力单元测试实验的过程是什么样子的?第一步要干嘛呀?是不是要导入杰瑞力框架架包?对对,但是需不需要我们导啊?不需要,除非你集成是不是失败了,然后你才需要自己去导架包。自己导也可以啊,就自己把它拷贝到奶粉包里面去,加到依赖库。 第二点是定义的测试方法毕竟是无参数,还要怎么样?无法维持,而且要公开,因为你这个测试方法只是为了测试他不需要接数据,是 也不需要返回结果呀。是啊,第三点是什么呢?测试方法必须使用 attex 的注解标记,这样才能成为测试方法。 那么经历测试某个方法,测试前部方法怎么处理?成功的标志是什么?测试某个方法,你的光标应该落在 方法内部,测试全方法应该放在内上面,或者放在模块上面,是不是去执行啊?对,好,那就是这样,这样子就可以了,成功的标志是这样的, 红色失败,绿色怎么样?通过他身上还有些黄颜色,代表你的方法没有出异常,但是结果与你预期的是不一样,他会做一些警告。好,但是这个框架呢,我们就说到这。 好的,在上节课程中呢,我们已经讲解了单元测试的快速入门,那么接下来呢,我们来为同学们介绍一下单元测试的一些 常用注解。这常用注解呢,用的不多啊,我们了解一下就可以了。好,我们来看一下这些常用注解啊。 那么以经历四为例,他会用到这些注解,我们用的最多的是不是就是 attet 注解,这是测试方法是必须用到的,他有一个 at b for at after at before class at after class。 我们先看 at b for hp。 fo 呢,是用来修饰实力方法,该方法会在每一个测试方法执行之前执行一次。而这个 l f 呢,是也是修饰实力方法,它会在每一个测试方法执行之后执行一次。那这个呢,它是用来修饰静态方法,会在所有测试方法执行之前执行一次, 这个呢是修复进来方法,会在所有的测试方法执行之后执行一次。他们分别呢,用于做初始化资源和释放资源呢? 因为一开始做的事情是不是都是数字化资源的?嗯,最后做的事情一般是释放资源。好,这东西了解一下就可以。那具体是什么意思呢?咱们呢?还是到 idea 中呢?去演示一下,从这边打我们 idea 在列的位置呢?我再来为同学们来写个测试类。好,其实也可以不用再写,我们在这个里面呢,演示一下就可以了。他首先说了一个注解,叫挨着什么挨着 before, 人家的要求是他只能休日。什么?是不是只能休日?实力方法好,一定要注意啊。是休日实力方法的 好,那它是这样的,比如我写个实际方法就叫 public, 然后呢? void b for。 好,在这里面呢,我来打一段提示,这段提示呢是 before 执行一次。 邓老师,这个方法谁赢一次啊?当然这个方法名你可以随便写的,你写任何方法名都可以的。那我们再来一个注解,叫什么呢?是不是叫 at after a f t r。 好,这方法名呢,我也把它改成 after, 这里面的也改成阿普特。那刚刚人家说了,他们是怎么样执行的?他们是不是在所有测试方法执行之前执行一次?那么在每个测试方法执行之前执行一次,在每个测试方法执行之后是不是执行一次啊?那我们来试一下,假如说我把这个登录这个方法测一下。 好,测的时候大家注意看,执行之前执行一次,执行之后是不是执行一次啊?他这个异常信息,有的时候他不是怎么样,他不是,是按照顺序打的。对,这个不用管,但是你如果想看的更清楚,你可以把这个怎么样,是不? 我都改对就行了,改对然后再来跑,就能看的很清楚了。好,他是执行之前执行一次,执行之后执行一次。下面这个呢?你再跑一下,他也会出现执行之前执行一次,然后再执行。我们的是不是方法呀?在执行之后执行一次啊? 那如果整个类都跑一把呢?那他会出现怎么样?每次执行之前是不是都会执行一次?是不是这样子?好,那么到这呢,其实我们就已经介绍完了,这两个注解的一个什么呢?特点呢?那他其实还有两个注解,我们要注意一下。 那剩下两个注意是修是什么方法呢?好,近代方法呢?叫什么呢?叫 before class, 然后这个叫 after class, 那就把这个地方也改成 before class。 好,把这个改成 before class。 它是在类之前呢,那就在类所有方法知音之前嘛,然后这个呢?是 after class, 也就是在类的所有方法知音之后,是不是知音一次啊?那我现在呢,直接把这个类里面的所有测试方法跑一把。 好,就让大家来看这个结果。好,他这个地方是报错了。为什么报错了?他说你是无效的测试类的错误,啥意思呢?我们刚刚说过他只能修是什么 静态方法?因为你想他在累执行之前执行一次,那我想这个方法是不是肯定是有累来掉的?所以他应该是什么静态的?静态的方法是不是给累掉的?你再跑他就不会报错了。好,再执行一下。 好,同学们,看他打出来这个信息啊,你看在所有的测试方法执行之前,是不是他先执行这个 before 克拉斯啊?对啊,那 最后是不是一定是指引这个 up class 的,对吧?我们再跑一下来看这个结果,那就是这个样子,是吧?最后指引 up class, 所有所有方法指引之前指引 before class, 所以他们只会是不是各自指引一次就可以了。那这两个是跟着什么每个测试方法走的,所以他们都是 实力的一种形式,是吧?相当于跟着他每个人的测试方法对那个对象一起掉的啊?好,那大家注意一下是什么呢? 我们这些东西能做什么?我们一般在这里面做一些什么呢?做一些初始化操作,比如说我这些测试方法需要用到一些 io 流,可能每个测试每个测试方法都要用一个新的 io 流,我是不是可以在这边把这个 io 流先弄出来啊? 然后这边就可以怎么样?到时候想办法去访问,等用完之后呢?是不是再在 auto 里面关掉啊?那如果有一些静态 资源呢?假如有些近代资源,我是不是可以在这个里面进行初始化呀?近代资源初始化之后,然后后面是不是就可以用了?等所有的初始化用完之后,我再怎么样,在这边是不是在回收啊?好,所以这些东西呢,我们简单了解一下就可以了,知道它的特点就行了,作用呢,可看具体情况具体分析啊。 好,回到我们的 ppt, 我们就说完了这些注解,那大注啊,我们说的是经历四的注解,人家经历的五是不是也有注解啊?那他的注解是这个样子的,太子注解还是都叫太子的,那他叫逼疯,一起, 你翻一下就知道,这是不是就是实力方法在每个方法执行之前呢?这个是在每个方法执行什么之后?逼疯二是不是所有方法执行之前?阿普特在所有方法执行之后?这四个注解跟我们刚刚讲那四个,四个注解的作用是怎么样? 一模一样?指人家是不是改了名字啊?是,而且我认为他这个名字改的怎么样?改的挺好的,是不是更直观一点呢?是每一个之前,每一个之后,所有之前,所有之后,就对应我们这四个注解吗? 是吧?所以他这个方法取得还挺好的。好,关于这个常用注解呢,我们呢就说到这大,并不需要去 记这个东西,是吧?你知道了解一下,培养一下我们这种注解使用的思维就可以了,因为注解开发呢,在我们以后啊是很流行的。这是为什么?我要介绍这个东西,以后咱们做项目经常用用类似于注解的方式来实现一些功能啊。好,咱们就先说到这。

呃,我们来学习一下 jover 字符串。呃, jover 字符串就是 unicord 的字符序列。 jover 中没有内置字符串类型,而是在标准的 jover 库中提供了一个预定一类,很自然的就叫做 screen。 使用双括号括起来的字符串都是 string 类型的一个实力,下面这个呢,就是定义的呃字符串。 呃 string 类的 super string 方法,可以从一个较大的足串中提取一个子串。 呃,子串的代码单元和代码点是从零开始的。 substrain 方法呢,第二个参数呢,是不想复制的第一个位置,第一个的位置 upper string 的工作方式有一个优点,就是很容易计算出子串的长度,就是次服串这个 s s 点 super string 参量 a 和 b 的长度就是 b, 减去 a 拼接就是使用加号拼接两个组合串。嗯,图片中的这个例子代码的吃力大家可以看一下 啊。当一个字符串与一个非字符串进行拼接时,就是后轴会被转化为字符串, 类似于强制类型转换。如果把多个磁符串放置在一起,用一个界顶符分割,可以使用静态的招摁方法。 图片中可以看到这个召唤方法接收的参数可以是多个足串或者是一个,是第一个参,或者呢,第一个参数是是一个足串,第二个参数呢,是一个足串数组 啊,还有就是还有一个参数呢,一个类型的参数就是照完他第一个是 super, 第二个是那个 list, 这个呢是? 嗯,字符串呢,没有提供字符串的修改方法,就是由于不能修改字符扎入的字符串,所以扎入文档中,将 such 类 类型的对象称为不可变的不可变四五串。有一个优点就是编译器可以让字符串共享。设计者认为共享带来的高效率远远胜过与崎岖子串拼接字符串所带来的低消耗。 呃,检测字符串是否相等,就是可以使用 equal 方法来检测两个字符串是否相等。表达是是呃字符串 s 的依扣方法。参量是另一个组合串 t, 如果组合串 x 与组合串 t 相等返回处,否则返回 false。 嗯,组串 s, 嗯,和 t 可以使组合串变 量,也可以是字符串的字面量。要检测两个字符串是否相等,而不区分大小写,可以使用依靠一个脑 case 方法。下面的代码就是检测字, 就是检测自助串是否相等,区分不区分大消息。 一定不要使用两个等号的运算符来检测两个组合串是否相等。 如果使用两个等号来检测两个字符串相等的话,它是检测是否这两这两个字符串是否在同一个位置上,也就是在同一个内存的同一个位置,内存的一个位置上。 嗯,也就是检测这两个是否是同一个对象。嗯, zara 虚拟机 呢?只有字符串常亮是共享的啊,是用加号或者 substrain 等操作产生的字符串,他是不是共享的。所以说,千万不要使用双等号运算符来检测字符串的相等性 啊,以免在程序中出现糟糕的 bug。 这种 bug 呢,很像就是随机产生的间接性的错误啊,如果出现这种 bug 的话,会让人很头疼的。 空串与 no 串,空串呢,是一个 jover 对象,它有自己的长度和内容,空串的长度是零啊,代码检测空串是否为空,就说检查它的长度呢,是否为零,或 者他是否等一个两个双引号括起来什么都没有的双引号括起来的字母串,要检测一个字母串是否为空,就是使用 啊,就是 s, t, r 两个等号空字符串空对象。这种检测方式要检测字符串既不是 no 又不是 空串的话,就是使用这个方法,就是先检查是否是否是空,再检测它的长度。 呃,这个前他这个判断呢,用到一个语操作的呃,开语操作的短路的那种方式,就是说如果是空的话,第二个他就不会再直行了。 w 字母串呢,它是有差序列差值的序列组成,差是差数据类型呢,是采用的 u t f 十六编码表示的 unicord 码点的代码单元。 最常用的 unicord 字符使用一个代码单元就可以表示,而一些辅助字符它是需要使用一对代码单元表示的,也就是两个代码单元。 然而呢, land 方法,它是返回了 unicord 编码所给定字符所需要的代码单元的数量, 而而那个辅助字符呢,它是一个辅助字符,需要两个代码单元。所以说这个烂方法的长度,它就 是计算字母串的长度的话,它是不太合适的,要得到实际的长度。计码点的数量可以调用 coin the point coint 方法,它的参数呢,第一个指的是零,第二个呢,是这个司法单元 司马单元的数量啊。 呃,调用字符串的叉 ant 方法将返回位置 n 的代码单元, n 的值呢,介于零到呃这个字符串长度减一之间, 因为它那个叉 ant 中的那个变量,它是从零开始的, 就说传零的话,它是返回这个 ziphone 的第一个代码单元,下面这这个图片呢是一些例子,大家可以看一下。 要想得到第二个代码单代码点,应该使用下面的语句,就是说这是语句 hello, 如果想获得第三个代码单元的第三个码点的话, 要调用 oppo by collect point 方法,这个获取码点的,所以 马点的起始缩影,呃,再调用呃 called point ant 传,用马点缩影获取这个马点值。它 这种方法呢,如果有四五串长度小于他,你获取他码点,或者说有一些啊辅助字数比较多的话,他这个获取的话可能会出现错误,这就是越界了,可能会产生越界的这种情况。 嗯,这个字符就是一个辅助字符,用 unicord 编码表示的话,字符是这个值,需要两个代码单元,嗯, 这个呢就是这个辅助字符的 unicord 编码,我们打印出来的话是这个。 呃,计算长度的话,计算这个辅助字母长度的话,他是打印的是二,如果零,如果我们用打印 d 一个码点第一个代码单元的话是打印是乱码,打印第二个话也是乱码,嗯,我们怎么打印呢?可以这样打印,就是说 s t r call input ant, 这是打印第一个代码单元, 也就是幺二,他这个码点就是幺二零幺三四。如果想打印这个辅助字符的话,我们可以调用啊字符串的构造方法。 呃,传入这个这个勾的方法,传入一个 char 类型的纸,叫 char 呢,就是说 chat act to charts 方法,把这个码点传进去,它就会产生这个打印这个,把这个 char 转化成一个字符串打印出来。 如果要便利一个包含了辅助字符的字符串的话, 我们记我们用这种方式,首先这是一个辅助字符,辅助字符呢,包含了这里面包含了一个辅助字符这个东西啊,这样的话我们先获取 第一个代码,第一个呃,在呃第一个码点 执行的话,一开始先获取第一个马点,它这个是个零,我们把它打出来啊,然后再调用叉 act is support supplemental port 这个方法来检测它是否是一个辅助字符的开始部分, 如果是的话,那这个 i 值呢?是加个二,如果不是的话加一找一次打印出来,打印的结果就是这个,我们用倒着打印把这个字符串打印出来,就是这个 打印形式,是这个我们看先检测,嗯,我们呢循环的时候先检测他这个是否是代码单元的后部分, 如果是的话,我们再叫 i 呢?所以再减再减,减一,这样的话我们就要会去码点把这个打印出来,就是这个倒着的形式 啊,还有一种更容易的办法来打印这个来获取这个 啊码这个有包含辅助字符的码点,就是生成一个 int 的流,每个 int 对应的一个码点, 我们再把转化成一个数数,然后再完成便利,我们来看一下,这时包含一个辅助字符的字符串,我们把这个字符串 这个调用这个 call in the port 方法,它会返程返回出一个,返回一个 inter 流,我们把它转化成一个 are, 转化成一个数组,就是 inter 类型的数组, 这样的话我们在呃这个呢,是 every two screen, 就是说把这个呃因材类型的数组转化成, 嗯,转化成这种类型的 school 串,并把它打印出来, 嗯,把一个麻点数组转化成字符串,转换成一个字符串的话就是这种方式, 这是马点的数组,就是这个数组啊,转化的话就是 coin the point, 就是就,就表示这个数组啊,其实位置是零, coin the point 的数量就是这个数组的数量。构建一个字符串儿,你用 string, 这是两个参数, 这里呢三个参数打印出来,就是这个。我们在学习啊,怎么构建字符串,有时候需要较短的字符串啊,字符来构建字符串, 嗯,比如呢?键盘输入,嗯,采用字符串连接的方式,达到此,达到这个构建字符串的目的呢,效率是比较低的,每一次连接字符串都会构建一个新的对象,既耗时又浪费空间 啊。使用 stream build 类可以避免上述问题的产生啊,这是一个构建字母串的例子,首先呢定一个 stream build 的对象, 对象我们来找找,嗯,这个对象呢? a 啊, append 这个方法呢是追加的,还有一些其他的方法,大家可以查看一下这个类的 api, 这样的话,我们这个对象就要用这个 toose 出现方法,就构建了这个 zippershine, 把它的这个对象构建 zhoushine 转化成 zippoint 对象啊,这是那个打印结果。