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:/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的升级版的更多相关文章
- RobotFrameWork接口报文测试-----(三)demo的加强版(数据驱动测试)
在上一篇RobotFrameWork接口报文测试-----(二)demo的升级版基础上,将接口的xml的格式保存在xml文件中,然后程序如果增加一个接口,在xml文件里添加即可,无需修改自动化测试里的 ...
- RobotFrameWork接口报文测试-----(一)简单demo的实现
最近几个月的工作任务都是通过使用RF工具来搭建服务器端接口的自动化测试,使用python作为2次开发的语言,也是第一次去做这种项目,经验善浅,还是很有可能会走很多的弯路,为此,我希望自己能把每个阶段的 ...
- .NET微信扫码支付模式二API接口开发测试
主要实现微信扫码支付,官网的SDKdemo 就不要使用 一直不能调试通过的,还是自己按照API接口文档一步一步来实现,吐槽下微信一点责任感都木有,能不能demo搞个正常的吗,不要坑惨了一大群码农们有点 ...
- .NET MVC结构框架下的微信扫码支付模式二 API接口开发测试
直接上干货 ,我们的宗旨就是为人民服务.授人以鱼不如授人以渔.不吹毛求疵.不浮夸.不虚伪.不忽悠.一切都是为了社会共同进步,繁荣昌盛,小程序猿.大程序猿.老程序猿还是嫩程序猿,希望这个社会不要太急功近 ...
- 使用Loadrunner进行http接口压力测试
业务描述: 在业务系统里进行查询操作,查询的结果是通过请求http接口,从系统中处理并将结果以json字符串返回. 本文就讲述使用Loadrunner对此类接口进行压力测试并记录相关的性能指标数据: ...
- java单元测试之如何实现异步接口的测试案例
测试是软件发布的重要环节,单元测试在实际开发中是一种常用的测试方法,java单元测试主要用junit,最新是junit5,本人开发一般用junit4.因为单元测试能够在软件模块组合之前尽快发现问题,所 ...
- 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo
原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建 ...
- 基于Jmeter的轻量级接口压力测试(一)
一.操作步骤: 1.在测试计划下新增一个线程组,并在线程组下新增一个http请求: 2.读取配置文件中的参数:在添加的http请求下添加配置元件-CSV DATA SET CONFIG 3.配置待测试 ...
- RobotFrameWork接口项目分层及通用控制方式
1. 前言 上一篇文章介绍了在设计接口用例之前应遵守的设计规范,详见<RobotFramework接口设计规范>,当然读者公司的内部规范也不一定非得完全遵循笔者所提到的,适合自己公司内部的 ...
随机推荐
- LightOj 1024 - Eid (求n个数的最小公约数+高精度)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1024 题意:给你n(2<=n<=1000)个数, 然后求n个数的最小公倍数 ...
- JS的基础类型与引用类型
两种类型: ECMAScript变量包含两种不同类型的值:基本类型值.引用类型值: 基本类型值:指的是保存在栈内存中的简单数据段: 引用类型值:指的是那些保存在堆内存中的对象,意思是,变量中保存的实际 ...
- C#中static静态变量的用法
使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类.字段.方法.属性.运算符.事件和构造函数,但不能用于索引器.析构函数或类以外的类型 静态全局变量 定义 ...
- Android:学习AIDL,这一篇文章就够了(上)
前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说——你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓——那样就很尴尬了.不过又转念一想, ...
- Nginx负载均衡和LVS负载均衡的比较分析
LVS和Nginx都可以用作多机负载的方案,它们各有优缺,在生产环境中需要好好分析实际情况并加以利用. 首先提醒,做技术切不可人云亦云,我云即你云:同时也不可太趋向保守,过于相信旧有方式而等别人来帮你 ...
- 经过各种坑之后centos+ uwsgi + nginx +django 终于配好了
https://pypi.python.org/pypi/setuptools#downloads https://www.python.org/ftp/python/ 开机 加入 uwsgi ngi ...
- jquery在线预览PDF文件,打开PDF文件(向下兼容ie8、ie7)
最主要的是使用到了一个jquery的插件jquery.media.js,使用这个插件就很容易实现了. 核心代码 <!DOCTYPE html PUBLIC "-//W3C//DTD X ...
- xp系统的安装SVN
xp系统安装SVN,出现错误: 解决办法: 1,首先确定xp体统是否为sp3,SVN安装需要在sp3以上: 2,检查windows Installer是否开启,解决:控制面板-管理工具-服务—wind ...
- Vue.2.0.5-单文件组件
介绍 在很多Vue项目中,我们使用 Vue.component 来定义全局组件,紧接着用new Vue({ el: '#container '}) 在每个页面内指定一个容器元素. 这种方案在只是使用 ...
- Hibernte继承映射
继承映射分为三种: 继承结构共用一张表结构 每个类一张表结构 每个具体类一张表结构 下面使用Animal.Dog.Fish举例 Animal类如下: package com.hml.domain.a; ...