• python+unittest+xlrd+request搭建API测试框架


    实现功能

    1.可在表格中进行编写用例

    2.自动执行表格中测试用例

    3.对响应结果进行深度断言,可定位预期结果与测试结果的不同值与位置

    4.形成HTML格式的测试报告

    源码可在githube中下载 https://github.com/wcnszbd/Mytest

    先附上效果图:

     
    再上代码:
    结构图
     
     
     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 # @Time    : 2017-07-28 18:07
     4 import xlrd
     5 import requests
     6 class APiTool:
     7 
     8     # 调取表格中用例方法
     9     def xlsee(self, xlsFile):
    10         sheetlist = []  # 用来保存表格所有数据
    11         rqapi = xlrd.open_workbook(xlsFile)   # 获得文件对象
    12         sheet_name = rqapi.sheet_names()[0]  # 获取第一个sheet名称
    13         sheet = rqapi.sheet_by_name(sheet_name)  # 获取第一个sheet对象
    14         nrow = sheet.nrows   # 获取行总数
    15         for i in range(1,nrow):
    16             sheetlist.append(sheet.row_values(i))
    17         return sheetlist
    18 
    19     # 请求方法
    20     def request(self, rqtype, rqurl, paramete, headers):
    21         if rqtype == "get":
    22             apiresult = requests.get(url=rqurl, params=paramete, headers=headers)  # 发送请求
    23             return apiresult
    24         if rqtype == "post":
    25             apiresult = requests.post(url=rqurl, data=paramete, headers=headers)
    26             return apiresult
    27         else:
    28             print("请求参数错误,请求类型只支持get+post,请求地址支持string,参数支持dict")
    29 
    30 
    31     # 对返回的json值进行深度断言
    32 
    33     def compare_json_data(self,A, B, L = [], xpath = '.'):
    34         if isinstance(A, list) and isinstance(B, list):
    35             for i in range(len(A)):
    36                 try:
    37                     self.compare_json_data(A[i], B[i], L, xpath + '[%s]' % str(i))
    38                 except:
    39                     L.append('▇▇▇ A中的key %s[%s]未在B中找到
    ' % (xpath, i))
    40         if isinstance(A, dict) and isinstance(B, dict):
    41             for i in A:
    42                 try:
    43                     B[i]
    44                 except:
    45                     L.append('▇▇▇ A中的key %s/%s 未在B中找到
    ' % (xpath, i))
    46                     continue
    47                 if not (isinstance(A.get(i), (list, dict)) or isinstance(B.get(i), (list, dict))):
    48                     if type(A.get(i)) != type(B.get(i)):
    49                         L.append('▇▇▇ 类型不同参数在[A]中的绝对路径:  %s/%s  ►►► A is %s, B is %s 
    ' % (xpath, i, type(A.get(i)), type(B.get(i))))
    50                     elif A.get(i) != B.get(i):
    51                         L.append('▇▇▇ 仅内容不同参数在[A]中的绝对路径:  %s/%s  ►►► A is %s, B is %s 
    ' % (xpath, i, A.get(i), B.get(i)))
    52                     continue
    53                 self.compare_json_data(A.get(i), B.get(i), L, xpath + '/' + str(i))
    54             return
    55         if type(A) != type(B):
    56             L.append('▇▇▇ 类型不同参数在[A]中的绝对路径:  %s  ►►► A is %s, B is %s 
    ' % (xpath, type(A), type(B)))
    57         elif A != B and type(A) is not list:
    58             L.append('▇▇▇ 仅内容不同参数在[A]中的绝对路径:  %s  ►►► A is %s, B is %s 
    ' % (xpath, A, B))
    59         return L
    60 
    61     def Assert(self,A,B):
    62         C = []
    63         self.compare_json_data(A, B, C)
    64         assert len(C) == 0, "
    "+"".join(C)
     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 # @Time    : 2017-07-28 18:07
     4 import unittest
     5 import HTMLTestRunner
     6 import time
     7 import tool
     8 import json
     9 
    10 class Test(unittest.TestCase):
    11     heixiongjing = 666
    12     # 获取测试数据
    13 
    14 # 闭包函数用于生成用例
    15 
    16 def demo(i):
    17     def case(self):
    18         CaseUrl = i[2]+i[3]
    19         RequestType = i[4]
    20         Paramete = i[5]
    21         Result = json.loads(i[6])
    22         apiresult = apitest.request(RequestType, CaseUrl, Paramete, '')
    23         code = apiresult.status_code
    24         assert code == 200, '▇▇▇请求失败!'+'  '+'code:'+str(code)+'  '+'url='+CaseUrl
    25         pam = json.loads(apiresult.text)
    26         apitest.Assert(pam, Result)
    27 
    28     setattr(case, '__doc__', str(i[1]))
    29     return case
    30 
    31 # 根据用例条数循环生成用例
    32 def testall(num):
    33     for i in num:
    34         setattr(Test, 'test_'+str(int(i[0])), demo(i))
    35 
    36 
    37 if __name__ == "__main__":
    38     apitest = tool.APiTool()
    39     xlsFile = r"D:myapi_test2apicase.xls"  # 文件路径
    40     sheetlist1 = apitest.xlsee(xlsFile)
    41     testall(sheetlist1)
    42     suit = unittest.makeSuite(Test)
    43     now = time.strftime("%Y-%m-%d %H_%M_%S", time.localtime(time.time()))
    44     filename = "D:\myapi_test2\report\"+now+'result.html' #定义个报告存放路径,支持相对路径。
    45     fp = open(filename, 'wb')
    46     runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='自动化测试报告', description='XX平台V1.0')
    47     runner.run(suit)
    48     # unittest.main()

    期间感谢@大师兄@三师兄@饭哥@无敌哥的指导

     

    为什么选择?

    有的人喜欢创造世界,他们做了程序员

    有的人喜欢拯救世界,他们做了测试员

  • 相关阅读:
    八数码难题 (codevs 1225)题解
    小木棍 (codevs 3498)题解
    sliding windows (poj 2823) 题解
    集合删数 (vijos 1545) 题解
    合并果子 (codevs 1063) 题解
    等价表达式 (codevs 1107)题解
    生理周期 (poj 1006) 题解
    区间 (vijos 1439) 题解
    区间覆盖问题 题解
    种树 (codevs 1653) 题解
  • 原文地址:https://www.cnblogs.com/hxjxb/p/7255432.html
Copyright © 2020-2023  润新知