00:00
啊,Hello,大家好,那个之前给大家讲了一一个就是自动化测试项目,一个积累需要时间的一个接口啊,今天给大家分享一下啊,就我在实际项目中写的一些鸡类的。呃,一些案例,嗯,然后我们先看一下这个,因为这边没法放大这一些,这是那个项目结构,然后这是。就是看不了Q点后面的这些包,就是每一个包就代表一个项目,然后这个resource就是呃不同,呃,DV环境和FA的环境,还有online环境这些那个环境的配置,每个项目都有一个不同的配置,然后呃,我跟大家分享一些,分享一个学生派的,因为这个稍微熟一点。大家看一下这个busy,这个BB就比较好理解,DB是操作数据库的啊,一般我们在测试的时候,我个人的建议是不要去直接操作数据库,因为很容易出错。
01:06
而且有时候不一定有效,因为现在呃大多数呃业务他都可能会去用到缓存这么一个东西,呃直接操作数据库啊,其实是无效的啊,就其实还需要去操直接操作缓存,呃操作完数据库刷新缓存需要这么一个操作,所以说还不如去让开发提供一些专门的修改接口,让那个调一个呃一个调一个方法或者一个接口去实现这个功能,然后嗯,Function的这个就是呃各个模块啊,这个是自动学习啊,这个是啊班级呀,这个是呃落地啊这个学习这个呃在线学习啊这复习这些,然后performance方面是这个就是压测的脚本啊,这个等讲完那个呃压测的框架了以后,再跟大家分享一下压测脚本怎么写,那profile这个里面就呃可以。
02:07
看一下就是各个模块对应的接口的名,接口的地址。这样的还有一个就是呃一个总的profile,这里面会定义一些host,在contact,就是有些项目,它每个接口前面会有一些呃不一样的呃就是接口地址前缀似那种的,然后嗯这个剩下的这个呃是一个在接口传参或者说是呃可cookie里面呢,会有一些呃公共的参数,然后需要设置的就是写死的像呃你们这个pad pad的的话就是屏,呃系统的版本,软件的版本,屏幕的尺寸啊,还有一些乱七八糟的东西,这个publick呢,是获取那个呃公钥K的呃一般这种情况的话,呃像或者说一些通用的,像这种的话,一般都是写在这个的profile里有的是。
03:13
写在这个UAPI里面,你看这个时候老梗就在这儿是吧,那这看大家自己的习惯就行,然后呃,讲完这些我们就来看一下这个OK baby baby,这个OK,我把这个关掉,但大家看,然后这个继承这个source code,这个没有什么,呃具体的实质意义,它里面呃,它里面可能就是一些呃一些方法,我给大家看一下源码。这测试框架里面你一些通用的方法,比如说获取一个秒为单位的时间窗,呃会纳秒为单位的时间窗,获取屏呃控制台输入,还有就是呃将string,呃将数组变化成呃对象,还将那个string变化成对象,然后就是获取更多的这获取百分比的这种,这种就是一些小工具,小工具方法把它关掉之后,然后。
04:35
然后我们看这个,呃,我们这里面会有一个,呃是是有静态的这个对象,呃这个待会给大家讲它是做什么用的,然后这个呃静态代呃代码块里面这个主要做什么呢?大家看一下这个呃,Request的table这里面就是一个,因为我每次会记录不同的数据库,呃每次请求都会记录,记录到数据库里面嘛,这个设置数据库表的,如果没有这个的话,呃就不记录,这是请求的记录啊,这个flag呢,就是呃对于所有的要记录的东西的。
05:12
一个开关啊,True就是所有的都记录,但是这是双重的检测,如果它是true,然后这时空的话,它还不还是不会记录请求的,这个的话,Performance table的话就是记录性能测试数据的,是要不要记录到数据库里面这样的,然后在这个地方,就如果library里面的这个get busy这个没有实现的话,还烂的话,然后就set一个new new,然后这个地方主要之前也讲过,用到那个check code right方法,然后这个就是呃,实现一个post域名,然后get public key呢,这只是一个方法,然后是这样的。呃,就会从一个地址去拿到一个加密的K啊,然后打一个,如果是响应正确的话,打一个日志,这样呃登录响应啊,我会记录一下登录的响应,有因为有时候呃虽然说登录可能不需要,然后可能会在别的地方用到,然后就记录一下,然后UB呢,就是用户信息的B,但是在这个地方,因为这个项目是我一开始写的,就是接手的就是这个项目的,嗯,其实这个UB呢不是特别好,没什么,没什么太大的用处,但是一开始写的一直在用这个对象,然后就一直保留下来,没有改,然后这个就大家知道呃被这对象做什么用的,嗯,就是因为呃有些测试的时候,我们可能会,呃或许很多呃很多次有get一个杯子之后,然后我们在在某个地方,我们可能不知道这个被呃被对象已经呃初始化完成了,我们还去get的话,可能会初始化两次就需要登录。
07:00
展示这样的,在然后这地方做一个判断的话呢,嗯我就登录第一个默认的账号,嗯这个I是表示账号的,呃然后无论他get多少次,我如果我只会登录初始化第一次,当然这不适用于多线程的呃场景下只是单线程的可以这么做,然后呢,呃get base这个in I的话,就返回new第个用户,然后这是呃属性,呃这里面呃这个属性的话,我个人建议还是用public会好一点,因为呃对于测试来说,这些嗯没有太多,嗯嗯就属性的访问权限没有太多,没有太多有意义的地方,我之前是因为用的private呃呃修饰的,然后但是后来发现这个呃埋了一个坑,就是这个属性的值,呃没办法被那个它的子类所。
08:00
呃,所继承啊,不没办法,这个属性没办法为子类所继承访问啊,所以说很麻烦,没办法给子类赋值啊,然后呢,这个cookie呢也是啊,我建议大家在这个前面这些所有的属性的修饰符啊,全一律用public就可以了,然后呃,这个是登录方法,登录方法呃比较简单吧,我给大家看一下,就是大家看一下,然后我呃get的阶层的话就是有以及等号为呃分格,然后左边是K,右边是value,然后等号为分格,左边是K边是m value,大家看那个pass的方法,这是一个专门的一个呃加密类嘛,加密类然后去get password叫铭文密码加密成密文,然后实现一个呃登录的请求,然后在这个地方呢,你看我们log response respond就得到。
09:00
得到了之后,我们去验证一些啊,其实这个呃,我们的项目里面的UID和那个是一样的,但是呃呃大多数使用场景都是一样的,但是这里面还是进行重新的进行的一个赋值,从接口里面为准,呃把从登录响应里面为准,这个BU这个大家可以忽略掉,就是从这个想象里面把这个UB啊B啊给初始化掉。然后这是嗯,那这个就是记录一下日志,然后这个是失败,失败的话打印一下啊,大家看这里面登录失败的话,我并没有直接让它否掉。啊是这样的,OK,嗯,这如果是登录失败的话,其实有的时候项目还是可以继续运行的,那有有可能我测试的就是登录失败的测试用例呢,对吧。这什么鬼,然后嗯这个地方就是呃用户名和密码默认的话是那个,你看如果用呃我们现在系统默认的,如果重置密码的话,系统默认的是用户ID的后六位,然后呢,我的密码一般都是用户本身,就用户那个u name本身啊,这样的话就是有一个区分嘛,嗯这个呃为什么要跟不一样呢?因为呃密码后六位总是会被提醒,你的密码那个保密程度太低,总总是会被提醒,而且呃虽然说做接口设置啊,但是很难难免的话会呃去用账号密码去登录,呃如果是呃登录的话,我还是直接就复制账号,复复复制一个账号,账号就是密码复制进去会比较会比较方便一点啊,所以我我的账号都是账号密码都一样,然后默认的。
10:49
它是那个,所以呃默认的是那个呃密码后六位啊,在这个地方也也提供了这样一个次头,呃那个勾的方法,然后这个杯呢,大家看一下UU就是呃,待会再给大家讲U吧,这个U就是全局的一个用户,那个配置,从配置里面读用户,然后用户管理的一个东西,然后去获取第几个用户,呃这这些词的用户都是那个完全跟其他不搭调的啊,没有任何关系的,可以直接单独用的啊,这个是空的构造方法,主要是用来呃这个地方。
11:29
呃,主要是用来这个地方。设置一个,呃把这个被AB对象给设置,呃设置一下,然后好调用那个a right方法,然后后面的啊这个嗯,这个就完了,然后这个刚才讲过了,就是将铭文密码加密的一个方法,呃,这个就是呃通过当前的被试对象去创建当前备试对象啊这个主要是呃主要是为什么呢?呃方法呃主要用在什么地方呢?我通过一个被呃积类对象去创建模块化,去初始化,或者说创建模块化对象的一个方法,比如说我有一个user in for的对象是继承于这个的,我就可以拿我先创建好的base对象去创建我的userport对象,然后我觉port对象里面呢,这些东西包括验证信息啊,图片什么的全都有,这个也是比较重要的。嗯,之前刚才刚刚讲过那个属性的,呃,那个坑就是访问不到的话,就是在。
12:33
这个地方因为如果把它的话,本地呃当前这个类是可以,这个方法是没问题的,但是如果放到类里面去呃去呃不放到模块类里面去,访问机类属性是直接访问不到的,然后呃get就是获取公参的啊,就是获取一个公共的参数,然后这是公共参数,我们一般UID投和内容,然后呃put out呃这是公共的参数,就我刚才讲的屏幕指寸啊,系统版本,软件版本啊,还有这乱七八糟的,然后这个引匿,这个这个没有用,这这个项目没有用,但其他项目没用到,这个也块呃看起来也没有用这个这个呃这个因为因为什么呢?因为这我们现在的性能测试场景还没有复杂到每个用户会记录这个request的这个程度啊。呃,一般呢,写一个循环,然后把。
13:33
比如说200个用户,200个用户每次都呃,比如说做一下什么操作,先先去呃做一下什么操作,呃单接口的话就直接把这个request对象记录下来,然后放到性能测试框架里面,如果多接口的话,就直接呃实现一个呃性能测试框架里面的一个虚拟类就可以了,啊是这样的,所以说在在这里面没有用到这个request的呃这个方法啊,用于那个呃这个设计呢,主要也是为了呃多用户多接口的压测,但是现在多用户多接口呃有可能会有相用户接口呃的请求里面可能有一些,比如说下一个接口依赖上一个接口的数据这种情况,那个这种时候就request的request的,这解决不了这个问题,所以现在基本都是用嗯实现性能框架里面的虚拟类来实现这个问题,来解决这个问题,然后嗯,盖水快是那个。
14:33
呃,获取呃就这个record的这个结果,Get request研就难了,那下面的些就是呃,Get word word这些呃大家看一下,诶啊get get get大家看一下,这这的个是一个重写的,这些是get get get get post的方法重写,呃这里面我都会把这个host单独加进去,所以说就呃直接是不用加那个传过来的这个ul这个参数里面只有只有那个接口的地址就可以了,就没必要再填host啊,这一个好处就是我在呃更换环境,大家看我们那个,大家看一下我们那个环境有多少,我d house莱还有好几好几套环境了,所以说我切一下环节配置文件里面的,然后一改,然后这就就改完了,这有一个比较方便啊,然后看。
15:33
我们从一个请求获取就快,呃获取那个啥来着?呃响应的时候就是分三步骤,第一步设置黑带,设置head带呢,大家看一下我们的head带,嗯,这个是一个request ID,嗯,就是我们自定义的一个公共的head带,必须得有。然后大家看一下这个就是呃,它是request的ID,然后我的value是那个时间串的形式,嗯,Request ID get value加再加一个时间是这样的,然后这里面还有一个就是get教的方法,就是token u和u name,然后APP version啊这个,因为这个地方,呃,这些,呃包括这些这些,因为我们在工摊里面这些参数可能也是有的,ROM这种,然后为什么要放黑带里面呢?呃,因为我现在也也不太搞得清楚那个他们这里面到底是什么套路,我抓的那个接口的信息。
16:33
这告诉我就说呃黑带里面也有,然后那个呃那个空差里面也有,所以我眼睛没再区分,直接索性把它全部丢进去了,我们然后看这个,如果库克不是空,因为我们库初始化的时候,你看已经你有一个接了,所以说它不可能为难,不为空的话,然后就添加一个,将这个接对象转化成一个cook的head,然后添加到这个request上面,诶我们设置完公共的请求之后,然后再去呃呃发送这个请求,拿到响应,我们再处理这个响应,你看如果响应里面呃有这个cookie,这个呃呃不包含的话就过去了,然后如果包含的话,就把这些呃cook解析完之后,然后呃将这个呃把这个cook给给干掉,然后这们的库。
17:33
信息拿到这里面之后,呃,我们的应的位信息拿到这个库,这个呃属性里面之后,把它干掉,然后这就算完了,然后返回一个端,然后这是设置带,就是处理尾端相get相当get啊这个这后面这几个应该是比较简单的,跟之前那个get get get一样,就是get完之后直接去拿去处理那个请求,拿到响应,然后get以后,呃封装好的方法就get get get get后呃如果是某个接口呃就通用的,就因为因为所有的一个项目里面,所有的接口,它肯定是遵循一套那个嗯固定的规则嘛,就所以说你在那个害了,呃在。
18:26
在前面这两个方法里面,如果处理这是OK的话,项目里面大部分接口都可以这么用,就可以直接调get get h get post的方式这个方法,然后呢,呃,有一些特殊的,比如说我要在某个呃,某个项目,呃就虽然说是一个域名下的,但是它有一个域名下呢,可能还会有别的,呃,呃特殊的一些逻辑处理啊,或者说是他请求的是其实不是一个不一定就是只有一个Java服务的,这种时候两个加va服务,它对呃一些head或者什么处理它可能不太一样的时候,那我们就需要单独的先把这个get get get post的对象拿到之后,再去对它的进行一个单独的设置,然后再去调这个呃,Get responsible这个方法去获取那个响应,然后可能我们还需要去重新处理这个响应结果里面的,呃,Cookie,然后那个之前讲过一个302的重定向的问题。
19:26
啊,这里面就先不讲了,然后我待会呃改下次我把那个有一个外部端用到那个单点登录从零项的时候,再分享这个重零项是怎么处理,就测试方架里面去怎么处理重零项,然后实现这个登录的,然后大家看这AI的方法就是其实很简单,就是我判断这个呃响应的对不对,然后你看我们这里面就是先获取这个响应实体,然后里面get radio get,那这个是可以的,嗯,这个应该是返回的,是一个类对象,诶放哪里去了啊,Get开个对象,但是我用这个in接收应该也是可以的,但是呃,最好是get value这个用用那个方法去获取那个值,那如果这个只是这这这一套是OK的,哎,这一套是OK的,完了之后再获取这个date。
20:26
呃,如果这个code等于零,且这个对不为空,哎,我就认为这个。这个应是对的,就是响应是想体的,基本校验是OK的,然后这里面是恰扣的,呃,这里面呃跟那个差,跟之前那个差不多,但是它多了一个request in里面这个呃切扣的话,它主要是涉及到一个呃,有些黑名单的host,呃所以说这个就直接返回test那个code,这个是一个自定义的类型二然后这里面是get get,然后得得。
21:04
然后去返回这个code的这个里面是校验,嗯校验的话就是我认为它我们这个项目认为扣的等于零,然后对的不会空,就是想想体就是OK的,然后我们之前做过的那个呃开源测试,开源测社区的那个项目,他就是扣的等于200,然后这个是恰下扣的,你获取它那个扣的,然后剩下的get cook set all over,呃这个over over还是比较有用的,嗯,因为呃我们这个测试啊,就一般就分平时在嗯工作中就是功能测试,还有就是呃自动化测试,对吧,然后这个方法呢,之前也讲过,就是因为如果你要去操作数据库的话,就在DB,就是我现在一般都不,我现在就是一般呃非但不得已的时候,我才去操作数据库,一般的话你操作数据库的话,你最后会会要把数据库资源释放掉,但。
22:05
但当你在做功能测试的时候,你就无所谓了,因为功能测试测试完之后GVM就结束了,结束了之后所有的资源都会都会被释放掉,这就无所谓,然后如果说你做自动化这个,这个基本上是一直在的话,你一定要做这个资源释放,但是那个资源释放就不能用testover这个东西了啊大家testover我给大家看一下,你看testover是关闭连接池,关闭异步连接词,在这里面我没有关闭数据库资源,所以说如果是。大家在做别的呃,做自动化的时候,呃测试这个over,我们这里面可以回收一下连接,回收一下连接,但是不是关闭连接池,然后把呃数据库的连接或者red,或者说别的连接都回收一下,或者该关该关的就该关的就关,但是连接池这个对象我们是不能关闭的,是这样的。
23:00
然后这就是一个呃,算是一个比较标准的那个呃,测试项目的一个积累的一个实现,然后大家大家再看一下,就是这些都是基础的。然后这是一个公共的方法。然后这是登录,这是啊不,这这个是各种属性,这登录那个结果,然这是啊,URBU点法B,然后这是一个的一个静态方法,这是属性,属性我建议是public,所有的方没有,只要不是特别那什么的,嗯,没有什么特殊的性的,就可以用public去修饰它,那这样我觉得那个脚本就做的挺好的,脚本就是只要不是private的,全部都是public。呃,在这个里面做一些属性的赋值。然后判断一下登录是否成功,在这里为什么就登录不成功呢?因为就是刚才说了,除了登录不成功以外,我们还有别的方式去初始化这个。
24:03
呃,即使他登录不成功,我们还是可以让他登录成功的,你比如说我是呃直接从呃直接用一个to token。这个token,呃,就是我我这个我需要初始化这个token的,像对应的账号的信息的话,因为我这个账号没有东西对吧。只有一个token,然后我们初始化之后,我们再去调获取用户user in for的那个接口,再初始化,像UID啊,嗯,U name啊,这种属性,我们可能会有一些这样的呃使用场景,然后嗯,这个是各种构造方法,这个里面我主要是为了呃兼容一下,就是别的账号吧,因为我的测试账号都是呃密码跟别的默认的,跟同事之间他们自己用的测账号密码不一样,所以说设计了两套,然后这个获取工餐的。
25:04
这个初始化,这这个初始化这个地方,嗯呃,也可以用那个token来说,初始化这里面主要用cookie,用到这个方法的就是cookie,这记录这两就这个项用不到,有一个有几个外部项目用到了这些就是get get到然后就是去响应,然后就处理响应,处理响牛头说行是处理,就是处理响应头啊不不能说处理响应头,处理响应结果里面关于海的信息,特别是cookie,然后这个是呃获取,对对一个请求方法进行封装嘛,就是通用的呃类型的请求或者说响应结果这些,然后这两个是right的校验,呃基术对响应结果的基础校验,这个是。呃,获取相应的业务code的,然后后面这两三个也是啊,特别是最后这一个,最后这一个在嗯,普通的功能测试嗯和一般性的自动化测试里面都不需要这个方法,但是保不齐,如果是项目比较多的话,还是需要一个。
26:21
呃,就是资源回收,资源释放这样一个功能的啊啊,今天的视频就到这里啊,今天终于学会弄这个公众号了,想了半天就弄个桌面,其实挺好的啊,欢迎大家关注我的公众号,拜拜。
我来说两句