在上一篇,简单的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. background:transparent的作用

    background的属性值 background : background-color | background-image | background-repeat | background-att ...

  2. SpringMVC 406 accept请求错误,没有加入将json序列化的包

    在spring中使用@responsebody发现请求报406错误 jar包中缺少json序列化的相关的包!

  3. linux:awk之RS、ORS与FS、OFS

      awk之RS.ORS与FS.OFS RS:Record Separator,记录分隔符 ORS:Output Record Separate,输出当前记录分隔符 FS:Field Separato ...

  4. 指向函数的指针与iOS-Block相关知识

    指向函数的指针与iOS-Block相关知识 一. 函数指针的定义和调用: 关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/ ...

  5. D3D标注动态避让

    原来也思考了该如何实现标注动态避让,认为必须得计算字符串所占的大小.如果在屏幕上要计算屏幕象素之类的东西. 今天总算找到了实现方法,在C# WorldWind中的KMLImporter类中有.关键是F ...

  6. bootstrap学习之一_bootstrap css

    一.文本相关样式 文本格式(用于块状标签):text-left:向左对齐文本:text-center:居中对齐文本:text-right:向右对齐文本:text-justified;text-nowr ...

  7. (转)在PHP语言中使用JSON

    原文 : http://www.ruanyifeng.com/blog/2011/01/json_in_php.html --------------------------------------- ...

  8. 一个小玩意 PHP实现微信红包金额拆分试玩

    <meta charset="utf-8"> <?php // 新年红包金额拆分试玩 class CBonus { public $bonus;//红包 publ ...

  9. WEB urllib2 module note

    收藏好文,看的懂文档,但效率太慢 cookie 清空 import urllib2 import cookielib from time import sleep cookie=cookielib.C ...

  10. SQL2008 R2 SP3中使用pivot实现行转列

    同事遇到一个问题,怎么实现行转列,参考了别人的示例,我是这样解决的. 创建数据源: create table #temp ( objectid int, sitename ), cities ), p ...