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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中找到\\n % (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中找到\\n % (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 \\n % (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 \\n % (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 \\n % (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 \\n % (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, "\\n"+"".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_test2\\apicase.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()

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

本人QQ:915069792

为什么选择?

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

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

 

以上是关于python+unittest+xlrd+request搭建API测试框架的主要内容,如果未能解决你的问题,请参考以下文章

Python3+requests+unittest+log+excel+HTMLTestRunner+email框架接口自动化案例⑶——测试数据读取

012 python接口 数据驱动ddt

selenium结合xlrd

python xlrd xlwt

python里面的xlrd模块详解

python里面的xlrd模块详解