在上一篇,简单的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:/test2.xml").documentElement

        node = root.getElementsByTagName('cmd')

        for k in node:

            if(k.getAttribute('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.com: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 = root.getElementsByTagName('cmd')
for child in node[0].childNodes:
if((child.nodeName.startswith('#'))==False):
tagNameList.append(child.nodeName) for i in range(0,length):
tagNode = root.getElementsByTagName(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。

5. 基于winsocket的接口测试跟基于http接口测试还是有很大区别的,http是无状态的协调,tcp本身就是有状态的协议。这注定前置的业务肯定比后者复杂很多,基于winsocket的接口,接口和接口之间的联系,存在一些运行时的临时变量,也就是说B接口的报文组成,来自于A接口报文的某些输出,该部分输出作为程序运行的临时变量,保存在程序内存中,而非数据库中,当B接口使用,就去拿就可以了。这时,做B接口势必需要拿到A的结果里的临时变量,这个随着后面业务的深入了解,应该会越来越明朗每个接口之间的关系。

这些问题在再深入点了解RF和Python,做demo的时候,就开始不断的思考了。在这推荐一个还不错的RF的学习网址:

http://blog.csdn.net/tulituqi/article/category/897484/2

这个博主还出了本书,我也买了一本在学习,实际上跟上面博客上写的内容差不太多,看看上面的也就够入门的了。

RobotFrameWork接口报文测试-----(二)demo的升级版的更多相关文章

  1. RobotFrameWork接口报文测试-----(三)demo的加强版(数据驱动测试)

    在上一篇RobotFrameWork接口报文测试-----(二)demo的升级版基础上,将接口的xml的格式保存在xml文件中,然后程序如果增加一个接口,在xml文件里添加即可,无需修改自动化测试里的 ...

  2. RobotFrameWork接口报文测试-----(一)简单demo的实现

    最近几个月的工作任务都是通过使用RF工具来搭建服务器端接口的自动化测试,使用python作为2次开发的语言,也是第一次去做这种项目,经验善浅,还是很有可能会走很多的弯路,为此,我希望自己能把每个阶段的 ...

  3. .NET微信扫码支付模式二API接口开发测试

    主要实现微信扫码支付,官网的SDKdemo 就不要使用 一直不能调试通过的,还是自己按照API接口文档一步一步来实现,吐槽下微信一点责任感都木有,能不能demo搞个正常的吗,不要坑惨了一大群码农们有点 ...

  4. .NET MVC结构框架下的微信扫码支付模式二 API接口开发测试

    直接上干货 ,我们的宗旨就是为人民服务.授人以鱼不如授人以渔.不吹毛求疵.不浮夸.不虚伪.不忽悠.一切都是为了社会共同进步,繁荣昌盛,小程序猿.大程序猿.老程序猿还是嫩程序猿,希望这个社会不要太急功近 ...

  5. 使用Loadrunner进行http接口压力测试

    业务描述: 在业务系统里进行查询操作,查询的结果是通过请求http接口,从系统中处理并将结果以json字符串返回. 本文就讲述使用Loadrunner对此类接口进行压力测试并记录相关的性能指标数据: ...

  6. java单元测试之如何实现异步接口的测试案例

    测试是软件发布的重要环节,单元测试在实际开发中是一种常用的测试方法,java单元测试主要用junit,最新是junit5,本人开发一般用junit4.因为单元测试能够在软件模块组合之前尽快发现问题,所 ...

  7. 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo

    原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建 ...

  8. 基于Jmeter的轻量级接口压力测试(一)

    一.操作步骤: 1.在测试计划下新增一个线程组,并在线程组下新增一个http请求: 2.读取配置文件中的参数:在添加的http请求下添加配置元件-CSV DATA SET CONFIG 3.配置待测试 ...

  9. RobotFrameWork接口项目分层及通用控制方式

    1. 前言 上一篇文章介绍了在设计接口用例之前应遵守的设计规范,详见<RobotFramework接口设计规范>,当然读者公司的内部规范也不一定非得完全遵循笔者所提到的,适合自己公司内部的 ...

随机推荐

  1. oracle截取某个字符前面的字符串

    已验证. 要求:A.数据库表中的一个字符串 可能含有"+" 例:ORC+001 也可能不含“+” B.要求如果该字符串含有“+”,则取“+”之前的字符 例:ORC+001 取ORC ...

  2. Mongoose在向集合中插入文档时的集合命名问题

    Mongoose使用结构化的模式应用到MongoDB集合,为MongoDB Node.js原生驱动程序提供了更多的功能和简化了数据库操作. 从创建连接到向数据库中写入一个条数据经历了以下步骤: 1.连 ...

  3. 比较java与c语言中数字转换成字符的不同

    java java中将数字转换成字符非常方便,只要用一个"+"然后在跟一个空格行了.比如,你输入一个122 ,就会变成"122 ". import java.u ...

  4. new和delete malloc和free

    程序中动态分配的对象存放在自由存储区(free store)或堆(heap). C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达 ...

  5. LightOj1190 - Sleepwalking(判断点与多边形的位置关系--射线法模板)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1190 题意:给你一个多边形含有n个点:然后又m个查询,每次判断点(x, y)是否在多边 ...

  6. JS-010-覆盖率测试工具 JSCoverage 初识

    在日常的 js 脚本语言开发过程中,在开发攻城狮进行日常的单元测试和测试攻城狮日常的测试过程中,js 代码的覆盖率是白盒测试的一个重要的考量标准.前些天,在无意中看到了一个 js 覆盖率测试统计工具 ...

  7. Java的浮点数和整数的进制转换

    整数的表达 –原码:第一位为符号位(0为正数,1为负数) –反码:符号位不动,原码取反 –负数补码:符号位不动,反码加1 –正数补码:和原码相同     -6      5 原码 10000110 0 ...

  8. 基础拾掇之——http基础

    基础拾掇之——http基础 http协议介绍 http:Hyper Text Transfer Protocol 超文本传输协议,是互联网应用最为广泛的一种网络协议,主要用于Web服务.通过计算机处理 ...

  9. android 二维码生成

    1,activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); set ...

  10. javascript:void(0)和javascript:;的用法

    一.JavaScript:void(0) 我们经常会使用到 javascript:void(0) 这样的代码,那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢 ...