最近几个月的工作任务都是通过使用RF工具来搭建服务器端接口的自动化测试,使用python作为2次开发的语言,也是第一次去做这种项目,经验善浅,还是很有可能会走很多的弯路,为此,我希望自己能把每个阶段的进展还有点滴的收获,在此记录,然后能有个总结。
在15年的时候,我做过java web的接口自动化测试的开发工作,使用的技术比较简单:webService的XFIRE框架+testNG+Dom+POI,属于纯java代码构成,结合ant可以单独部署使用,是基于soap协议的(基于http协议),只需要组织好输入的参数,然后将参数传递给本地的接口,本地接口再调用远程服务的接口,就能得到实际返回值,实现比较简单。而这次主要工作如下:组装成一定格式的xml,然后发送给服务器端,然后从reciv_buf内提取需要进行check的字段的数据(实际结果),再将实际测试结果和预期测试结果进行比较。
由于RF是基于关键字进行组织测试用例的,所以在做最初级的demo时,只做了简单的处理,自定义一个lib,提供createSendBuf这个关键字(输入参数:报文id),能返回符合发送给服务器端格式的报文。然后lib内能调用dll文件,与服务器取得联系后,直接把报文发送给服务器,并取得返回结果(dll由开发提供,只需要在py脚本内对dll的导出函数进行调用即可封装成想要的关键字),然后再提供关键字paraseRecivBuf(输入参数:报文内的字段),这个关键字,可以从RecivBuf中拿到特定字段的取值,最后把这个值跟预期的进行对比即可。
第一次做出来的demo,可以用简单粗暴形容。xml数据组装如下:用一个list保存tag的name,然后用一个dict来保存tag的name(key)和tag对应var属性的值(value)。然后组装成xml格式的内容。部分代码如下:
#创建文档对象,文档对象用于创建各种节点。
dom1=xml.dom.getDOMImplementation()
doc=dom1.createDocument(None,"cmd",None)
# 得到根节点
root = doc.documentElement
root.setAttribute('id',iid)
elements={'ClientType':'','TerminalType':'','UserType':'','AppType':'','UserLoginType':'','UserName':'tes','ProductName':'FMS101','UserPassword':'','LoginServerAddr':'192.168.5.195:1089'}
key=['ClientType','TerminalType','UserType','AppType','UserLoginType','UserName','ProductName','UserPassword','LoginServerAddr']
for i in range(len(key)):
#elementNode=create_element(doc,element,'var',elements[element])
elementNode=doc.createElement(key[i])
elementNode.setAttribute('val',elements[key[i]])
root.appendChild(elementNode)
return root.toxml()
后面返回的xml格式如下:
{send_buf}=<cmd id=""><UserName var="loleina"/><UserType var=""/><UserLoginType var=""/><AppType var=""/><ClientType var=""/><LoginServerAddr var="www.fsmeeting.com:1089"/><UserPassword var=""/><TerminalType var=""/><ProductName var="
FMS101"/></cmd>
就把{send_buf}给底层py发送给服务器就完成了,在rf内的测试用例如下:
简单粗暴的demo就这样完成了,跟领导演示了下,就大致敲定了使用这个框架来完成服务器接口测试了,接下来我就可以展开更细致的工作了。后面问题就来了:
1. 步骤这么多,难道每写一个脚本都要重复一次么?
2. 每个接口的sendbuf的xml的格式是不一样的,id不一样,里面的tag的nodename也是不一样的,这要怎么办?难道每个接口都给写一个createSendBuf么,肯定不是这样的,那要怎样去做?
其实还有很多的问题,比如连接数据库的考虑,执行前连接服务器,数据与测试用例分离考虑,底层py调用导出函数的封装,接口之间的逻辑关系处理等等一系列问题,但是现在急需解决的问题是上面的2个问题,脚本怎么简化,每个接口xml该怎么组织起来(服务器知道xml格式,能将用户输入的参数放到xml里去)。然后看了下网上的各种教程,接下来确定需要做的就是对RF框架的熟悉和python语言本身的学习。