00:00
啊,然后我们的另外一个呃参数默认值,这个使用的场景的话,通常是在我们的呃业务的框架里面会使用它的一个呃呃。案例呢,就是说比如说我现在有一个test的方法,然后他的一个ID就DeFine。的一个ID的一个参数,然后这个具体的时间就没有写。啊,这里的DeFine呢,呃,有一个好处呢,就是说这个ID我可以传in,也可以传string,也可以传成某一个对象啊这个都是无所都都是OK的啊,这是呃,它不同于Java的object object它其实就是一种,但是这个DeFine它不是不定的那种类型,你传什么它就是什么,而且它中间可以多次赋值,之前也是讲过的,就ID文上面传。啊,String后面把它改成int都是没问题的,然后我们调用的方法就那个test a啊这个里面那个引号没有打太好。
01:00
啊,比如说我们现在这个,因为这个方法嘛,可能对应的也是一个接口,或者是一种基最基础的一个逻辑,然后我们新增了一个需要新增一个time的一个参数,然后旧场景的测试用例,我都是这么写的,所有的测试用例都是test a。然后和TB啊什么的,然后我们可以把这个呃。在Java里面,它我们这种情况就需要承载一个test的一个方法,用来保证我们之前的用力肯定也是可以运行的,然后我们又可以支持我们的新场景。但是我们在。格位里面其实就不用去做这种。改造,我们可以直接在后面加一个。这个time的一个参数,我们让它默认是等于难。然后一般这个参数的话,它那个方法里面它会做一些兼容,比如说像杰森。如果你的Jason的value等于nine的话,你把杰转成呃,我们需要的呃,String entity接口传参的那个呃参数的话,它就会默认的会把这个Y6的值等于nine的可以给去掉啊,这里面啊,不同的阶层实现起来是不一样的啊,我是自己把它过滤掉了,这在框架里面自己做的。
02:16
所以就是等没资料等于那我就相当于认为这个参数不传啊。然后我们新的方法就可以test a,然后传一个十,或者说传继续。继续传一个引号的也是没有问题的啊,这个刚才已经讲过了,就是旧的方式完全建,无需增加新的方法重载,这个就极大的降低了啊,我们的框架里面的代码。模块类下面的方法的数量。这个也是一个隔壁背包的一个。它的一个使用吧,忽略报错,就是说我比如说我初始化方法的时候。嗯,假如说。
03:01
呃,就是这个场景我初始,但是有些很有可能有些用户重置的时候有可能会失败,或者说由于别的原因,呃,用户重用户重置失败,然后我就不用这些用户了啊,所以我们这里面就引入。重组失败,我们可能会有一些逻辑,他会有报错,报错就会阻断这个。呃。抛出来一些异常啊什么的,然后这里面我们就嗯使用了一个。啊,No a的一个关键字啊,这个关键字也是我自己自定义的啊,这里面的它的B包里面传的还是一个方法啊,它的一个啊,这里面是。呃,在GPC的时候,呃,用到的GPC的话,大家知道就不像atdp那种可以用一个统一的请求方法。我把所有的。不管是。嗯。呃,不同的项目,不同的模块,不同的接口,我都可以收敛到一个,就是我最终是把一个APP request对象。
04:04
啊,使用client,然后发出去,然后获取解析,呃,解析获取响应这样一个过程可以封装成一个方法,就所有的请求都会经过我这个方法,但是啊,GPC不是GPC,它没有。通用的一个啊,客户端的一个stop啊,他也没有啊,通用的就是request的方法对象,而且他也没有一个通用的望对象啊,这个就造成了一些困扰,这是这个是呃,我的。一个实践就是把我把所有的请求方法全都当成一个背包,由你来处理。然后。呃,这个就是。呃,这个B包去执行,也就是说我把所有的解决方案去执行,我得到一个响应,然后通过响应里面给他扣的。啊去呃,进行一个啊统计吧,啊,这都是我们的一个统计的一个类。
05:00
实现一个功能,如果它等于零的话啊,200就加一啊,大概是这样,然后如果这段这个呃,瑞。Response。他get code它本身是一个难,或者get code会报错啊,这里面就不不会这这一行代码就整个就会。就如果他能在get code,反正这个小括号里面出错的话,后面就不会计数,然后怎也不会影,因为这个方法是一个写的,是一个串行的,所以说它就不会进行一个。啊,影响到我们下面就我会把这个呃,Response给返回,然后不会影响我们的正常的用力的啊,那个结果的一些验证啊,断言这些功能。啊,这个是调用的时候,就是某一个staff,然后query的一个request就执行的这样的G事件。呃,还有一个部分就是格的一些隐藏技能啊,这个在测试中使用的偏少。
06:01
呃,但是。嗯,真正一。嗯,你真正能用到这些技术。嗯,技能的场景的话,你会觉得格瑞非常的牛。啊,首先呢。呃,隐藏镜就是这个Meta。呃,这个glass。啊。也不知道怎么解释了,就是大家看吧,就是我们定义一个。呃的一个类,然后这个类就是它的一些代码,然后它会就会有一个。创建一个对象嘛,当然这个类的代码里面全都是空的,大家可以理解为空,然后先用空参构造方法创建一个对象,然后。用它分项,然后点me class就调到me glass,然后点A等于二。点A呢,等于二,二是一个int类型的,默认的它是一个int类型的数字,然后它的呃。点A是不存在于反这个对象的,然后这个A呢,就是一个属性。
07:06
啊,这是一个属性,然后我们就可以,呃,打印点就可以,直接调去点啊就可以。有二。这样的。这个。属性了,就是说我这个fantastic这个对象啊,就有了一个多了一个属性啊。啊,这种通常我用到的时候,就是说我在测试的过程中,我我想给这个。那模块类的对象增加一个属性,比如说我要先。啊,获取他的好友的其中一个好友,两人互发消息,然后。但这个模块类里面不可能会有用户好友ID的这种操作,那我就先去获取好友列表,然后从中随机取一个用户ID,然后我再去发消息,然后每次发的时候我都可以对这个用户ID进行那个呃发消息。然后。
08:00
其实实际的代码里面不存在这个用户ID啊,我就在用例里面给他。这个啊,算是热更新吧,呃,热更新一个UID出来啊,不是应该是的ID。然后还有就是热更新方法。呃代码同呃前两行代码一样,然后s me glass,然后test的,然后T后面跟着大家看,是一个大括号括起来的,在呃格里面,这个是属于一个B包的一个标准写法。然后B包就是打印一。然后我还可以,现在就是我热更新了一个他的方法啊,对象的一个方法。啊,如果大家去热更新那个static静态的。呃,类属性或者说类方法的话,嗯,只需要在这个地方啊,可能加一个就可以。啊,这个这个东西的方法啊,极少用,也一般就是说啊,我用力里面是用到的这个方法。
09:00
比如说我之前是已经定义好了某个方法,或者说我突然想给这个。嗯,就比如说两人好友吧,我突然想。我把所有的好友对应关系用户都分成对之后,我想验证一下他们是否嗯还存在好友关系,然后我就去定一个引进的方法,然后我引匿的方法呢,就把两个人的好友关系再校验一遍,然后我再把所有的对象重新调一遍引匿的方法,然后就确定再再把那些好友对好友关系不存在的用户都全都过滤掉,不用,然后这样啊。我能想到大概就这么一个使用场景,都是一些临时性的,如果是呃,常用的,或者说是呃。大家都需要的啊,还是要写在框架里面。啊,这是一个Java的。嗯,其实这这个底层也是加法支持的,只不过呃加法可能没有这种,呃,各位这种嗯写的语法更简洁,更容易看懂。
10:04
嗯,还有一个就是我们刚才。呃,这是更新的,呃更新我们是在当前这个代码里边去更新的,还有一个就是。啊,这个这个可以是啊热更新啊,这个我查了一下,这个名词是可以叫热更新的,刚才那两个啊,我也暂时找不到名词了,所以刚才说的时候也说了有热更新。啊,就比如说我们现在现在这个原始类是一个update的一个类。然后我们的个脚本啊,大家看。呃。嗯,这个地方就这个。就这个地方其实是一个格位的一个脚本,然后我们先以port一个update,然后我们再把update class test,然后。给他。这个太子的方法,我不用给他打印更新,我这更新更新完成二,然后我们再去创建一个对象,然后再去打掉这个get方法,如果更新成功的话,他会打印二,如果不成功的话,他还会打印一,嗯,这里面我们看到我们是把。
11:10
我们到时候更新的一个代码当做一个字符串。交给这个JVM去执行了,它也是可以执行成功的。啊,这个也呼应了刚开始提到的格位的一个脚本化能力啊,他就是这样科学,也就是说啊,比如说我们的服务。啊。有一个bug啊,发现了需要修改,一般来说的话,我们可能需要呃,修复完修复验收之后,重新打个加班去发到服务器上啊也有一些。呃。工具吧,我我是在一些别的测试的大会上见到过有人用工具可以直接把我本地代码。比如说呃,哪个bug我修改完之后,我把本地编译,把那个glass文件啊,或者说是代码文件丢到工具里面,工具可以直接对Java进行热更新,热更新呢,它的含义呢,就是不需要JVM重启,我也可以去更改,呃,JPM里面类或者方法的一些,呃逻辑或者些属性,呃这样然后如果是你是用隔位的话,就可以把直接把。
12:23
用这种热更新语法。把我们的代码哪些bug给修复掉,比如说我们这里面需求就是打印二,但是我们写错了,打一,然后但是代码已经上了,上了怎么办呢?我们发现之后我们可以。通过把这个,呃呃。热更新的脚本啊,丢给服务让他去执行,然后服务就会自动的。会把这个代码修复掉,就是把这个改成打印二啊这样的。这个一般也很好用。嗯。只能说是啊,有一点点炫技的成分。
13:01
嗯,这就是自定义一步,就是范的一个实现方式啊,这里面我这里实现的是用Java实现的。啊,为什么呢,因为。呃,我把这个功能放到一个source code里面,就是源代码的一个功最,呃,把所有的常用的功能方法,静态的全都我都丢到一个类里面了,这个类是用加法写的,如果要改成格位的话,嗯。不太方便,会导致一些别的问题,然后所以说又加码下来,但如果是。啊,嗯。使用格位写的方法的话,可能会更好看一点,不是就会更省略一点?啊,这里面呢。这个10PO u是我定义好的一个类,这个啊SNC啊。就是执行一个。或者说所的这种对象,然后我们可以去丢到线程词里面去执行啊,这这里面呢,我用的是一个定场显声词,这里就不多说了啊,这个是一个Java的一个标准的一个。
14:10
呃,叫什叫什么,匿名实现的一个方式,还有语法,然后就是。我把这个F啊Java里面用考,然后我们看一下格位,格位的话。也是兼容加法的,嗯,格位的话,直接在它这个背包后面加个小括号就行,然后把参数写进去。嗯,选完之后,然后我们把所有的异常看集住,然后这里面是一个。呃,同步对象非这个大,大家可以看我之前写的这个飞的一个,呃,使用教程它就是说。可以进行一个呃,异步的任务的一个同步,比如说我需我现在有1万个用户,我这个1万个用户都要执行初始化操作,那我就把这个。呃,初始化操作的一个B包,然后再传一个这个对象,然后我就去把调到线程池里面,然后我再用这个对象调一个的wait方法,我就可以等待所有的。
15:10
呃,初始用户初始化完成之后,我才去执行别的,一般来说就是我们执行测试用例的啊,这。嗯,OK,哎,这个使用方法就是这个饭,然后加上一个大括号,然后。括起来的这个代码就是代码块,就是我们需要一步去执行的方法。嗯,这个是我其他的一些自定义的一些。呃,方法吧。一个自定义,自定义等待,哎,就是说我们通常的时候,我们可能。嗯,在使用的过程中,我们需要去呃促使呃去获取一些呃对象啊或者信息啊这样的,但是我们需要。是单线程的,但是我们又需要去等待这个,呃,任务完成之后,我们才能进行下面,也就是说我们这一个步骤去阻塞了下面的步骤的时候,我们就可能需要去等很长的不确定的时间。
16:13
呃,一般来说。嗯。一般来说呢,有可能会等很长很长的时间,特别是我在做那个控制台输出的时候,就是他会等很长很长的时间。然后比如说我们现在有一个需求。是这样,就I等于零,然后。这里面。呃。这这个写的有点问题,比如说我这个A等于零,然后多一些东西,然后A加加等于三。我们就等A加加等于三的时候,我们跳出这个呃,Wait for的方法。不然的话,我们会一直会对应这些东西。比如说我给用户加钱。我只有等到给用户加钱加成功之后,我才会。让用户去买一个商品,或者说是呃,做一些别的跟钱有关的事情。
17:01
啊,这里面对应的话加钱,然后这里面就是可以对多用方码里面的返回值,或者说用户的余额进行验证之后,然后再跳出这个循环。啊,最后一个,这是一个布尔值的表达式。只有当这个表达式为true的时候啊,才会跳出这个wait for的这个代码块,不然的话,它会一直的相当于一个while循环一样。嗯,然后这个是no啊,No刚才也是讲过了,就是好。执行战略代码的时候,忽略所有异常。然后自定义等待时,自定义统计时间。也就是说time这个。呃。利普一啊,它就会打印这段整个这个代码块里面的代码执行的时间。这个一般是用来统计,就是我,所以我只是打印的日志,比如说这里面代码块啊,实际说一秒就会打印出来,什么什么代码块打印了,呃,自行消耗了一秒时间啊这样。然后自定义。
18:00
多线程单次执行,哎,就是说,呃,这个的灵感也是来源于go的,Go里边有一个doing,用once的一个方法。就是说呃,我这个代码我在很多的县城。都会执行。但是我实际需求,他只执行一次就够了。啊,就比如说我们线上啊在做。嗯,可能抢红包我们呃呃为了方便测试,暴露了一个接口,这个接口可以通知呃控制红包活动的开启和关闭啊,一般来说默认关闭嘛,我们就会有不同的,不停的有大量选择去请求他。然后我们只需要有一个当当,我有不停的去请求的这个过程的刚开始。一段时间之后,我们是可以去开启这个红包,然后我们就看,比如说我们有十个红包,我们看到底能够抢多少个啊,是这样的啊,我们就可以把这个开启红包的这个方法写在这个test里面,然后。
19:05
呃,执行,然后用万,然后把这个给它。包起来。我们就可以达到,呃,多线程像这个3TIME就执行三次嘛,方就是执行三个一步线程啊,万S就执行一次啊,它打印结果呢,就是多线程啊只能执行一次,就是我们可能十几20个线程,它都会依赖于这个方法。都使用这个方法,我们就执行,执行一次打开开关之后就开始抢红包啊,抢到可能抢到某个程度之后。红包耗尽,然后我们就停止测试啊,过那个去检查数据这样。OK,那今天的分享就到这里了。我们下期再见。
我来说两句