00:02
Hello,大家好,我是fantastic啊,今天给大家分享啊go在性能测试中的应用。啊,之前给大家分享过格位它的一些像比较Java的一些特性啊,我们这期就分享格位的一些特性,在我们在做性能测试中的时候的应用。啊,首先我们看一下啊。格位性能测试中的应用,第一个部分就是脚本化,格位相比于Java最大的呃一个优点,它就可以脚本化去执行,嗯脚本话呢,就是嗯之前也提到过,就是可以把格位上,嗯,也可以说是Java的一个呃,一个类或者一个加点Java文件啊,当做一个脚本,那我们就可以直接去执行它。啊,这里的执行呢。那主要分第一就是。呃,在idde里面去执行,就是我们点右键,这个跟我们使用加码是完全是一模一样的啊,这个就是啊,体现它编辑的一个便利性啊。
01:05
当然我们如果是想要对测试用例进行小修小补,比如说改一个参数,把一改成二,然后注册掉几行代码,然后啊,删掉一些,呃,多余的。那个代码行,或者说是做一些逻辑上的调整,简单的逻辑调整我们都是可以直接在VM里面去编辑的,就是我们把代码可以啊放到服务器上。啊,然后可能要改一些什么东西,拿一个VI或者vim的命令,我们直接在那个界面去编辑。还有一个呢,就是我们可以把我们的脚本,它本身本质上就是一堆字符串嘛,可以放到啊MYSQL里面,然后前端提供一个页面,在前端也可以进行一些编辑啊,这就是。呃,在ID里面编辑基本上是嗯编写,然后在我刚才说那两种情况下,基本上就是修改。
02:01
啊编这个编写呢,有可以理解为创建用例的时候,因为逻辑可能会比较复杂,在我刚才说的那两个场景下,就浏览器和呃,服务器上编辑的话,对于复杂性逻辑。我觉得使用体验还是非常不好的,特别是代码提示啊,啊自动的import,我们需要的类啊这一方面。那第二个就是执行的多样性啊,我们可以用命令行去执行,命令行去执行什么呢。就是假如说。我们有一个。文件啊,我们就是用这个比吧,就比如说一个格位的文件,它我们把它命名是A,然后我们就可以用格位。Roy a。这个命令去执行,这个后面可以跟一些参数什么的啊,我们就可以这样的命令行执行啊,加班去执行呢,就是我们可以把我们的呃。嗯,项目的框架打成一个架包啊,我们用Java杠架去指定啊Java。
03:10
杠架,然后指定加班。啊,加包也可以指定好加包之后,然后我们可以把这个A当做一个参数去执行啊,或者说我们可以用,呃,我们这个A的脚本在这个价包内的话,也可以用Java自带的一些命令去指定到执行A里面的某些方法,一般通常来说我们都会把一个用力的执行过程写在卖方法里面,所以我们这样就我们就不用在指定方法来回默认的去执行那个卖方法。这样是一种执行,但这种执行Java框架呢,非常的少,因为它已经失去了,呃,本身它能格瑞脚本带来的一些便利性啊,它唯一的好处就是格瑞刚加了,刚加的时候我还可以编辑A,把A编辑,编辑之后再加一遍,嗯,唯一的好处就是说。
04:03
哦,在这种执行方式下,我就不依赖于格位环境了啊,格位环境它装起来就跟啊,Java的JDK装起来是一样的,我觉得这个优势并不是很大啊,就如果是。你这个用力突然要丢到某一台机上去执行的话,呃,你可以拿这个加班去执行,但是呃,如一次性的就是如果长期的话,我还是更建议去装一下隔位的一个环境啊,因为它第一它呃。使用起来非常的方便啊,第二它更新起来非常的方便,假如说我们框架加班如果更新的话啊,更新这个加班就非常的麻烦的,那隔壁的话就不用直接把新的加班丢到那个依赖里面。就是格SDK的一下就可以。啊,这个可是环境以及它更新依赖,这个大家可以上网上搜一下,非常简单的。这里就不再说了。
05:00
还有一个就执行纯文本内容啊,这里面就是说我可以把这个AA它本身这个。啊,它就是一段字符串。就是纯文本信息啊,我可以把这个纯文本信息丢给执行的。呃,引擎,这个引擎可能是一个本地的引擎,也有可能是一个引擎提供的一个服务,服务的一个接口,接口里面可以传一个。参数,假如说就是一个脚本script,然后他后面可以跟字符串,我可以把这些字符串丢给服务器,让他去去执行,帮我执行这个测试用例。啊,这也相当于。以服务化的形式去执行这个A里面的,呃,他所写的测试用例了,这个用起来还是非常方便的。啊,如果是嗯,做平台化的话,基本上都是以这种形式去,呃,执行我们的测试用例的。还有功能的多样性。啊,这个就是说呃,可以以文件保存,嗯,就是我把一个每一个用例当做一个文件,然后有一个统一的管理的规则去管理这些用例,然后还可以放到gate啊一般。
06:11
都会选择放在get。那个我看对,呃呃,看到一个ner,嗯,它就是用格写的,它的用力也是可以支持从get上直接拉取的,但是这个。看看样子,好像用的人不是很多。呃,不知道是什么原因,但是get上去管理这些用例有一个非常大的好处,就是多人去可以协同的话会非常的方便,而且这个呃,也是我们的一个。怎么说呢,呃,就是我们工作的一个。呃,积累吧,就是我们写过的用例,我们通过一些注释啊,或者说变成这个用例做什么的,我们这个用例可以用在什么场景下啊,写这样的一个用例,然后我们可以用get它自身的一些功能,比如说我看谁,呃,我这个用例一开始是什么样,后来经过哪几次版本迭代什么的。
07:10
然后第二个就是数据库啊,当我们使用这种。呃,执行成本这种形式,或者说是命令行,或者说是。呃,加班执行,因为命令行和价包这两个算起来算是本地执行了。啊,这种形式的话,其实我们执行的都是文本内容啊,这种文本内容的话,除了放到get上之后之外,我们还可以放数据库。啊,因为这个get肯定要存,呃,我们的用力肯定要存一份的嘛。我们可以放在数据库。也可以通过接口去上传啊,就是这个我接口先把用例传上去,传的内容就是一个呃,String文本的形式。这个是啊,格位脚本,它的脚本画用力之后给我们带来的三个优点。就是拓展性非常的好,就是它本身提供的这些能力,可以在呃,根据这些能力再结合我们使用场景,可以拓展出来非常多的一些啊,便利性。
08:11
嗯,这个就是格位,它一个脚本,脚本语言相相比较Java的话,它。最直接的就是。能够。提升我们写用力的一个效率,而且只要我们测试用力的话,用力的。不需要跟呃,我们测试框架的项目那样,有一些非常严格的代码规范这样用力,呃,通常来说一个用力在。呃,如果没有沉淀下来,形成那种类似于冒烟这种用力的话,嗯,在使用的过程中,我们通常都是会进行不断的修改的。因为有可能这一个项目呃用力这么写啊,下一个项目这个用力啊,我们不需要去创建新用力,可能我们在原有的用力上改不改吧,就可以就改一个参数,或者说改一点逻辑,就可以重新去执行新的需求测试这样。
09:08
所以这是啊。这个以动态QPS模型为例啊,这个主要原因是比较简单。啊,我们先我们之前讲过这个DeFine这个关键字啊,可以忽略掉了。这里就不再提了,就我们先去获取所有的登录对象。啊,这里面包含了就用户的。呃,必要信息以及他的呃登录凭证一类的。然后我们通过定义一个test的一个B包啊,就是我们实际执行的一个用例的内容啊,我们先从这里面啊,所有的对象里面选出来一个,随机出来一个对象,然后再通过这个对象去创建我们所需要测试的。啊,相对应的模块类,然后模块类去直接调用这个balance方法,Balance就获取用户余额的这个方法啊,我们就可以完成。
10:02
啊,一次啊,用户余额获取这个接口的请求啊,这里面我没有去写那个。断言,因为在框架里面封装了之后,呃,是校验了用户余额。信息请求的一些必要信息,比如说HP code,还有他那个业务的code,呃,有可能也是message。这样的一些基础信息。然后这里面并不涉及很多的逻辑校验啊,然后如果说大家想去有有需求的话,就在这里面再把这个断言给写上就可以。呃,然后。然后我们通过一个这个执行啊模型吧执行。框架是其中一个啊,就是动态QPS。然后我们把这个碧波传进去,然后再传一个描述的余额,然后描述的那个。呃,信息,然后我们点一下大啊,这个用例就算执行完成了啊,动态QPS的默认的QPS是一啊,我们可以通过呃控制台或者说其他。
11:08
自定义实现的一个controller控制器啊,去控制它的QPS的增减,我默认的是因为我现在用的比较多的就是呃控制台,我在控制台上可以调整波长啊,也可以去加减那个。QPS,或者说呃,编写一定的规则,比如说是我,呃在多长五分钟之内加到100QPS或者说一小时之内保持200Q,显示保持一小时这样。都可以通过自己去实,自定义去实现啊,这是自己实现的一种语法,就这种很简单的语法,然后。嗯,这个就算完了,这个我们的一个测试用例就算完了,当然我早写了上面的。哒哒哒哒哒哒这些东西,嗯,省略了啊,这个就是啊,整个测试用力的所有内容,然后。
12:06
断言的话,这里也省略了啊,这个就是呃,执行的效率的问题。啊,还有就是呃,其实我们去做的话啊,所有的需要修改的。两部分吧,呃,第一部分就是这个test的方法里面,这是第一步肯定是要随机出来一个用户的,然后第二步我们需要确定我们所要测的模块啊,这第三步呢,就是这个接口,然后第四步的话,可能就是做一些验证什么的啊,当然里面框架里面会接很多东西。啊,比如说监控啊,服务统计的一些信息啊,还有就是呃。可能要把自己的本身的一个本地的性能测试数据进行一个上报,这样。这些都是框架做好的,我们就可以整体来看,我感觉还是比较简单的。
13:00
然后这是一个提升效率啊,这是一个我们测试脚本,测试脚本在我的理解里面,就是为我们为了测试通常会做一些数据的准备和数据的清理,以及呃,数据的重置啊或者什么的内容,然后这里面。呃,是重置用户的资产啊,就是说我用户,呃,我们的测试用户啊,假如说我们可能需要100万的资产去进行买卖。买什么东西之类的,那我们就可以每次测试之前都可以把这个资产重重置的,或者说我们在每次测试之后把资产重置掉,避免影响其他的测试啊这样啊,这里面我是自定义的一个业务关键字啊,这个范范后面会讲一下啊,这是我自己自定义的,你但各位随机想制定一个ABC也是可以的,然后。呃,这个就从这里面,这个整个的逻辑呢,第一步还是获取所有用户,这个是肯定少不了的,第二步就是对于这个用户进行便利啊,这是第三步啊,第三步便利的内容呢,就是啊,通过balance这个模块,然后去ino啊这个。
14:15
啊O里面有重置资产的一个功能啊,这个可能自己封装的。那名字起的可能不是太特别恰当。然后为什么用泛呢?就是我自己内部自定义了一个呃,线程词。啊,这个饭的话,我就会把里面这个其实后饭后面跟着也是一个B包。我会把这个背包包装成一个软的接口的一个。啊,匿名的一个实现,然后把这个接口丢到线程池里面去执行,然后这里面我控制的是异步线程词的,呃。是用那个定长线程去实现的。然后我控制定差线程池的线程数,然后我就可以控制业务执行的一个效率啊这里面。
15:02
啊,主要是。啊,这个功能第一次受到了构语言的一个启发,构语言就是go后面加一个什么东西看,或者说是啊一个一段代码去执行它啊就可以立呃一步一个啊携程去执行。嗯,然后Java里面,嗯。应该说是底层的功能是支持的,但是没有特别好的一个呃实现啊,所以说这里我自定义了一个。啊,第二呢,就是我们随着我们测试用户可能就是。嗯,少的话可能几百上千,多的话几万个,比如说我们每个用户都要重置我们的,呃,那个。呃,资产的话,呃,即使一个十秒十十毫秒一次。啊,一秒钟也单线程的话,一秒钟也就只能执行100个,如果我们有1万个,我们就需要100秒,100秒就一分多,一分多其实对于呃,如果我们要进行多组测试的话,一分多其实还是比较长的啊,如果我们控制这个线程的个数,比如说我们服务现在能承受的。
16:08
呃,线程的最大线程数是,呃,20吧。假如说单机啊20,然后我们就可以把这个线程数设到十。就是服务于一个相对比较安全的。呃,水平去尽快的把这些用户的资产全部重置完,如果我们线程池十的话,它这个效率就执行了一个十倍啊,十倍的话,刚才以刚才那个例子,我100秒,如果是需要100秒,我现在可以十秒就可以搞定,十秒对我来说还是一个可接受的,所以我现在基本都是用这种一部千动词去处理任务,还有就是我们在。呃,这种义务的话,我们再处理去。呃。我们的呃,本身的性能数据上报,还有就是一些额外除了性能测试这个主线任务以外额外的事情啊,都可以去做那个义务,甚至我可以把日志啊,错误的一些信息,比如说我这个,假如说我这个用力的某一次执行断言失败了啊,我可以异步的把他的呃请求的用户信息,呃请求的参数以及相应的结果断言的信息全都存下来,然后异步的去存到一个某一个地方啊,不会影响我。
17:25
当前这个测试用力的总体的一个执行的一个效率。然后还有就是。这后面就是。呃,语法上的。就是纯格位语法带来的一些性能的,呃,测试的效率提升,呃,第一个就是这种。啊,这种其实这个跟Java是一样的,就是我们封装好一个方法,我们就可以获取所有用户了啊这样啊,这个我觉得提成主要还是。嗯,封装好方法,然后做好。本地的或者服务器的一个配置之后,我们就可以通过这种一个方法直接就获取所有的用户信息,而包括呃,用户登录如何登录,还有初始化用户的一些必要信息,比如说有可能的话,就是UID啊,投N啊这些全都可以获取到,这样的话,呃,相比于其他工具,呃。
18:19
就是不支持脚本的话,工具的话可能要选配置啊,可能要做一些别的什么事情,中间可能还会有接口请求啊,这种我们就完全的可以封装成一个该方法去完成我们。所需要他在测试之前完成的内容。啊,这里面肯定也会用到异步嘛,就刚才我们用的这个啊异步方法。然后呢,这个就是我们通过,呃。啊,一些条件去过滤一些用户啊,比如说我们现在需要过滤U用户的UID啊,都要128取模小于六四啊,我们就这样就可以,这个是一个。呃,Lada语法加法也有类似的啊,但是名字不一样啊,类似差不多啊,但是。
19:07
我是写格位比较习惯,我觉得这种更容易,更容易让我理解,而且写的方便快。啊,就用这种。然后还有就是这种星点,这种就是我可以获取所有的哦哦,就是一个可以理解为这俩是一致的。这是一个list list里面是一个best的一个对象,对象里面有token,有UID这样的属性,我们可以用哦,星点token,我就可以把所有的用户的token去获取到啊,这个在测试里面非常的常用,因为我可能如果涉及到。呃,用户之间相互交互,比如说嗯,两个用户聊天吧。就是我肯定有一个用户必要要对应另外一个用户,俩人相互发消息,那我们就需要,呃,也需要去获取这个所有的一个UID,我们可能就要对。
20:04
比如说我现在有100个用户,然后我其中有一个要对这九九十九个不停的发消息,或者说我有50个对50个不停的发消息,这种呃场景的话,这种会比较方便一些。
我来说两句