RobotFrameWork接⼝报⽂测试-----(⼆)demo的升级版在上⼀篇,简单的demo实现了讲xml的数据发送服务器端并取得recvi_buf,然后进⾏了简单的解析的操作。现在就要解决之前提过的2个问题:
1. 步骤这么多,难道每写⼀个脚本都要重复⼀次么?
2. 每个接⼝的sendbuf的xml的格式是不⼀样的,id不⼀样,⾥⾯的tag的nodename也是不⼀样的,这要怎么办?难道每个接⼝都给写⼀个createSendBuf 么,肯定不是这样的,那要怎样去做?
针对第⼀个问题的解决,可以使⽤在RF内定义⾃⼰的Resource,然后写直接调⽤资源内定义的关键字,⼀⾏就是⼀条测试⽤例,这个问题解决很简单。针对第⼆个问题,应该⽤⼀个xml⽂件保存每个接⼝的格式,定义个⼀个关键字,输⼊接⼝的id,就能从xml中得到相应接⼝的格式,再从RF内接受接⼝⾥每个字段的取值,⼀起组合成send_buf,交给底层py调⽤含有⽹络通讯层的dll即可。
从xml根据id得到相应接⼝的报⽂格式的实现如下:
def findNodeByIdAttr(self,idAttr):
root = xml.dom.minidom.parse("D:/l").documentElement
node = ElementsByTagName('cmd')
for k in node:
Attribute('id')==idAttr):
str1= (k.toxml()).encode('utf-8')
return str1
这样就能更容易的管理报⽂了,如果增加了⼀个接⼝,直接在xml内进⾏格式定义即可。代码内部是没有涉及到具体报⽂⾥的具体字段,便于维护。接下来就是把从RF⾥得到的报⽂字段的取值(定义在list内),把具体值和对应的xml组合起来。toxml()⽅法返回的数据的type不再是⼀个instance,⽽是
str(egg:<cmd id="30000"><UserName var="name"/><LoginServerAddr var="www.abc:1089"/><UserPassword var="000000"/></cmd>),list的值为['loleina','192.165.5.144:1089','000000']现在就需要把这三个指分别赋值给UserName ,LoginServerAddr ,UserPassword 。得先将str转换成xml,再得到xml的tag的name,设置每个tag的attribute的值是list[i].代码实现如下:
def packageToXml(self,strNode,listArray):
tagNameList=[]
length=len(listArray)
str1='<?xml version="1.0"?><root>'
str2='</root>'
strNode+=str2
strNode=str1+strNode
root = xml.dom.minidom.parseString(strNode).documentElement
node = ElementsByTagName('cmd')
for child in node[0].childNodes:
if((deName.startswith('#'))==False):
tagNameList.deName)
for i in range(0,length):
tagNode = ElementsByTagName(tagNameList[i])
tagNode[0].setAttribute('val',listArray[i])
return node[0].toxml(encoding="utf-8")
最后看下,RF的测试⽤例的设计:
就这样完成了demo,在最开始的时候遇到了好⼏个问题:
1. 项⽬的接⼝有多个xml,需要合并成⼀个xml提供给RF使⽤,每个xml的格式不⼀样,编码格式也不⼀样,⽽且xml⾥针对每个字段有注
释,commentnode存在,得把注释去掉。(后⾯发现不去掉注释的xml,不去掉空格,空⾏的xml,交给底层的dll后,dll会进⾏预处理,整理好后再发给服务器)
2. 在xml内取tag的name的时,如果tagnode有childnode,按照上⾯的代码段是没有取出来的,这个后⾯得修改。
3. 从服务器返回的数据,根据接⼝类型的不同,增加类,删除类的接⼝或者只返回⼀个result字段的结果,查询,修改这类接⼝会返回很多的数据,数据还是从数据库查到的,这样结果这样简单的
处理肯定是不⾏了。得从数据库中查询,再按照⼀定的格式组装成xml,在把预期的结果xml和实际返回的xml做对⽐。
4. 去tagnode的name的时候,得判断下,因为xml内存在注释,注释也是⼀种node,称为commentnode。python处理xml文件
5. 基于winsocket的接⼝测试跟基于http接⼝测试还是有很⼤区别的,http是⽆状态的协调,tcp本⾝就是有状态的协议。这注定前置的业务肯定⽐后者复杂很多,基于winsocket的接⼝,接⼝和接⼝之间的联系,存在⼀些运⾏时的临时变量,也就是说B接⼝的报⽂组成,来⾃于A接⼝报⽂的某些输出,该部分输出作为程序运⾏的临时变量,保存在程序内存中,⽽⾮数据库中,当B接⼝使⽤,就去拿就可以了。这时,做B接⼝势必需要拿到A的结果⾥的临时变量,这个随着后⾯业务的深⼊了解,应该会越来越明朗每个接⼝之间的关系。
这些问题在再深⼊点了解RF和Python,做demo的时候,就开始不断的思考了。在这推荐⼀个还不错的RF的学习⽹址:
blog.csdn/tulituqi/article/category/897484/2
这个博主还出了本书,我也买了⼀本在学习,实际上跟上⾯博客上写的内容差不太多,看看上⾯的也就够⼊门的了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论