00:00
嗯,哈喽,大家好,那个之前已经分享过如何去做简单的接口测试,以及呃独立性较高的接口测试项目,去怎么去验证写脚本,然后做呃预警,然后今天分享一下就是如何去写一个接口自动化的项目,嗯这个项目呢,就一般就是长期的,然后需要不停呃不断的去维护和更新的这样的项目,这跟那个呃之前的那些呃单接口的,或者说是咱三个接口的项目的话,就差别还是挺大的。嗯我先说一下自己那个项目呃写项目的一个思路,嗯就是每个项目有一个基基本的类,基本的类呢,实现一些公用的方法,主要还是呃请求方法,然后跟业务相关的就是呃登录,呃获取令牌,还有一些呃加密的算法,或者是一些公共的。
01:00
呃,功能是这样的,完了之后,嗯,每一个项目的模块,然后有一个模块类,模块类就是继承一下这个,然后从继承那个,呃,它的验证,还有用户的一些信息,比如说u name或者UID这样的公共信息,然后再去实现每每个模块下的呃不同的功能的提供,呃提供的接口的封装啊,就比如说用户模块吧,呃,我一个用户模块,我需要有获取用户信息,呃修改用户信息啊,或者说是。呃,修改密码这样的功能,然后我就封装了三个方法,Get you in update you in for啊那个update password这种,然后。每个方法是把呃呃这个接口的功能进行封装,然后暴露相关的参数,然后呢,我们在写测试用例的时候,就直接去新建这个啊,先新建一个机类,然后再通过机类去新建这个模块类,完了之后我们就可以针对模块类的不同的功能写代码,写我们的测试用例,然后就可以进行测试了,然后测试完之后我们就选取一部分的呃我们的功能用例,然后做成自动化脚本,然后呃我是用那个,我采取的那个方案是用那个go瑞的语言作为脚本的语言的啊,所以就直接把语呃脚本写好,当做一个文件丢到服务器上啊,应该是有固定的位置啊,这样的是通过对文件的管理来实现对车子用力的管理,然后呃,后期如果是想做复杂一点的话,就是说。
02:55
啊对每个文件进行一些呃那个配置啊,包括这个文呃隔位脚本的参数化啊这种哎呀拍的时间有点长,是这样的,然后呃所有的那个鸡类呢,它实现的功能呢,呃我是用通过一个这个接口来进行约束的,或者说是一些呃提醒吧,就是所有的就是有些功能其实可能不太需要,所所以说就有可能啊这些每一个机类它跟每个项目不一样,这些所有的方法有可能需要实现,有可能不需要实现,然后给先大家讲一下这个呃主要的这个呃接口的实要实现的功能啊首先呢啊我们是嗯这有一批是用那个实现呃获取请求和呃呃发送请求解析响应。
03:53
嗯,这一类的接口,这一类接口就是其实比较简单,就是get get,还有两个get get这个方法,然后一个是呃,只有一个URL,呃一个是URL加这个接参数,Post的也是post的,这个就是。
04:11
这个啊这嗯叫那个什么重载,呃,URLURL加这个,然后URL加这呃加Jason加file,呃因为为什么没有那个区别,那个透的接口传参呢,呃原因是这样,就是呃在一个接口里面,在一个项自动化项目里面啊,比如说是外部端的项目啊,它可能就是啊表单所有的都是表单传差啊,如果是一个嗯就APP的项目,它可能就接肾传菜,嗯一般就是这两种,但是每个项目一般只有一种,就是极少见到。那个一个项目,呃,它某一个POS的请求啊,这个接口是这个呃是表达,那那个接口是接这种项目极少极少,然后嗯,待会呃如果是遇到这样的项目的话,呃我们可以在呃多写一个就是get post是strange传参就可以了。
05:16
或者说是你传过来之后,再多写一个get post的二这样的方法,或者get post呗这样的去实现,呃这里面呢,呃,因为第二种情况实在就是就是两种并存的,实在是太少了,包括那个呃之前我在分享那个呃翻类的时候,有一些呃接口,它就是get也有参数,Post也有参数,这种情况下就是极少极少的。啊,所以说就在这个位置里面就不体现了,如果是真的项目遇到了啊,就多写一个方法重载就可以了啊,然后这个是概率方案,那这里面呢。嗯,就比较简单,就是因为你前面get get或者get poose已经拿到嗯,呃这个http request的对象了之后,然后就把这个对象发送出去,然后这里面呢,呃还涉及到两个方法,看这个,嗯,我看一个有一个啊啊这这个还没有在后面在在是这个地方,就是我获取完对象之后,然后我去处理对象的海打。
06:29
就设置head带这个,然后还有一个是处理响应head的这两个方法,呃设置head带呢,就是呃,比如说我现在黑带里面有一个token,呃,Token或者说我黑带里面必须加一些公共的参数啊,呃像那个嗯有一些参数,比如说像屏幕的一些,呃就用户设备的一些信息,还有用户的一些信息啊,我们都需要在这里面添加啊,包括之前讲到的网页端,因为嗯,因为那个网页端的接口比较好看,呃好演示,所以说之前演示的网页端比较多,像U,像cookie啊,这里面主要还是呃最重点就是cookie,然后呃像他那个啊这种我们都需要去处理,先在完请求之后,这个请求包含了一呃请求的,呃请求投请,呃不是那个这个请求到这儿的时候,这个请求只有那个请求的U。
07:29
还方法,还有数据,然后处理一下请求头啊,这里面呢,还这个方,呃这黑道的话主要是嗯,用处最多的还是处理它那个呃响应完的set cookie这个字段,然后偶尔会用到那个302重叠酱那个字段,嗯,然后怎么弄呢?就是比如说我这一般就用在登录这个登录登录完成之后,它会呃set一个cookie或者说set一个什么UID啊过来,然后我们就自动的把这个呃cook和UID呃存到当前的类属性里面,然后在set里面,在下一次啊,不管是鸡类还是模块类发送请求的时候,我们都把这个啊库IE信息给带上去,或者其他的一些黑信息给带上去,这样就OK了。然后我们项目里面比较重要的一个就是那个快速的ID啊,这个用于是日志最中用的,所以说每次都要呃,设置一个不同的。
08:29
跟以往不同的快速ID是这样,然后我们呃回到刚才那个方法,Get respond方法,就这个,然后get get respond啊直接这个应该大家都可以理解,就是先get一个,Get完了之后再get一个respond啊,因为后面的参数都是URLURL,呃post也是,所以说这这是这几个方法就就就就就不讲了,就其实它就是get get一个request的啊对象完了之后再get一个respond对象,然后在这里面,嗯,这个a right这个你看大家大家看这个颜色是白的,白的大家应该知道。
09:12
这个是用来在这个地方。就是我已经把呃响应拿到之后,我去验证这个响应的呃a right,就是不是正确的响应,呃在这个地方,它的主要的功能是什么呢?就是主要的功能就是我第一时间拿到响应之后,我先去验证一下它的响应结构,呃比如说我们之前呃看到的那个呃开源社区那个接口的返回的话,它就是code加message加result这种形式的,Result里面是一个呃嗯,但是嗯可能看的不多,一般呃他应该是杰森,或者说是呃杰森宿主的这样的一个形式,嗯这一步就是通用的,因为一个项目对于一个项目来说,它的响应结构啊,绝大部分是一致的。
10:04
啊,我也只能说绝大部分总会有那些啊,奇形怪状的鬼玩意儿的这种不太符合规范的这种时候就是验通通用的去验证一下这个响应结构啊,如果这个响应结构。呃,就是已经变了,或者说呃,呃出现了一些什么问题,我们就把它返回,呃不是如果想结构已经出错了,然后我们就直接去发一个预警,比如某个接口,某个呃什么请求,然后想出错了这种啊这种情况下呢,会一般会比较少,嗯就想就一般如果是我们的请求没问题的话,就直接请求过去了,就。想返回回来的响应结构是应该对的啊呃,在这个在什么情况下,这个响应结构会不对呢?就是说我们这个请求啊,其实没有走到服务的业务代码里面。
11:01
呃,比如说话,我们的我们的规定的所有的请求必须加一个request的ID,而且这个request的D,呃跟你的那个项目名是有关系的,有一有一些验证,呃,比如说我是呃教师端的项目,我可能的前面的request来D有一些一定的规则,然后我的这个request来D相当于跟域名是有关联性的,比如说我传了一个错误的呃,就根本不符合规范的快捷ID的话。说N能那一层就把它拦了,就把这个请求拦掉了,然后就会返返回给你一个别的code的码,然后告诉你这个request ID不合法这样的,这样或或者说是呃,你请求了一个不存在的URL,或者你URL拼错了,呃像之前呃演示中也有遇到的,我们从网页端呃那个复制的一些东西的话,可能就会把网页端的空格分行符这种东西复制过来,然后我们不注意的话,就发送请求的话,就应该会报404这样的,一般就这种情况下会出错,呃在正儿八经的业务验证的时候。
12:10
嗯,什么时候会出错呢?一般就是,嗯,比如请求某一台服务,那一台服务正在重启,然后它就会就会返回一个通用的一个错误验证这样的。然后还有就是A,它里面还主要验证了一个应的扣的,也可以验证响应扣的,因正常来说,我们每一个接口的响应的业务扣的应该都是一个规定的,因为之前我们那个演示的那个开源社区,它就是200 200就是正确,然message成功,那一般有的规定为零啊,零是成功的,非零的都是错误的,去验证一下这个,如果嗯,我们做接口的,嗯。自动化测试的话。我们会有很少去,不是不是很少,就是有一部分是做的正常的业务的测试啊,比如说我更新啊,更新用户信息,然后验证用户信息是否更新成功啊,这一堆包括登录这些所有的接口都是需要他请求成功的,我们就需要首先去验证它的响应结构,它的扣是不是等于零,然后呃,像一些异常的啊,比如说。
13:20
那个呃我验证一下用户名密码错误,这种这种right这个方法就是详解呃响应信息,呃不是响应的扣的,他就是不不不是那个200或者零,或者说是比如他可能自定义的,比如说是呃就刚才是呃开源社区的他就是400啊异常的它就是400这样的,这个主要是胶验在这个在这个地方啊所以呢,呃针对于异常的那个测试用例,我们呃在写测试脚本的时候,我们需要去把这个这个方法给嗯可以说就把它屏蔽掉。
14:01
这样的,然后嗯还有一个就是嗯,在这个地方的话,嗯,我们通常会嗯有一个黑名单的形式,包括这个check扣也是我们会通常会有一个黑名单的形式啊,就是说啊,比如说呃,我业务验证的呃某个URL。或者说某一个code的,我们就不叫呃A就是直接返回为处了,这样,这个就看自己业务自己项目的各种,反正是情况比较多切扣的呢。嗯,这个主要是。呃,跟这个有,跟这这个有很大的重合,我给大家看一下这个地方什么时候用到。大家看这个地方也是在这儿。这开扣的呢,它返它会返回code的啊,就是它其它其实是返回那个业务code的。
15:01
这个方法。然后但是为什么会有request in for呢?啊,就是跟刚才讲的是一样的,就是说如果我这个呃有一些嗯嗯接口我是不不嗯比较例外,是不想用这个code的,或者说我的code根本跟通用的那个code是一致的,或者说我有一些嗯,比如说我在这个项目测试过程当中,有一些接口是不嗯,比如说我是呃像服务器记录请求数据的测试框架里面有,大家可以看一下在这个地方啊。这是响应完了之后,你看在这个地方我会记录这个向数据库,或者是向数据库服务发送一个请求,把这个信息给传到呃,某一个测试服务里面去记录的话,就是不不校验这个code,这个request,在这个地方还有就一些URL接口,有些接口你像如果是我们可能会获取到一些,呃,比如说静态的文件。
16:13
呃,因为我之前接触过一个就是他的呃业务的code的,所有的业务的code的码对应不同的信息,它会有一个呃镜,呃是一个接维,维护了一个服务端,维护了一个接大家呃如果项目启动的话,先要把这个接拿过来,然后你再根据不同的扣的码,比如说我响应了呃5001,呃5001可能就代表着你这个用户的名字太长了,然后他会把code的和呃响应信息存在一个接层里面去拿那个接的时候,那个扣那个请求的URL可能就不需要校验折扣的,是这样的,然后这是这前面这些就是基本跟就是跟接口请求发送,呃解析,还有一些通用的验证这些相关的这些方法。
17:05
然后下面的话就是。呃,下面这些就应该就是跟跟业务相关性会比较多一点吧,首先这个登录哎这个登录嗯,首以我之前讲过,就所有的,呃,不管是啊机类或者说是模块类的,呃,它的调用的功能,呃封装的功能方法一般都是返回一个接证对象,把它响应返回回来,在这里面没有啊原因就在于原因就因为我们在登录的时候。嗯,首先我们去呃获取我们的配置里面的用户和密码,呃,用户的账号密码啊,还有一些可能有一些别的事情,呃,别的别的参数,然后放到这里面之后请求登录,登录完之后我们去从登录接口呃获取那个cookie,然后去处理这一大堆东西的时候,我们需要把这个机类的属性给赋值,不然的话,我们模块类集成机类是可是没办法,是没办法去继承这些属性的值的,所以说这个log就是这个不返回任何内容啊,然后嗯,这个这两个刚才已经讲过了,然后这个获取公共参数啊,这个方法是非常常用的,因为几乎呃所有的模块类都要呃创建那个呃请求数据的时候都要获取这个,嗯,这个一般就是嗯。
18:35
我们项目里面嗯,就会添加非常多的用户的呃信息的记录啊,做了UIDID,呃软件的版本,呃,呃系统版本,然后还有一个就是呃软件版本,系统版本啊,还有一个就是那个用户的那个那个那个那个用户的一些个人信息,年底这些乱七八糟的会到这里面,然后还有一些,还有一些别的项目来说的话,就是我是把不是把那个验证信息放在里面的,是放在参数里面的,比如参数里面就是头NUID这两个验证信息啊,是这样的,所以然后所以说是get啊,这个这个方法就是获取通用验证信息的,我通通用参数了,我获取到这个,嗯,Get完之后我拿。
19:35
啊呃,当一个健身对象,然后我再往这个对象里面再复制,然后再去把这个呃健设数据放到那个请求那个请求包的里面啊,或者如果是get的话,就请求到URL啊,这个引匿呢,呃用的会有呃比较少一点,就是针对有一些有一些接口啊,有一些项目,嗯,像我之前接触过的一个单点登录的项目,它就是啊登录这个操作非常的复杂,然后我们有了呃还还有可能就是我们有了这个用户的一些验证信息啊,就比如说UID和token,我们有了质量,我们怎么去初始化当前这个积累。
20:25
这这是一点,嗯在嗯,如果你跟同事是一起的,呃一起去完成一个接口的测试的话,比如说这个用户同样一个用户需要不能同重复登录的话,你就只能是呃,他那边登录或者你这边登录拿到拿到一些信息之后,然后再嗯,相当于公用一个token这样的,或者说是。有些项目没法直接去登录或者投N,比如说那个有一些需要什么呃拖拽二维码,或者说是做一些呃什么人机交互的这种这种鬼验证呢,就没办法去直接请求登录接口去验证,然后而且开发又不愿意,呃因为你这一点小屁事,改他的登录接口验证的这种代码的话,呃,我们就只能通过呃手动登录或者说呃别的方式,或直接获取那个N,呃或者说是那个用户验证去初始化当前的对象。
21:32
然后这个的话跟如果是使用到这个方法的话,可能那个log方法也会调用这个log方法会调用这个need这个方法,这个极极少用到,一般就是接口调试,比如说别的用户请求这个信息请求这个接口就是不一样啊,或者就就是有问题啊,然后你就把他的用户托管拿过来,初始完之后,比如说有个用户那个更新,嗯,更新用户名就是不通过,然后然后就把它的信息拿,呃通过拿过来,然后初始化这个对象,然后新建一个user对象,User INF inform对象,然后用user in对象,然后就get不update user inform,然后去进行调试,看错误是什么,什么错误,这个record request的,嗯,这个有一个就是跟那个fun library记录最后一个登录请求是一样的,因为我们可能在设置,呃,这个主要压测过程是用的可能一个呃一个对象他请求。
22:32
如果是呃,这一个对象做完了一大堆我们封装好的方法的操作,他呃执行完一个功能,可能这吧,执行完一个用例,可能请求了四五个接口,这样的我呃四五个接口我们就获取了,其实四五个request请求对象嘛,我们可以把这个四五个request的请求对象当做一组request的对象,然后我们去做压测,如果关联性不大的话,如果关联性大的话,我们就需要将这四五个方法做成一组,还有一个就是我们需要对这四五个对象分那四五个request的这接口,分别的按照不同比例去做,那呃做那个呃接口压测的话,或者说是我们新建了很,因为我们有多用户,可能一二百个用户,我们一二百个积累对象,然后每个对象都会记录一两个请求,我们再把这一二百个再乘以一两个,可能就是二三百个三。
23:32
三四百个这样的请求,然后按照一定比例去重新去压测,这个时候这个时候用啊这个呢啊就是跟这个是一样的啊,看他是因为我这里面我直接去我看这个这个地方哪用到啊,没有用到哦,这个地方哦,知道为什么这个是白的了,因为这个嗯,我用了一些那个格位的东西,它只要所有的get的方法,它都是认为是有一个属性,这个类自动的一个request ID的属性,但是不不影响啊,然后这个就是获取请求,这是记录,这个是获取请求,然后这两个就是在性能测试的时候用的,对于一些呃比较比较特别是多接口,呃多用户多接口的这样的中间有一些,嗯,有一个问题就是这两个方法啊,Check和这个如果是多项。
24:32
嗯,大家看一下我们这个,嗯,它其实这些方法全都是静态方法,所以说他呃整个只有一个对象,所以说如果是多项目呃多用户多项目的它的A和check扣它不一样的话,我个人建议大家是把这个直接关掉,就把这一块就是艾这个赛海的方法,直接就把它设设置成,那这样会比较合适一点,因为不同项目同时使用一个校验方法的话,就很可能就报错,就误报,全都是误报,这很麻烦。好啊,今天的分享就到这里结束了啊,下次会分享一下就如何写一个自动化车的项目,欢迎关注我的公众号,拜拜。
我来说两句