python+unittest+requests+HTMLRunner搭建接口测试框架,执行用例请求多个不同请求方式的接口

问题描述:
搭建接口测试框架,执行用例请求多个不同请求方式的接口

实现步骤:

① 创建配置文件config.ini,写入部分公用参数,如接口的基本url、测试报告文件路径、测试数据文件路径等配置项

1 [DATABASE]
2 data_address = ./data/data.xlsx
3 report_address = ./report/
4 driver = ./drivers/chromedriver.exe
5 
6 [HTTP]
7 base_url = https://***.***.cn//

② 从配置文件中读取并返回文件中内容,或写入配置文件的方法,文件命名 readConfig.py

 1 import os2 import configparser3 4 # 获取当前py文件地址5 proDir = os.path.split(os.path.realpath(__file__))[0]6 # 组合config文件地址7 configPath = os.path.join(proDir,"config.ini")8 9 class ReadConfig:
10     def __init__(self):
11         # 获取当前路径下的配置文件
12         self.cf = configparser.ConfigParser()
13         self.cf.read(configPath)
14 
15     def get_config(self,field,key):
16         # 获取配置文件中的key值
17         result = self.cf.get(field,key)
18         return result
19 
20     def set_config(self,field,key,value):
21         # 向配置文件中写入配置信息
22         fb = open(configPath,'w')
23         self.cf.set(field,key,value)
24         self.cf.write(fb)

③ 从配置文件中获取到接口的基本url后,根据不同的接口请求方式读取请求体或其他参数信息,参数信息从excel中读取,因此文件readExcel.py用于读取并返回excel文件中内容,或写入Excel的方法

 1 import xlrd2 import xlutils.copy3 from Base.readConfig import ReadConfig4 import time5 6 class ReadExcel:7 8     def __init__(self,section,field,sheet):9         # 打开工作表,并定位到sheet
10         data_address = ReadConfig().get_config(section,field)
11         workbook = xlrd.open_workbook(data_address)
12         self.table = workbook.sheets()[sheet]
13 
14 
15     def get_rows(self):
16         # 获取excel行数
17         rows = self.table.nrows
18         return rows
19 
20     def get_cell(self,row,col):
21         # 获取单元格数据
22         cell_data = self.table.cell(row,col).value
23         return cell_data
24 
25     def get_col(self,col):
26         # 获取整列数据
27         col_data = self.table.col_value(col)
28         return col_data
29 
30 class WriteExcel:
31     def __init__(self,section,field,sheet):
32         # 打开工作表
33         self.address = ReadConfig().get_config(section,field)
34         self.workbook = xlrd.open_workbook(self.address)
35         self.wf = xlutils.copy.copy(self.workbook)
36         self.ws = self.wf.get_sheet(sheet)
37 
38     def set_cell(self,row,col,value):
39         #设置单元格数据
40         self.ws.write(row,col,value)
41 
42     def save_excel(self,filename,format):
43         #获取当前时间
44         self.time = time.strftime("%Y%m%d%H%M%S", time.localtime())
45         #生成文件的文件名及格式
46         self.report = filename + '_' +self.time + format
47         #保存文件
48         self.wf.save(self.report)

④ 将获取接口的url、请求头、参数等方法封装成类并写入base.py中,用于测试框架中测试集的直接调取

1 from Base.readConfig import ReadConfig2 from Base.readExcel import ReadExcel3 4 # 实例化5 readexcel = ReadExcel('DATABASE','data_address',0)6 7 class BasePage(object):8     def __init__(self, selenium_driver):9         self.driver = selenium_driver
10 
11     def get_api(self, row, col):
12         # 获取url
13         self.base_url = ReadConfig().get_config('HTTP', 'base_url')
14 
15         # 获取excel中的接口地址,与url进行拼接
16         self.url = self.base_url + readexcel.get_cell(row, col)
17         print(self.url)
18         return self.url
19 
20     def get_cell(self, row, col):
21         # 获取excel单元格数据,获取接口请求的参数
22         self.cell = readexcel.get_cell(row, col)
23         return self.cell

⑤ 从base.py文件获取到请求地址后,需要组合不同类型的请求方式,如get请求直接将参数与地址进行拼接,或post请求以json数据格式等为请求体请求接口,然后再获取接口对象,得到接口返回的数据,此过程涉及的方法封装到request_way.py(注:该实例get请求返回数据格式为jsonp,因此需要jsonp格式数据转换为json格式的方法)

 1 from Base.readExcel import ReadExcel2 from base import BasePage3 import requests4 import urllib.parse5 import json6 import re7 8 # 实例化9 readexcel = ReadExcel('DATABASE','data_address',0)
10 
11 # jsonp格式数据转换为json格式
12 def jsonp_to_json(_jsonp):
13      # 解析jsonp数据格式为json
14     try:
15         return json.loads(re.match(".*?({.*}).*", _jsonp, re.S).group(1))
16     except:
17         raise ValueError('Invalid Input')
18 
19 class RequestPage(BasePage):
20     # post方式请求,json格式为请求体
21     def post_requests(self, url, i):
22         # 定义请求数据,获取excel中参数信息赋值给data,以json格式拼接好数据
23         data_1_json = json.dumps(BasePage(self.driver).get_cell(i, 4))
24         data_2_json = json.dumps(BasePage(self.driver).get_cell(i + 1, 4))
25         data = "{" + data_1_json + ":" + data_2_json + "}"
26         print(data)
27         # 打开请求,获取对象
28         response = requests.post(url, data)
29         # 打印状态码
30         print(response)
31         return response
32 
33     # get方式请求
34     def get_request(self, url, j):
35         # 定义请求数据,获取excel中参数信息赋值给values
36         #values = {}
37         values = BasePage(self.driver).get_cell(j, 4)
38         # 如果参数不止一个则对请求数据进行编码拼接'&'
39         #data = urllib.parse.urlencode(values)
40         # 将数据与url进行拼接
41         req = url + '?' + values
42         print(req)
43         # 打开请求,获取对象
44         response = urllib.request.urlopen(req)
45         # 打印Http状态码
46         print(response.status)
47         # 读取服务器返回的数据,对HTTPResponse类型数据进行读取操作,bytes格式数据编译成中文编码
48         the_page = response.read().decode("unicode_escape")
49         # 将返回的bytes格式数据先转换成str,再将返回的jsonp格式数据转换成json格式
50         the_page = jsonp_to_json(str(the_page))
51         return the_page

⑥ 得到接口实际返回结果后,需要与预期结果做比对,判断用例执行结果,所以封装校验类到check.py文件。校验方式其一是校验json数组内每个数值是否一致,其二是直接简单校验数组中的status值和message是否返回正确

 1 from base import BasePage2 from Base.readExcel import WriteExcel3 4 # 实例化5 writeexcel = WriteExcel('DATABASE','data_address',0)6 7 class CheckPage(BasePage):8     # 校验json数组内每个值是否一致9     def check_value(self, i, actualresult, expectresult):
10         # 遍历字典的值value,并将value赋值给实际接口数据的值
11         for value in actualresult.values():
12             actualresult_value = value
13         # 遍历字典的值value,并将value赋值给excel中预期数据的值
14         for value in expectresult.values():
15             expectresult_value = value
16         # 如果实际接口返回的每个键值与excel中预期返回的数据的每个键值一样,则接口测试用例执行通过,如果不是则打印预期结果和实际结果,可比较差异
17         if actualresult_value == expectresult_value:
18             writeexcel.set_cell(i, 8, 'SUCCESS')
19             print("接口用例执行结果通过")
20         else:
21             writeexcel.set_cell(i, 8, 'FAILURE')
22             writeexcel.set_cell(i, 7, str(actualresult))
23             print('第', i + 1, '行用例执行失败:预期结果是', expectresult, '实际结果是', actualresult)
24 
25         # 保存测试报告
26         writeexcel.save_excel('testreport', '.xls')
27 
28 
29     # 校验json数组中的status值和message是否返回成功
30     def easy_check_value(self, i, actualresult,expectresult):
31         # 判断实际接口值是否状态码和消息返回成功
32         if actualresult['status'] == 1 and actualresult['message'] == '完成':
33             writeexcel.set_cell(i, 8, 'SUCCESS')
34             print('第', i+1, '行用例执行结果正确,用例通过')
35         else:
36             writeexcel.set_cell(i, 8, 'FAILURE')
37             writeexcel.set_cell(i, 7, str(actualresult))
38             print('第', i + 1, '行用例执行失败:预期结果是', expectresult, '实际结果是', actualresult)
39 
40         # 保存测试报告
41         writeexcel.save_excel('testreport', '.xls')

⑦ 最后编写测试集 testcase.py,其中用例包含有执行post和get方式的请求,增加用例可直接在该文件继续添加编写

 1 import unittest2 from selenium import webdriver3 from Base.readConfig import ReadConfig4 from base import BasePage5 from requests_way import RequestPage6 from check import CheckPage7 from packages.HTMLTestRunner import HTMLTestRunner8 9 driver = webdriver.Chrome(ReadConfig().get_config('DATABASE', 'driver'))
10 
11 class SmokeTest(unittest.TestCase):
12     #初始化
13     def setUp(self):
14         self.driver = driver
15 
16     def test_case_10(self):
17         """以json格式数据为请求体的post方式接口请求"""
18         # 获取url
19         self.url = BasePage(self.driver).get_api(1,1)
20 
21         # 将接口实际返回数据转换为json可序列化,使用json.dumps()时需要对象相应的类型是json可序列化的
22         i = 3
23         actualresult = RequestPage(self.driver).post_requests(self.url, i).json()
24 
25         # 获取excel中的预期结果
26         expectresult = eval(BasePage(self.driver).get_cell(i, 6))
27 
28         # 校验实际接口返回结果和用例预期结果是否一致(校验json数组内每个值是否一致)
29         CheckPage(self.driver).check_value(i, actualresult, expectresult)
30 
31     def test_case_11(self):
32         """get方式接口请求"""
33         # 获取url
34         self.url = BasePage(self.driver).get_api(8, 1)
35 
36         # 获取接口实际返回值与excel中的预期结果
37         j = 8
38         actualresult = RequestPage(self.driver).get_request(self.url, j)
39         expectresult = eval(BasePage(self.driver).get_cell(j, 6))
40 
41         # 校验实际接口返回结果和用例预期结果是否一致(校验json数组中的status值和message是否返回成功)
42         CheckPage(self.driver).easy_check_value(j, actualresult, expectresult)
43 
44     # 释放资源
45     def test_case_12(self):
46          self.driver.quit()
47 
48 
49 if __name__ == '__main__':
50     #构造测试集合
51     suite = unittest.TestSuite()
52     suite.addTest(SmokeTest('test_case_10'))
53     suite.addTest(SmokeTest('test_case_11'))
54     suite.addTest(SmokeTest('test_case_12'))
55 
56     #创建html文件
57     filename = ReadConfig().get_config('DATABASE', 'report_address') + 'testreport.html'
58     fp = open(filename, 'wb')
59 
60     #执行测试并生成html测试报告
61     runner = HTMLTestRunner(stream=fp, description='接口用例执行情况:', title='接口自动化测试报告')
62     runner.run(suite)
63 
64     #关闭文件
65     fp.close()

⑧ 其中涉及HTMLTestRunner.py原生HTML测试报告库,是用于生成测试报告testreport.html,模块下载后直接集成到该项目

模块下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

⑨ 以python文件模式执行脚本才能生成测试报告

参考:https://www.cnblogs.com/kristin/p/10332815.html

以上,整体框架如下图

执行方式正确得到以下两种类型测试报告,excel表和html测试报告

 正在学习测试的小伙伴可以通过点击下面的小卡片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/19501.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蚂蚁集团开源可信隐私计算框架「隐语」:开放、通用

7 月 4 日,蚂蚁集团宣布面向全球开发者正式开源可信隐私计算框架 “隐语”。 隐语是蚂蚁集团历时 6 年自主研发,以安全、开放为核心设计理念打造的可信隐私计算技术框架,涵盖了当前几乎所有主流隐私计算技术。 据介绍,隐语内置 MPC、TEE、同态等多种密态计算虚拟设备,提…

爱尔四川眼科医院—四川大学华西联盟医院隆重揭牌

为积极响应国家“健康中国”“创新发展”战略,全面深化“产教融合”、“校企合作”、“医工融合”,推动“名校名企” 双赢合作,提升中国眼科领域人才核心竞争力,继2021年9月23日四川大学与爱尔眼科战略合作签约后,2023…

【数据结构】排序:插入排序与希尔排序详解

本章开始就要分享一些常用的排序方法,我们的日常生活中很多地方都要使用排序,比如电商平台可以按照你的需求进行排序,或者是你想了解大学的综合排名时 我们之前也学到过一些简单的排序比如冒泡排序,虽然他在时间复杂度上可以说是依…

苹果APP安装包ipa如何安装在手机上

苹果APP的安装比安卓复杂且困难,很多人不知道如何将ipa文件安装到手机上。以下是几种苹果APP安装在iOS设备的方式,供大家参考。 一、上架App Store 这是最正规的方式。虽然审核过程复杂、时间较长,且审核条件较为苛刻,但借助第三…

虚拟IP绑定公网IP访问

绑定公网 IP 我们目前的虚拟 IP,还不能通过公网的形式进行访问,我们首先,来使用内部的 IP 进行访问看看效果如下: curl 虚拟IP 如上图我访问了两次,第一次访问返回的是 2222 的 nginx,第二次访问是 1111 的…

Linux——sigaction信号捕捉函数

目录 一.sigaction () ; struct sigaction结构体的成员: sigaction()和signal()函数的区别: 二.sigaction函数的使用 sigaction函数使用案例1: 对该进程发送指定的信号 案例2:对该进程发送多个同类型的信号时: …

github 最简单的使用步骤(个人学习记录~)

github 使用步骤: (11条消息) github新手用法详解(建议收藏!!!)_github详解_怪 咖的博客-CSDN博客 1.获取ssh密钥 打开输入:ssh-keygen -t rsa -C “git账号” 输入之后一路Enter&#xff08…

MySQL自治平台建设的内核原理及实践(下)

本文整理自美团技术沙龙第75期的主题分享《美团数据库攻防演练建设实践》,系超大规模数据库集群保稳系列(内含4个议题的PPT及视频)的第4篇文章。 本文作者在演讲后根据同学们的反馈,补充了很多技术细节,跟演讲&#xf…

使用Vue脚手架2

ref属性 src/components/SchoolName.vue <template><div class"school"><h2>学校名称&#xff1a;{{name}}</h2><h2>学校地址&#xff1a;{{address}}</h2></div> </template><script>export default {name:…

分层解耦-三层架构

三层架构 在上篇文章的案例中写文章-CSDN创作中心 的Controller类承担了对于数据操作&#xff08;访问&#xff09;、对于对于数据的逻辑处理、以及接受请求响应数据的工作&#xff0c;对于类似的小项目来说冗杂程度还可以接收&#xff0c;但是如果项目更加复杂&#xff0c;就…

python3+requests+unittest实战系列【二】

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;已经介绍了基于unittest框架的实现接口自动化&#xff0c;但是也存在一些问题&#xff0c;比如最明显的测试数据和业务没有区分开&#xff0c;接口用例不便于管理等&…

快手详情API接口jason格式java php

随着移动互联网的快速发展&#xff0c;短视频应用成为越来越多用户获取信息和进行购物的重要途径。作为广告商或电商平台&#xff0c;了解和充分利用快手的商品详情API接口将为您的营销策略带来巨大的潜力 了解快手商品详情API接口 快手的商品详情API接口是一组提供商品相关信息…