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

为什么选择?

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

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

时间: 2024-08-10 17:22:07

python+unittest+xlrd+request搭建API测试框架的相关文章

python webdriver 一步一步搭建数据驱动测试框架的过程和总结

一步一步搭建数据驱动测试框架的过程和总结数据驱动框架结构:Action:    封装的操作元素的函数,如login,添加联系人... conf:日志配置文件定位元素配置文件数据库配置文件    PageObject:    一个页面是一个类,类的方法可以获取页面上的相关元素 ProjectVar:工程路径工程相关的全局变量TestData:(文件或excel)测试用例测试数据 TestScript:运行测试框架的主程序:入口,主要读取测试数据的文件                      记录

使用jenkins + python + selenium一步步搭建web自动化测试“框架”(1) - 各部件简介

原先搭建过一个自动化测试框架,迷迷糊糊不求甚解,算是搭建了一个仅限于能用的.根本算不上框架的玩意儿. 现在回过头来好好看看究竟每一步是怎么联系起来的,是怎么运行起来的. 本次博客先说说各部件都是干什么的. 各部件简介: jenkins: 提到jenkins就不能不提持续集成.jenkins是一个持续集成方面很好很成熟的开源软件,jenkins本身又是一个java的开源项目,提供了很多功能丰富的插件. 那到底持续集成是个什么东西?整这么多专业名词一点都不接地气.说说我的白话理解: 先看看持续和集成

MFC程序使用GTest搭建测试框架

一.起源 最近对单元测试比较感兴趣,之后就上网搜了一些测试的框架,C++项目使用的测试框架基本上都使用的GoogleTest,之后就开启了gtest的学习之路. 主要是根据<玩转Google开源C++单元测试框架Google Test系列(gtest)>这个系列的博客来学习的. 因为平时的项目主要是MFC项目,就想着给MFC程序搭建一个测试框架出来,上网搜主要都是<gtest测试MFC项目>类似的. 跟着网上的教程走了很多遍,都没有成功,网上又没有更多的相关资料,就放弃在MFC项目

Java高级特性 第11节 JUnit 3.x和JUnit 4.x测试框架

一.软件测试 1.软件测试的概念及分类 软件测试是使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别.它是帮助识别开发完成(中间或最终的版本)的计算机软件(整体或部分)的正确度 .完全度和质量的软件过程. 软件测试过程: 2.软件测试的分类 按是否关心软件内部结构和具体实现角度来分: 黑盒测试(Black-box Testing) 黑盒测试也称功能测试,测试中把被测的软件当成一个黑盒子,不关心盒子的内部结构是什么,只关心软件的输入

Python接口测试实战3(下)- unittest测试框架

如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战2 - 使用Python发送请求 Python接口测试实战3(上)- Python操作数据库 Python接口测试实战3(下)- unittest测试框架 Python接口测试实战4(上) - 接口测试框架实战 Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例

Python 下的unittest测试框架

unittest测试框架,直接上图吧: data:数据:主要格式为CSV:读取方式:csv.reade: public:封装的模块:通用的模块单独封装,所需参数设置为变量: testcase:测试用例:使用unittest框架编写测试用例: report:测试报告:保存测试报告,调用封装好的runcases.py,其中加入时间和HTMLTestRunner生成的带时间的测试报告; run_tests.py:执行测试用例:调用封装好的runcases.py执行用例: mail:发送邮件:封装好发送

Python测试框架之unittest和pytest

目前搜狗商城接口测试框架用的是unittest+HTMLTestRunner,case数有1097条,目前运行一次自动化测试,时长约为30分钟,期望控制在10分钟或者更短的时间内.近期打算重新优化框架,着重解决运行效率低的问题.最近调研了一下另一种主流测试框架Pytest,Pytest是一个非常成熟的全功能的Python测试框架,本文主要对比了Unittest和Pytest这两种较为流行的Python测试框架. 一.Unittest Unittest是Python标准库中自带的单元测试框架,Un

python利用unittest测试框架组织测试用例的5种方法

利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所有测试用例的基本类,给一个测试方法的名字,就会返回一个测试用例实例: TestSuite:组织测试用例的实例,支持测试用例的添加和删除,最终将传递给  testRunner进行测试执行: TextTestRunner:进行测试用例执行的实例,其中Text的意思是以文本形式显示测试结果.测试的结果会保

[python测试框架] http接口测试框架

https://testerhome.com/topics/5631 Http 接口测试框架 (思路 + 实现中 + 开源 + 可能难产) Http 接口测试框架疑问解答 Fiddler 保存会话 (请求) 说明 由于部分内容涉及公司机密,已用字母替换,不影响阅读 实际效果 验证1000个接口平均耗时6s(看机器配置及网速) 第一次投入使用,马上发现5个接口异常并且该验证过程不到30s的时间 框架的下一步 目前已兼容我们公司所有app response body全字段验证(含字段类型) 已有思路