实现功能
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()
期间感谢@大师兄@三师兄@饭哥@无敌哥的指导
为什么选择?
有的人喜欢创造世界,他们做了程序员
有的人喜欢拯救世界,他们做了测试员