当前位置: 首页 > news >正文

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,模块下载后直接集成到该项目

模块下载地址:HTMLTestRunner - tungwaiyip's software

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

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

以上,整体框架如下图

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

Python接口自动化测试零基础入门到精通(2023最新版)

 

相关文章:

python+unittest+requests+HTMLRunner编写接口自动化测试集

问题描述: 搭建接口测试框架,执行用例请求多个不同请求方式的接口 实现步骤: ① 创建配置文件config.ini,写入部分公用参数,如接口的基本url、测试报告文件路径、测试数据文件路径等配置项 1 [DATABASE] 2 data_addre…...

Vue---监听div元素宽高改变时echart图表重新resize

一、需求描述 当点击上图的红色框时,echart的div元素宽会改变但是无法触发echarts图表的resize重新渲染,对于浏览器而言,浏览器具有window.resize方法监听浏览器窗口大小的改变,而div元素没有监听宽高改变的方法。 二、解决方案 …...

Kubernetes Etcd不可用日志:NOSPACE 的问题修复

两套k8s集群同一天同时出现etcd集群空间超过配额,kubectl get cs时发现所有的etcd均返回503报错,查看etcd的告警发现有NO SPACE的信息且 etcdctl --endpoints${ETCD_ENDPOINT} --cert${ETCD_CERTFILE} --key${ETCD_KEYFILE} --cacert${ETCD_CAFILE} endp…...

分组卷积的思想神了

大家好啊,我是董董灿。 最近,分组卷积帮我解决了一个大忙,事情是这样的。 这几天遇到一个头疼的问题,就是要在某一芯片上完成一个神经网络的适配,这个神经网络中卷积居多,并且有一些卷积的通道数很大&…...

北邮22级信通院数电:Verilog-FPGA(7)第七周实验(2):BCD七段显示译码器(关注我的uu们加群咯~)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 关注作者的uu们可以进群啦~ 一.verilog代码 1.1 …...

LVS集群-DR模式

概念: LVS-DR模式,也是最常用的lVS负载方式,DR DIRECT ROUTING 直接路由模式 负载均衡器lVS调度器,只负责请求和转发到后端的真实服务器,但是影响结果,由后端服务器直接转发给客户端,不需要经…...

行为型模式-状态模式

在状态模式中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 意图:允许对象在内部状态发生改变时改变它的行为&#xff0…...

html/css/javascript/js实现的简易打飞机游戏

源码下载地址 支持:远程部署/安装/调试、讲解、二次开发/修改/定制 视频浏览地址...

ubuntu 22.04安装百度网盘

百度网盘 客户端下载 (baidu.com) 下载地址 sudo dpkg -i baidunetdisk_4.17.7_amd64.deb...

关于路由转发

路由表的作用 路由表的作用:目标网络匹配路由表,从相应网络转发;不匹配路由表,丢弃或转发至默认路由器。 路由转发的原理 根据IP地址找到目标网络,由应路由器解封装查看目标网络是否可达,重新封装进行转…...

oradebug current_sql

CDB 或者PDB都可以,但是数据库sid不对找不到SQL TEXT ps -ef|grep 3485015 oracle 3485015 1 51 21:19 ? 00:01:10 oracle (LOCALNO) oracle 3489325 3488836 0 21:21 pts/0 00:00:00 grep --colorauto 3485015 . oraenv [oracle~]$ s SQL*…...

JSON(详解)

目录 什么是JSON? 哪里会用到JSON? JSON的特点 JSON的优点 JSON的缺点 JSON和cJSON的关系 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它以易于阅读和编写的文本格式来存储和表示…...

1-多媒体通信概述

文章目录 媒体和多媒体媒体多媒体VarityIntergrationInteraction 多媒体通信(MMC)业务类型 MMC主要问题和关键技术主要问题关键技术 MMC发展动向重要事件趋势 标准化组织 媒体和多媒体 媒体 承载信息的载体. 感知媒体, 表示媒体, 显示媒体, 存储媒体, 传输媒体. 多媒体 Var…...

k8s集群环境搭建

k8s环境集群搭建 1.简述2.k8s概述3.软硬件配置3.1 硬件配置3.2 软件配置4 环境配置4.1使用root权限4.2 节点ip配置4.3 设置系统主机名4.4 解析主机名4.5 关闭swap4.6 设置时间同步5 安装集群所需软件5.1 安装 docker5.2 安装cri-dockerd5.3 安装 Kubernetes6 K8s集群实例部署6.…...

Makefile 基础教程:从零开始学习

在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动构建程序,管理程序依赖关系,提高开发效率。本篇博客将从基础开始,介绍Makefile的相关知识,帮助大家快速掌握Makefile的使用方法 Makefil…...

绝对路径与相对路径

目录 一、绝对路径 二、相对路径 三、举例 一、绝对路径 绝对路径是指从根目录开始的完整路径,包括所有父目录的路径,直到目标文件或者目录 所在的位置。 全文件名全路径文件名绝对路经完整的路径 例如:在windows系统中,绝对路径通常以…...

电大搜题:开启智慧学习新时代

近年来,随着社会的发展和科技的迅猛进步,远程教育成为了广大学子继续教育的新选择。而在重庆,一所备受关注的远程教育学府——重庆开放大学,以其开放的教育理念和多元的学习方式,为广大学生提供了便捷而高效的学习平台…...

Android Studio 导出 jar

AS版本:Android Studio Giraffe | 2022.3.1 Patch 1 1、File——New Module——Android Library 2、mylibrary——main——新建功能类 3、mylibrary——build.gradle——android {}内复制以下代码——Sync Now //Copy类型 tasks.register(makeJar, Copy) { //删…...

【Leetcode】【每日一题】【中等】1465. 切割后面积最大的蛋糕

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/maximum-area-of-a-piece-of-cak…...

Ocelot简易教程目录

Ocelot简易教程目录 这里写目录标题 Ocelot简易教程目录 Ocelot简易教程(一)之Ocelot是什么Ocelot简易教程(二)之快速开始1Ocelot简易教程(二)之快速开始2Ocelot简易教程(三)之主要特…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

生成 Git SSH 证书

🔑 1. ​​生成 SSH 密钥对​​ 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​: -t rsa&#x…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

前端调试HTTP状态码

1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...

Cursor AI 账号纯净度维护与高效注册指南

Cursor AI 账号纯净度维护与高效注册指南:解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后,许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...

使用VMware克隆功能快速搭建集群

自己搭建的虚拟机,后续不管是学习java还是大数据,都需要集群,java需要分布式的微服务,大数据Hadoop的计算集群,如果从头开始搭建虚拟机会比较费时费力,这里分享一下如何使用克隆功能快速搭建一个集群 先把…...