美文网首页robotframework测试buffer
基于RobotFramework的接口测试框架

基于RobotFramework的接口测试框架

作者: 海尔兄弟_ | 来源:发表于2016-09-06 16:33 被阅读6382次

    项目背景

    公司内部产品,大都采用B/S架构。由于大部分项目都在开发阶段,版本迭代快,界面不稳定,故而使用UI自动化不太现实。针对此种情况,接口测试较为有效,所以就使用RobotFramework搭建了一个简单的接口测试框架。

    RobotFramework简介

    RobotFramework是一个款关键字驱动的开源自动化测试框架。测试用例位于HTML或者TSV(以tab分隔值)文件,在使用测试库中实现的关键字来测试运行的程序。因为RobotFramework是灵活可扩展的,所以它很适合于测试具有多种接口的复杂软件:用户接口,命令行,web service,编程接口等等。当然接口只是一部分,web UI,移动端,该框架都游刃有余。接口测试工具,框架比较多,为何选择了rf,是因为有助于测试人员快速上手,学习成本较低,统一语法便于管理。

    封装的公共库

    基于robotframework实现接口自动化,使用requestlibrary库,该库基于python的requests库实现,由于在接口数量太多的时候,使用该库的关键字编写用例时影响速度,故而我又对requests封装了一下,以至于更高效的编写测试用例。先看一下我自己封装的库:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """
    __author__ = 'LiBin'
    __mtime__ = '16/6/13'
                  ┏┓   ┏┓
                 ┏┛┻━━━┛┻┓
                 ┃   ☃    ┃
                 ┃ ┳┛  ┗┳  ┃
                 ┃    ┻    ┃
                 ┗━┓      ┏━┛
                  ┃       ┗━━━┓
                  ┃  神兽保佑  ┣┓
                  ┃ 永无BUG! ┏┛
                  ┗┓┓┏━┳┓┏┛
                   ┃┫┫ ┃┫┫
                   ┗┻┛ ┗┻┛
    """
    
    import json
    import requests
    import time
    import hashlib
    import random
    import pymysql
    
    __version__ = '0.1'
    
    
    class PublicLibrary(object):
    
        def __int__(self):
            pass
    
        def getCoding(self, strInput):
            u"""
            获取编码格式
            """
            if isinstance(strInput, unicode):
                return "unicode"
            try:
                strInput.decode("utf8")
                return 'utf8'
            except:
                pass
            try:
                strInput.decode("gbk")
                return 'gbk'
            except:
                pass
    
        def tran2UTF8(self, strInput):
            """
            转化为utf8格式
            """
            strCodingFmt = self.getCoding(strInput)
            if strCodingFmt == "utf8":
                return strInput
            elif strCodingFmt == "unicode":
                return strInput.encode("utf8")
            elif strCodingFmt == "gbk":
                return strInput.decode("gbk").encode("utf8")
    
        def tran2GBK(self, strInput):
            """
            转化为gbk格式
            """
            strCodingFmt = self.getCoding(strInput)
            if strCodingFmt == "gbk":
                return strInput
            elif strCodingFmt == "unicode":
                return strInput.encode("gbk")
            elif strCodingFmt == "utf8":
                return strInput.decode("utf8").encode("gbk")
    
        def md5(self, init_str):
            """
            md5加密
            """
            m = hashlib.md5()
            m.update(init_str)
    
            return m.hexdigest()
    
        def eval_dict(self, strInput):
            u"""接收字符串直接转成需要类型,例
             | eval dict                   | str                |
            """
            strInput = eval(strInput)
    
            return strInput
    
        def random_num(self, num):
            """
            随机出给出数字位数的数字
            """
            number = ''
            for i in random.sample(range(10), int(num)):
                number += ''.join(str(i))
    
            return number
    
        def req(
                self,
                login_msg,
                url,
                method,
                data=None,
                headers=None):
            u"""专用,有登录状态,例
             | run interface test tenant  | login_msg,url,method,data,headers
            """
            session = requests.Session()
            url = self.tran2UTF8(url)
            method = self.tran2UTF8(method)
            if login_msg:
                login_msg = self.eval_dict(login_msg)
                md5_pwd = self.md5(login_msg['passwd'])
                login_msg['passwd'] = md5_pwd
            if data:
                data = self.eval_dict(data)
            if headers:
                headers = self.eval_dict(headers)
            else:
                headers = {
                    'Content-Type': 'application/json',
                    'Accept': 'application/json'
                }
            results = 'connection error'
            # 先登录
            r = session.post('https://xxxxxx.cn/login',
                             data=json.dumps(login_msg), headers=headers)
            print "*******************************"
            print u"登录状态信息"
            print r.status_code
            print r.content
            print "*******************************"
            try:
                if method == "post":
                    if isinstance(data, dict):
                        data = json.dumps(data)
                    results = session.post(
                        url, data=data, headers=headers, verify=False)
                elif method == "get":
                    results = session.get(
                        url, params=data, headers=headers, verify=False)
                elif method == 'delete':
                    results = session.delete(url, headers=headers, verify=False)
    
                return results
            except requests.ConnectionError as e:
                return e
    
        def con_db(self, sql):
            db = pymysql.connect(
                host="1.1.5.2",
                user="xxx",
                passwd="xxx",
                db="xxx",
                charset='utf8')
    
            cursor = db.cursor()
            cursor.execute(sql)
            data = cursor.fetchone()
            db.close()
            return data
    
    

    其中的req函数即是对request的一层简单封装,省掉了接口的每次登录状态。

    如何编写用例

    用例的内容一般是发起请求,拿到结果,结果验证。



    上述用例中即为发起请求、拿到结果、与数据库的数据进行对比。

    如何跑

    我们的用例使用git管理,项目在Jenkins每次构建后会自动跑一次,当然如果希望多次跑,就自己在Jenkins上添加时间调度吧。每次构建完成后,相关人员会收到测试结果,如果发现问题可以及时修改。


    以上就是使用RobotFramework做的一个简单的接口自动化测试框架(肯定还有一些地不完善)希望帮助到有需要的人。

    相关文章

      网友评论

      • 76267db444a8:作者您好,我想请问两个问题:
        1、get tree这个关键字是哪个库中的啊?
        2、最后那个测试报告感觉挺好看的,请问是怎么做的啊?
        76267db444a8:@海尔兄弟_ 谢谢了哦
        海尔兄弟_:1.https://github.com/divfor/robotframework-yamllibrary
        2.https://www.jianshu.com/p/9368b6627a6d
      • shadow000902:有没有实现线上数据库登录的方法,比如有SSH登录的数据库?
        海尔兄弟_:你这个描述太模糊,要连接什么数据库
      • cherry睿:很厉害哟,关于如何搭建jenkins自动构建项目,博主可否单独写一篇
        海尔兄弟_:这个网上就有,就先不写了

      本文标题:基于RobotFramework的接口测试框架

      本文链接:https://www.haomeiwen.com/subject/cbmdettx.html