Python+Requests接口自动化测试框架

来源:互联网 发布:笔记本电脑降温软件 编辑:程序博客网 时间:2024/05/01 00:15

Python+Requests接口自动化测试框架

公司内部的一个接口自动化使用框架(之前的基础上改进)
  • 1.数据准备

    -数据插入(容易实现的测试场景下所需外部数据)
    -准备sql (接口需要重复使用,参数一定得是变量)

  • 2.集成部署(运维相关了解即可)

    -平滑升级验证脚本加入自动化

  • 3.自动化框架实现

    -调用mysql
    -excel遍历测试用例
    -requests实现接口调用
    -根据接口返回的code值和Excel对比
    -报告反馈
    -暴露服务

写一个简单登录的接口自动化测试

代码的分层如下图:

coding.png

一、写一个封装的获取excel表格的模块


excel.png

代码实现如下:

#!/usr/bin/python#-*- coding: UTF-8 -*-# 基础包:excel的封装import xlrdworkbook = Nonedef openExcel(path):         """打开excel"""          global workbook          if (workbook == None):                  workbook = xlrd.open_workbook(path, on_demand=True)def getSheet(sheetName):         """获取行号"""          global workbook          return workbook.sheet_by_name(sheetName)def getRows(sheet):        """获取行号"""          return sheet.nrowsdef getContent(sheet, row, col):        """获取表格中内容"""           return sheet.cell(row, col).valuedef release(path):        """释放excel减少内存"""          global workbook          workbook.release_resources()          del workbook

代码封装后当成模块引用,这还是最开始呢。

二、引用log模块获取日志

准备工作:
需要一个日志的捕获,包括框架和源码抛出的expection。
代码如下:

#!/usr/bin/python# -*- coding: UTF-8 -*-# 基础包:日志服务import loggingimport timedef getLogger():global tezLogPathtry:    tezLogPathexcept NameError:    tezLogPath = "/data/log/apiTest/"FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'# file = tezLogPath + time.strftime("%Y-%m-%d", time.localtime()) + ".log"# logging.basicConfig(filename=file, level=logging.INFO, format=FORMAT)# 开发阶段为了方便调试,可不输出到文件logging.basicConfig(level=logging.INFO, format=FORMAT)return logging

三、引用requests模块接口测试

准备工作:
需要的请求类型和执行测试的方法。
代码如下:

#!/usr/bin/python##-*- coding: UTF-8 -*-# 基础包:接口测试的封装import requestsimport tezLog as loglogging = log.getLogger()def apiTest(method, url, data ,headers):        """    定义一个请求接口的方法和需要的参数     :Args:    method  - 企业名称 str    url - 用户昵称 str    data - 参数 str    headers - 请求头信息 dict    """        try:          if method == "post":             results = requests.post(url, data, headers=headers)          if method == "get":            results = requests.get(url, data, headers=headers)          if method == "put":            results = requests.put(url, data, headers=headers)          if method == "delete":             results = requests.delete(url, headers=headers)          if method == "patch":             results == requests.patch(url, data, headers=headers)          if method == "options":             results == requests.options(url, headers=headers)          response = results.json()          code = response.get("code")          return code         except Exception, e:             logging.error("service is error", e)def runTest(sheet):    """    定义一个执行和断言的方法     :Args:    sheet  - 服务名称 str(excel页脚名称识别的)    """      rows = excel.getRows(sheet)    fail = 0    for i in range(2, rows):        #这里为什么从第二行开始跑,因为会先执行SQL如之前Excel展示的空白位置        testData = excel.getContent(sheet, i, gl.CASE_DATA)        testUrl = excel.getContent(sheet, i, gl.CASE_URL)        testMethod = excel.getContent(sheet, i, gl.CASE_METHOD)        testHeaders = eval(excel.getContent(sheet, i, gl.CASE_HEADERS))        testCode = excel.getContent(sheet, i, gl.CASE_CODE)        actualCode = request.apiTest(testMethod, testUrl, testData, testHeaders)        expectCode = str(int(testCode))        failResults = ' url: ' + testUrl + ' params: ' + testData + ' actualCode: ' +     actualCode + ' expectCode: ' + expectCode        if actualCode == expectCode:            logging.info("pass")        elif actualCode != expectCode:            logging.info("fail %s", failResults)            fail += 1    if fail > 0 :        return False    return True

四、关于参数中gl

准备工作:
所有的参数和常量我们会整理到这个文件中,因为设计业务和服务密码、数据库密码这里展示一部分。
代码如下:

#!/usr/bin/python# -*- coding: UTF-8 -*-# 脚本功能:全部变量import timeimport uuidCASE_NUMBER = 0  # 用例编号CASE_NAME = 1    # 用例名称CASE_DATA = 2    # 用例参数CASE_URL = 3     # 用例接口地址CASE_METHOD = 4  # 用例请求类型CASE_CODE = 5    # 用例codeCASE_HEADERS = 6 # 用例headersSQL_ROW = 0      # 预执行SQL的行号SQL_COL = 1      # 预执行SQL的列号

五、写一个run文件,只是用来执行的

代码如下:

#!/usr/bin/python# -*- coding: UTF-8 -*-# 验证包:接口测试脚本import sysimport core.tezLog as logimport function.common as commonlogging = log.getLogger()"""1.外部输入参数"""path = sys.path[0]  # 当前路径module = sys.argv[1]  # 服务模块名url = sys.argv[2]  # 服务地址host = sys.argv[3]      # 数据库地址user = sys.argv[4]      # 数据库用户名password = sys.argv[5]  # 数据库密码db = sys.argv[6]        # 数据库名称"""2.根据module获取Sheet"""logging.info("-------------- Execute TestCases ---------------")sheet = common.getExcelSheet(path + "/" + common.filename,     module)"""3.数据准备"""logging.info("-------------- Prepare data through MysqlDB --------------")sql = common.getPrepareSql(sheet)common.prepareData(host=host, user=user, password=password, db=db, sql=sql)"""4.执行测试用例"""res = common.runTest(sheet, url)logging.info("-------------- Get the result ------------ %s", res)#这里的res是我们平滑升级的时候需要返回结果为TRUE才会继续下面走。

六、查看测试报告(部署到jenkins会通过控制台查看)


报告.png
阅读全文
0 0