一月蔷薇_456 发表于 2018-2-27 14:38:35

Robot Framework 开发系统关键字详细

Robot Framework是一款python编写的功能自动化验收框架。具备良好的可扩展性,支持关键字驱
动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验
收测试和验收测试驱动开发(ATDD)

项目源码地址:https://github.com/zhoujinjian/robotframework.git

在使用框架类时,经常性有一些特殊的实现需求往往依据框架本身或者第三方插件是无法满足需
求的,本文的目的,是分享如何开发自定义的库函数(又称之系统关键字)

具体操作方法:

1、首先在..\Python27\Lib\site-packages目录下创建自定义库目录如Verification_Library,用于放
自定义的library库。

2、在自定义文件夹Verification_Library中新建一个"version.py"文件,用于描述自定义测试库的版
本信息。
代码如下:

VERSION='1.0'
3、在自定义库的文件夹Verification_Library下,新建一个keywords类,如文件名:verification.py,
测试类别为:Verfication 详细如下:

(本实例的目的,实现对传入的json格式的data数据进行校验--应用场景,主要是针对http
request库返回的response中的data数据进行校验):
__author__ = 'Administrator'
#coding=utf-8
#作用:公共json数据校验方法,遍历data数据,校验字符串及整型数值

import logging
data={"classify":
    [{
    "id":1,
    "name":"XX"
    }],
    "test":{},
    "hotSongs":[{
            "songId" : 2,
            "songName" :"ddd",
            "singerId" : 3,
            "singerName" :"aaa",
            "hash" : "435B50137E16526DFF5BB10DA13A2A4D",
            "climaxHash":"E0B5EA5454B5E651C609CE7B713E32F3",
            "startTime" : 104000,
            "endTime" : 125000,
            "krc" : "but I just can't make a sound",
            "singerImg" : "20111226113925990226.jpg"
      },
                {
            "songId" : 3,
            "songName" :"ddd",
            "singerId" : 4,
            "singerName" :"aaa",
            "hash" : "435B50137E16526DFF5BB10DA13A2A4D",
            "climaxHash":"E0B5EA5454B5E651C609CE7B713E32F3",
            "startTime" : 104000,
            "endTime" : 125000,
            "krc" : "but I just can't make a sound",
            "singerImg" : "20111226113925990226.jpg"
      }]
}

data1={   "songId" : 2,
            "songName" :"ddd",
            "singerId" : 3,
            "singerName" :"aaa",
            "hash" : "435B50137E16526DFF5BB10DA13A2A4D",
            "climaxHash":"E0B5EA5454B5E651C609CE7B713E32F3",
            "startTime" : 104000,
            "endTime" : 125000,
            "krc" : "but I just can't make a sound",
            "singerImg" : "20111226113925990226.jpg"
      }

class Verfication(object):

    def verfication_data(self,data,msg=None):
      '''
      1、验证传入的参数,如果为字典,则遍历字典中的各个key,判断各个key值,如果为字符串型,则校验字符串为非空,如果为整型,则校验字符串大于0
      2、如果传入的参数为列表,则将列表中各个参数取出,如果列表中各个参数为字典,处理方法参照第1步。
      '''
      if isinstance(data,dict):
            logging.info("---基本信息获取---")
            logging.info("传入的data为json对象!")
            logging.info('传入过来的json对象主key的长度:%s'%len(data))
            keys=data.keys()
            logging.info(keys)
            logging.info('---开始进行校验---')
            #定义变量,计算遍历次数
            times=0
            for key,value in data.iteritems():
                times=times+1
                logging.info("")
                logging.info("---传入的data数据,第%s对象元素,key值对应为:%s---"%(times,key))
                logging.info('%s:%s' % (key, value))
                self.analysis_subItem(value,msg)
      else:
            print type(data)
            logging.info("传入的data数据不是dict对象")

    #判断value值对应的类型,从而进行相应的处理,嵌入递归函数
    def analysis_subItem(self,item,msg):
      '''
      1、不管value值取出如何,最终还是拆解成最小单元,字符串或者是整型来进行判断
      :return:
      '''
      if isinstance(item,str):
            if self.get_length(item) == 0:
                raise AssertionError(msg or "'%s' should not be empty." % str)
      elif isinstance(item,int):
            if int(item)<=0:
                raise AssertionError("当前int型获取到的数字小于等于0")

      elif isinstance(item,list):
               value_list_len=len(item)
               logging.info('%s对应值的类型为list且长度为%s'%(item,value_list_len))
               for i in range(value_list_len):
                   logging.info("")
                   logging.info("内嵌的列表中,第%s个子元素"%(i+1))
                   self.analysis_subItem(item,msg)

      elif isinstance(item,dict):
               value_dict_len=len(item)
               logging.info('%s对应值的类型为dict且长度为%s'%(item,value_dict_len))
               times=0
               for subkey,subvalue in item.iteritems():
                  times=times+1
                  logging.info("")
                  logging.info("---内嵌的字典中,第%s对象元素,key值对应为:%s---"%(times,subkey))
                  logging.info('%s:%s' % (subkey, subvalue))
                  self.analysis_subItem(subvalue,msg)

    #计算字符串长度
    def get_length(self,item):
            length =self._get_length(item)
            logging.info('Length is %d' % length)
            logging.info("")
            return length

    def _get_length(self,item):
            try:
                return len(item)
            except:
                raise RuntimeError("Could not get length of '%s'." % item)

if __name__ == '__main__':
    run_object=Verfication()
    run_object.verfication_data(data)4、对于创建普通的模块来说这样已经ok了。但要想在robot framework启动后加载这个关键字,还需
要在自定义库目录Verification_Library下创建init.py文件,用于定义自定义库的相关信息和需要用到的
keywords调用继承和声明。
__author__ = 'Administrator'
from verification import Verfication
from version import VERSION

__version__=VERSION

class Verification_Library(Verfication):
    ROBOT_LIBRARY_SCOPE='GLOBAL'    #此句作用是指该库运行的时候会作用在全局。5、启动ride程序在setting部分添加library库信息,添加库名为Verification_Library ,即可成功导入自定义库。

注意:
库文件夹名称一定要和init文件中的类名称相同(Verification_Library),否则导入自定义库时会出错。

梦想家 发表于 2018-2-28 11:01:32

:handshake
页: [1]
查看完整版本: Robot Framework 开发系统关键字详细