00:00
嗯,Hello,大家好,然后今天给大家分享一下那个关于模块类的一个写作的一个实践,然后我们回到之前给大家分享过的一个学生pad的一个项目,然后我们找这个里面,嗯,找这个user类给大家演示一下,呃,首先呢,就是就是我们的一个接口,呃,接口文档嘛,就是写的写在一个moo平台里面了,然后呃,这里面不方便给大家展示啊,咱就可以忽略这个接口平台。接口文档,然后直接看这个封装的方法就可以了,呃首先呢,嗯上一次好像是遗漏了一个呃用户管理,然后这个用户呢,用户管理呢分呃两大类吧,第一类就是在做功能测试的时候的一类用户管理,呃另外一类是在做自动化测试的时候的用户管理,呃一般来讲呢,呃呃一条自动化测试用例,呃需要绑定唯一的一个用户,然后别的就不要别的测试用例,或者说别的测试都不要用到这个用户,然后防止了数据呃被污染,是这样的。然后就是今天给大家先分享一下那个呃在做功能测试的时候的呃用户管理其实非常简单,就是自己新建一堆用户,然后通过一个property的一个配置拿到这个。
01:39
这个呃,大家呃,拿到这个user,这个resource里面会有一个,每一个环境下都会有一个user的一个配置文件。呃,这个配置文件呢。我先给呃这个换行去掉,呃这个配置文件呢,就分呃学生和老师,这个是家长的,然后读到这个配置文件之后呢,然后把这个全部变成数组,然后我们会有一个get user teacher user,还有一个get student user,呃这个方法,然后这这里面就做一些简单的判断,就是如果他传的这个int就是超出了这个范围的话,就返回一个默认值,以后设置的默认值就第一个,然后这个也学导示的,也是后面的这些啊,就是获获取最后一个学生,最后一个老师啊这样的啊学生的呃,获取学生数,获取老师数,然后啊随机获取一组学生啊这个是有什么用呢?这个就是在有的有的时候嗯去嗯,像一组学生,把一组学生分成组啊,或者说把一组学生单独的去拉个班啊,这样的时候用的这个是随机的。
02:53
这个倒啊,无所谓的,然后主要就是做一下用户管理,然后呢,用户管理之后密码这里是没有做处理的,就是因为各个项目它的密码加密方式可能不一样,那个学生的密码是一个呃,固定的一个呃铭文都是一样的,但是加密之后的密文它就不一样了,所以说密码是各个项目自己实现的,然后这个就是用户管理啊,这个功能测试的用户管理,然后我们get贝的时候一般就是呃之前讲过那个鸡类的get,它一般就是获取第一个用户嘛,搜一下get,然后如果他有空的话就是呃,获取第一个用户要看这个地方user.get to,然后他的名字也是呃不是呃,账号和密码是同样的,然后这个地方会有加密,在这个地方会把密码加密成密文,完了之后放到传到。
03:53
接口里面,然后得到一些呃用户校验,然后有的用户用户管理呢,就这么多,然后你大家看我之所以用新建了非常多的用户,因为有时候呃,特别是在做压测的过程中,呃,用户的需求量还是挺大的,有些接口的话,就一个用户估计也就请求啊,绑定一个线程,然后不停的去请求,也有些资源的话,每个用户跟每个用户不一样啊,这样的啊,所以我新建了,而且就是我们在做对班级呃的测试的时候,一个班可能五六十个人啊,一个老师可能四五个班啊这样的,呃,一个测试的数据量的时候,呃,我需用到了这么多测试用户啊,是这样的,然后嗯,其实一般来讲,如果不是像我们这种呃,像这种班级呃,学生老师一对多,很多这种形式的业务的话,一般这个功能测试的测试用户,呃,不需要那么多。
04:53
呃,因为为什么呢?因为这个用户一多,你这个维护用户的,呃,维护这些用户的测试数据的时间就会变很多,呃不像那个自动化测试,自动化测试的话,我我自定义一个呃不自定义新建一个呃用户的话,我把他的那个数据呃,他一些账号的一些信息,相关联的信息初始化之后啊,我就不用管它了,然后我我只要保证别人不要动它,然后我自己别的项目也不要动它,就这样就可OK了,但是这个功能测试用户呢,就是我经常会动,就是我可能呃去测试某些功能的时候经常会动,这些用户会呃做一些习题啊,或者提交一些答案啊,这样的就会很麻烦,如果你再把用户再进行很多用户都要提交或者初始化做一些经常会变,就会很麻烦,所以说就是呃,功能测试用户和自动化测试用户是分开的,然后讲完。
05:51
呃,这个用户管理之后啊,我们回到这个user center user center就用用户中心它里面的,呃,大家看一下就是,呃,这个是获取用户信息,修改密码,更新头像,然后获取一个回复反馈这些的,要看这个这个代码它先是继承类的,然后写一个构造方法,然后调用那个负类的,这个这是一个写着字好像没用,嗯,大家看这个第一个,然后嗯,我看我给大家看一下这个profile里面的,它会有一个呃,User center API,看user API这个API里面,呃全是一些静态的那个string支串它呃里面有各种啊,这是登录的接口,因为登录接口这个也写到这儿了,然后这是user in的。
06:51
这个是那个反馈列表,这是反馈,这是repeat,不知道什么鬼玩意忘了,然后这是先有这个在profile这个配置的里面有一个呃类,专门把这些接口全都接口地址全都记下来,然后我们看我们这个get user in for这个呃功能是怎么把这个接口封装的,然后这是从这API里面拿到这个user in for的呃接口地址,然后get parent parent里面就是公穿u ID token name,还有呃公共的一些乱七八糟的固定的参数,然后就是get post responsible API,然后这个a outpp put一下,然后return就完了啊嗯,在我们做那个呃测试的时候,一般呃做功能测试的时候,我们都会都所有的都需要去看这个响应结果,所以我用了那。
07:51
这个output啊,Respond,然后如果是大家在做性能测试的时候,一定要把这个给那个取消掉,呃也可以不取消,呃也可以取消,但是为了那个数据准确性嘛,尽量把它取消掉,因为这个呃接口框架这块的话,呃没在呃因为output它也会写日志,嗯这个接口测试框架在呃写日志这块呢,第一都是默认的配置啊,没有对日志写日志这个功能进行一些性能上的优化,我看有一些方案就是说异步啊,或者说做别的优化的,这个没有优化,呃我我感觉应该是那个串行的,所以说如果是在性能并发的时候,Output,你打印过多日志的话,它也有可能会导致一些,呃嗯,本机向服务端发起呃发送那个请求的呃,性能会降低这样的,然后这个就return。
08:51
Return的主要return的原因就在于我拿到这个,呃,想应结果之后,我并不一定就是必须在这方法里面处理,有可能去在方法外面处理啊,如果是在这个里面处理的话,就会一般放一些比较通用的,待会我看一下这个moify,这个passwor大家就可以理解了,嗯,因为很多嗯,实际的业务有可能一个接口返回回来的结果可能有七八个字段,但是他某一个接口,呃,某一个用力,它可能用到了其中一个或者两个字段,像这种比较特殊的都会放到这个方法外去那个解析和验证,然后这个修改密码的啊,修改密码的这个啊,那个你给大家看这个会比较简单一点,就new passw world old passw world,然后get,这是。
09:41
这个这个方法就加密获取密文的,然后看到它还是这个对象的UN name和new password啊,这是一个,因为我是那个呃,New password和old password是那个写死的,就是呃,新新用户,你看新的密码等于get your name,呃,旧密码等于盖当前的密码是这样的,所以因为在这个地方我并没有去对它这个修改密码进行参数化验证,还有一个原因是在于,呃,即使那个new password和o partwor铭文是一样,但是加密回来,加密出来的密文是不一样的啊,对于服务端来说,它就是不同的密码啊,这个是可以就避免这个问题的,特别是在压测的时候是可以避免掉,就是那个new worldld跟LD是一样的,然后大家看我是怎么处理这个我们这个嗯。
10:42
呃,那个我去写一个DEMO吧,重写一个吧,这好多。嗯,就这个吧,我们一般用get这个方法,嗯,你大家那个其实就是位里面的一些格位的写法,因为它的所有的对象数据类型都可以用deport来代替,嗯,下面就是最重要的一行代码,就是然后我们执行一下。
11:53
我记得应该是put的out put的响应的。啊,账号密码错误了,我看一眼环境切错,前两天在线上环境测试啊,把这个符号取消掉啊,大家看我们这个现在是这样的,就是我们现在的业务是,呃,这是一个结构体啊,然后这是一个结构体,然后这个结构体里面呢啊包含了UID这个这个等于零啊不知道什么鬼玩意,应该不等于零的啊,这个是sid应该也是不等于零的。
12:34
嗯,但可能是这个业务它本身不需要这两个字段吧,大家看那个token。它会返回一个新的token过来,然后你看大家看我是怎么处理的呢,就是哎,我拿我直接把这个拿到这个头Ken,然后调到这个token,然后把super set也get了这个呃把这个呃副类就它那个鸡肋对象的,对那个ton也是更新的,嗯,这里之所以没有采用之前呃看到过一篇文章讲那个啊那个什么。
13:10
呃,什么什么一个JAVA21种设计模式里面的一个通知者设计模式,那个我感觉是实在有点太麻烦了,然后他是把所有的呃这个嗯token的话弄一个方法,然后再通过一个调用,每次get一次方法,呃他先是有一个把鸡类的设置机类对属性的那个那个搞成一个方法,然后子类去获取,呃子类去获取负类的时候也搞一个方法,然后啊通过一些操作就可以达到副类在修改这个偷窥的时候,所有的所有的这个副类的子类都可以同时的这个属性都得到修改,那那个对于测试来说有点麻烦,因为呃用到的不多,呃的确不多,除了就是修改密码会导致to困呃失效或toke困更新以外,其他的都不会有这个这个这个场使用场景,所以说我就直接在这里set了一下啊,如果。
14:10
呃,比较复杂的,呃呃特呃比较复杂,可能涉及到这个,大家就是重新再设置一下机类的那个,或者说新建好的模块类的都就可以了,大家看那个更换头像,嗯,更换头像把这个关掉,哎更换头像也是,呃这里面啊这里面什么的,就直接把这个ul写进去了,呃,你看这个超参数,参数参数名,参数值,参数值设置file,然后后面跟一个new file,这是要common的,这个picture pass picture pass是获取这个图片地址的,本地的图片地址的,然后如果是服务端的话,呃,一般呃需需要区分一下本地环境和服务端环境,服务器环境,服务器环境的路径跟本地的是肯定是不一样的,然后这里面是通过配置去配置的各个环境去解决这个问题的,然后。
15:10
大家看就把它p put完就行了,这种这是一个呃上传文件的那个呃接口,然后剩下的就就比较简单了,然后大家看前面的这些接口,呃,我都没有做那个参数啊,全都呃不这些方法都没有写参数,包括这个呃get回复啊都没有写参数,这个是直接写词的这个呃呃这个写的参数的提交自己的那个那个啊学科subject的学科,然后在这个地方。这个因为我们这个我的用户是用了那个初中呃高中三年级,所以说这里就是用的这个gra,就直接写了12,然后page,然后typed啊这些都是写的啊,包括后面这个check这块也都是写死的啊,这个之之所以是呃写死的话,是因为这些呃包括你看获取教材版本这些这些参嗯这些方法呢,第一是嗯这些是在做功能测试的时候用的啊,第二呢,嗯进行参数化,因为自动化测试的,我们公司现在用的自动化测试的一个框架是呃基于spring和那个TNG去做的那个呃数包括参数化也都是基于那个框架去做的啊,所以说没有用到这个啊这些方法,这些方法呃就是呃,我在。
16:49
呃,工能测试还有那个啊,性能测试的时候会用到的啊,所以说没有做那个参数化,嗯,正常来说的话,呃,像像这个呃这这这个修改密码的话,它应该会那个铭文,呃旧密码的铭文就不需要填了,它会应该会有一个参数叫做啊,比如说是string over passw world,然后在这儿就是啊不对,实际六趴玩,然后这里面就应该写成U发了啊应该就这样这种形式了,然后我们在写自动化测试用例的时候,就需要对这个方法的呃参数进行验证,如果是呃更嗯更苛刻一点的话,我们就是还要把这个。
17:49
自己O的话,Word也写进去,因为我们的测试用例肯定是有传,呃,就错误密码啊,不是旧密码传错的情况,或者说多一位呀,少一位呀,或者说太太太太以前的这在这个密码之前用过的旧密码,这种操作的话,我们需要把这两个。
18:11
嗯,两个参数,呃,这接口需所需要提供的两个参数全都要在方法的参数里面体现到,这是一个比较呃严格的一个那个呃就是封装封装的,如果大家要去真的去用用这个框架去做自动化的时候,最好是把它全都封装起来,是这样的。需要,然后我们才可能去在自动化用例去写那个,呃,比如说我们,呃现在就手写一个不的,比如说是这样的,然后我们就可以去,嗯,你有有点心态点,嗯,就是我们选,比如说穿一个正确的,在正确的铭文。
19:38
密码啊,正确的旧密码,然后这是新密码啊,新密码就是T了,然后这里面就算完事了,然后这个问题是因为这个我没有去呃做断言或者说验证它是否成功的原因就在于我在这儿有了一个ARA,包括在接口请求的时候也会校验一下它基本的结构体啊,在这里面就会有一个验证,因为这里面那个UID和u name都是无用的,然后我们再做什么呢?我们再做一下就是呃,用当前用户用这个密码去登录,然后new k,当前用户呢,就是T,呃,User us.get student,零,我们就是零,然后密码是。
20:38
登录呃,这个登录呢,呃,因为登录的时候也呃也做了一些校验,就是说如果是登录不成功的时候,会有一个预警发出来,然后在这里面我们就可以完成一个修改密码来测试接口测试用例,呃自动化测试用例,呃为了这大家大家记不记得之前我演示过一个就是接口的测试用例的话,它是必须要能够无限制的去运行,而且不会影响,比如说我们这个get是第131号,1913号。
21:15
用户我绑定的就是这个修改密码的接口的某一个测试用例,就是这个正确的铭文密码和符合规范的啊纯英文的呃这个呃,新密码这样,比如说是这样的,哎,那那那个我们就不能用这种方式了,对吧,这应该是应该用P这种。然后如何我们我们如何把这个参数也给那个做成一个,呃,比如说讲它,因为呃永永久的可运行的,因为到最后大家看发现其实更改过一次之后,它新密码和旧密码其实是一样的,虽然说对服务器来说是不一样,但是呃,为了更好的去完成这个get number number,然后我们获取一个十位的随机字符串。
22:17
这是我们获取到的一个随机手册啊,对吧,然后这是一个,对于这一次来说,这是一个新密码,然后我们获取到旧密码,然后修改成新密码,修改成新密码之后,我们再用那个呃那个那个呃新密码去登录,登录完成之后,诶OK,这是一个呃就是已经一次循环嘛,但这有一个问题,就是说我们这个呃新密码这个登录完之后,我们再去校验之后,我们还要再循环一次之后,这个呃第二次执行的时候,这个就你围绕number这个字已经变了。
23:08
就是我每次课就基本上能够保证我每一次都会用一个新的呃,不同的铭文密码去替换掉老的铭文密码啊,是这样的,然后大家看在在这个在在这个地方它就有一些问题,什么问题呢?就是说这个地方是循环的开始,然后这个地方就不能用这么个操作了,所以说那个地方也需要用这种方法。这个地方在这个,呃,等会儿稍等一下。把它盖好。在这个地方我们是没办法获取到。呃,那个这个用户随机出来的,呃,上一次修改成功的这个有一个number了啊,所以说呢,这个时候我们可能需要去,呃,把这个number去save一下,Save save。
24:12
不用写number,比如说我们这个T的EM1001诶。然后我们在这里面就是W点。然后我们再把这个给读取出来啊,是这样的,我们把旧密码是吧,就是相当于当时呃现实中这个用户当前的铭文密码再读取出来,然后再重新去那个进行这个循环,然后对于呃一个自动化用力的来说,呃这个就算是已经呃完成了,就是可以无限的,如果它中间不出问题的话,我们就可以无限的循环去调用这个号码,如果它不出问题,我们就认为可以啊,非常可信的认为这个接口啊,修改密码接口。
25:16
的这个用力是OK的,然后我们就呃,比如说发板或者干啥的,我们跑一遍没有没有问题,或者说我们用一个呃,定时自动循环去跑的这样一个,呃嗯,这样一个那个机制的话,我们就可以很好的保证这个接口的功能的可用性是这样的啊,今天就讲到这儿吧,欢迎大家关注我的公众号,拜拜,下期再见。
我来说两句