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

(Python)Requests+Pytest+Allure接口自动化测试框架从0到1搭建

前言:本文主要介绍在企业使用Python搭建接口自动化测试框架,数据驱动读取excel表里的数据,和数据库方面的交互,包括关系型数据库Mysql和非关系型数据库MongDB,连接数据库,读取数据库中数据,最后输出完整的测试报告

前面,已经学习了如何用SpringBoot写接口以及与Mysql数据库进行交互,具体可查阅下面的这篇博客

(MVC架构)SprintBoot+html/css/js+mybatis的demo_MRJJ_9的博客-CSDN博客

本次搭建接口自动化框架的gitee仓库地址

interface_auto_test: Rquests+Pytest+Allure

目录

搭建流程图

搭建前的准备工作

request库发送请求

数据驱动

Python与数据库的交互

Python+Mysql

Python+MongDB

输出Allure报告

项目结构

总结


流程图

ea10e7f25a5d4dee93901bcc6f6141fa.png接口自动化测试搭建流程 

先写登录接口,接口数据与Mysql+Mongo进行交互,启动项目后,使用Python开始搭建整个测试框架

搭建前的准备工作

在搭建整套接口自动化测试流程前,要有开端提到的接口测试的范围,与数据库的交互,明白业务的逻辑,接口请求类型是什么,传参是什么,预期返回是什么

这里简单写了一个登录的接口,传入的邮箱手机号,密码必须符合一定的限制条件,否则不能登录成功

关于正则表达式,参考了下面的文章

什么是正则表达式,怎么写,使用场景等都在这里了 - 知乎 (zhihu.com)

正则表达式(常用的)_/^1[3456789]\d{9}$/_Oxygen_liu的博客-CSDN博客

JAVA 手机号码格式验证,使用正则表达式_java 正则手机号195_Steven Jon的博客-CSDN博客

JAVA 电子邮箱格式验证,使用正则表达式_java邮箱正则表达式_Steven Jon的博客-CSDN博客

JAVA正则表达式校验密码必须是包含大小写字母、数字、特殊符号的8位以上组合____NULL的博客-CSDN博客

package com.example.interfaceautotest.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class Login {@PostMapping(value = "/login", produces = "application/json")public String Login(String usr, String pw) {//加入业务判断规则,用户名只能输入手机号和注册的邮箱//usr可以输入手机号 也可以输入邮箱//大写字母、小写字母、数字、特殊符号(不是字母,数字,下划线,汉字的字符)的8位以上组合//手机号 第一位数字是1 第二位数字只能是3或4或5或6或7或8或9 剩下的九位数字可以是0-9之间任意一位数字//邮箱判断if ((usr.matches("^1[3-9]\\d{9}") || usr.matches("^(\\w+([-.][A-Za-z0-9]+)*){3,18}@\\w+([-.][A-Za-z0-9]+)*\\.\\w+([-.][A-Za-z0-9]+)*$"))&& pw.matches("^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,}$")) {return "登录成功";} else {return "登录失败";}}
}

request库发送请求

这部分可参考接口测试基础那篇博客,最常用到get、post两种请求,传递参数类型有params、json、data,请求参数也可参考下面的这篇博客

CSDN

请求参类型params,json,data 含义理解_params和data、json传参的区别_默金……的博客-CSDN博客

这里举post接口传params的例子,(以开发文档为主,依赖于接口的定义)

import requests
class Login:def login(self,usr,pw):data = {"usr":usr,"pw":pw}res = requests.post("http://localhost:8080/test/login",data=data) #也可以用paramsreturn res.text
if __name__ == '__main__':res = Login().login("18988888888","ABCabc012!@#")print(res)

数据驱动

读取excle里的数据,用到xlrd库读取数据,并将字符串格式的参数转成json格式,用于传递参数

import xlrd
import jsondef is_json(str_data):try:json.loads(str_data)except ValueError:return Falsereturn Trueclass Argument:def excel_control(self, tablePath, sheetName, caseName, *args):workBook = xlrd.open_workbook(tablePath)  # 打开表格workSheet = workBook.sheet_by_name(sheetName)  # 取第特定sheet页的表格# 取列标 不确定要取哪列的数据  表头字段 对应的列标index = []for i in args:index.append(workSheet.row_values(0).index(i))case_index = 0list_case = []for one in workSheet.col_values(0):  # 第一列数据遍历if caseName in one:  # 如果第一列中包含“login” 取出特定列getdata = []for num in index:  # 要取出的第多少列的数据res = workSheet.cell(case_index, num).value  # 取出第多少行第多少列的数据# 字典转为字符串if is_json(res):res = json.loads(res)getdata.append(res)list_case.append(getdata)case_index += 1return list_caseif __name__ == '__main__':res = Argument().excel_control("../data/test_data.xls", "登录", "login", "请求参数")

Python与数据库的交互

在做接口自动化时,对返回结果进行断言时,需要对数据准确性进行判断,就需要用到查询数据库的操作,下面介绍两种数据库,主要涉及Python如何连接和操作数据库

Python+Mysql

mysql数据库是一种关系型数据库,表内表间具有一定的依赖关系,比如用户登录账号、用户的基本信息等一般存储在mysql数据库中

连接myslq,处理数据,可以从mysql中插入、取出数据

import pymysql
class GetUserInfo(object):def query_mysql(self):#连接数据库 ip 用户名 密码 数据库名db = pymysql.connect(host='127.0.0.1',user='root',password='123456',database='auto_test_data',charset='utf8')print("数据库连接成功!")try:#获得执行mysql命令的方法cursor = db.cursor()#sql查询语句sql_query_usr = 'SELECT phone,email,pw FROM user WHERE usr = "test003"'cursor.execute(sql_query_usr)#执行Mysql语句user_info = cursor.fetchall()#接收全部的返回结果行print(user_info)print(type(user_info)) #查出的数据 存到一个元组里except Exception:print("查询失败")db.close() #关闭数据库
if __name__ == '__main__':usr_info = GetUserInfo().query_mysql()

Python+MongDB

MongDB数据库中可以包含多个文档,是一个集合的物理容器,相当于就是关系数据库中的表,以json格式存储数据

import pymongo
client = pymongo.MongoClient(host = 'localhost', port = 27017)
print(client.list_database_names())
#读取哪个数据库
db = client['my_test_data'] #也可以写成client.my_test_data
#读取哪个数据表
collection = db['test_data'] #也可以写成db.test_data
#查询集合下有多少个文档
print(collection.count_documents({}))
#筛选出'name'的值是'test002'的文档
print(collection.find_one({'name':'test002'}))

输出Allure报告

根据excel里的数据,传入参数,调用接口,最终会得到每一条case的结果,可以使用allure库, 展示出整个的完整接口自动化测试报告

73a389d9694648a88ec6e712e9872199.png

import pytest, os, allure
from data_driven_tools.excel_control import Argument
from libs.login import Login@allure.epic("Test") #史诗级 大的模块 对应allure报告的第一层
@allure.feature("登录模块") #功能点描述 XX模块 对应第二层
#类名必须以Test开头
class Test_login():# 在xls表里取出传入的参数@pytest.mark.parametrize("caseTitle,data,expdata",Argument().excel_control("../data/test_data.xls", "登录", "login", "用例名称", "请求参数","返回结果"))@allure.story("登录接口") #更为具体一层 具体场景 对应第三层@allure.title("{caseTitle}") #对应每一条测试用例的名称 (在excel里维护)#调用接口层 传入excel的参数#方法名必须以test_开头def test_login(self, caseTitle, data, expdata):data = Login().login(data["usr"], data["pw"])#进行断言assert data == expdataif __name__ == '__main__':#pytest框架程序运行入口pytest.main(['test_login.py', '-s', '--clean-alluredir','--alluredir','../report/tmp'])#打开报告os.system("allure serve ../report/tmp")

main()函数命令行里的参数使用介绍:

'test_login.py':执行的函数 如果为空,就运行当前项目下所有test_*.py或_test*.py这样的文件,

也可以进行指定运行的路径,例如:'../test_case/test_login.py',表示执行回到上层目录,进入test_case文件夹,执行test_login.py文件

执行py文件里指定的类,指定的方法,'../test_case/test_login.py::Test_login::test_login'

-k:可以使用and、or、not等逻辑运算符,区分匹配的范围,文件,类,函数名

-s:可以在控制台输出print信息(需要去掉-v参数)

-v:显示详细的用例执行信息,如下图所示:

1bab3765f3cc4162a5cf3e4bf923877a.png

-q:不输出用例执行的情况 

-x:出现一条失败的测试用例就退出测试

--alluredir:清除上次执行的旧报告

--alluredir  ../report/tmp:生成新报告,后面是新报告数据的生成路径

项目结构

整个项目结构是比较清晰的,分为接口层,数据驱动层,测试用例层

configs:可用来存放配置文件

data:excel:测试用例的数据

data_driven_tools:数据驱动工具,读取excel里的数据,传给接口

libs:使用request库调用接口

report:用于存放生成allure报告的原始数据,格式是json

test_case:存放测试用例,pytest框架执行程序的入口

dd3101cd91e44dc9978a406451cda259.png

requirements.txt文件,其他人配置环境需要添加的第三方库,可自动生成和下载

生成命令:pip freeze > requirements.txt

下载命令:pip install -r requirements.txt

1240814a955e47339c9c4aad05082114.png

总结

本篇博客总结了接口自动化项目的整个流程,用到了Pytest库、Allure库,xlrd读取excel里的测试用例,以及python操作数据库对数据准确性做验证,实现了接口自动化测试,对重要接口进行测试和数据验证,可用于冒烟测试,紧急发版前进行自动化测试,在企业落地后可以提升工作效率,节省手工测试的时间

相关文章:

(Python)Requests+Pytest+Allure接口自动化测试框架从0到1搭建

前言:本文主要介绍在企业使用Python搭建接口自动化测试框架,数据驱动读取excel表里的数据,和数据库方面的交互,包括关系型数据库Mysql和非关系型数据库MongDB,连接数据库,读取数据库中数据,最后…...

实现vuex数据持久化处理

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 前言: 方案一 localStorage 介绍 值 示例 JSON.stringify() 介绍 语法 参数 返…...

Vue-系统登录进入首页后禁用浏览器返回键

解决方法 mounted() {history.pushState(null, null, document.URL)window.addEventListener(popstate, this.goBack, false) }, destroyed() {// 清除popstate事件 否则会影响到其他页面window.removeEventListener(popstate, this.goBack, false) }, methods: {goBack() {hi…...

Hadoop理论及实践-HDFS的Namenode及Datanode(参考Hadoop官网)

HDFS有什么特点,被设计做什么 Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。有一下几个特点: HDFS是一个高度容错性的系统,具有高容错、高可靠性、高扩展性的特点,适合部…...

第四十九天

●兼容性测试:主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行。 •兼容测试测什么? Android碎片化严重,每一款游戏/应用在上线之前,都会做一轮覆盖一定机型量的兼容性测试。 在产品面对海量用户之前&#xff0…...

ArcGIS Pro简介下载安装地址

ArcGIS Pro简介 ArcGIS Pro是一款功能强大的地理信息系统(GIS)软件,由Esri开发。它为用户提供了一种直观、灵活且高效的方式来处理、分析和可视化地理数据。ArcGIS Pro具有现代化的用户界面和工作流程,使用户能够更好地利用地理信…...

MySQL 存储过程、函数、触发器、事件

​ 目录 存储过程 创建存储过程 调用存储过程 查看存储过程 删除存储过程 进阶 变量 if条件判断 传递参数 case结构 while循环 repeat结构 loop语句 leave语句 游标/光标 存储函数 触发器 创建触发器 删除触发器 查看触发器 事件 查看事件调度器是否开启…...

【LeetCode】121. 买卖股票的最佳时机 -

这里写自定义目录标题 2023-8-9 19:25:01 121. 买卖股票的最佳时机 2023-8-9 19:25:01 我也是一次性遍历。 自己感觉是用两个指针来做的。 第一天(x 1) 的时候就已经买入了,假定某y天 比第x天 便宜 或 相等,那么我就应当是第…...

解决Vue+Element-UI 进行From表单校验时出现了英文提示问题

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 问题描述 在使用form表单时,往往会对表单字段进行校验,字段为必填项时会添加required属性,此时自定义rules规则…...

cpolar内网穿透的安装

群晖6.X安装cpolar内网穿透 文章目录 群晖6.X安装cpolar内网穿透前言1. 下载cpolar的群晖套件1.1 打开群晖套件中心1.2 选择“手动安装”1.3 选择下载cpolar套件位置 2. 打开cpolar的Web-UI界面3. 注册会员 前言 随着硬件设备和软件技术的发展,以及数据量的发福暴涨…...

OPENCV C++(十)gramm矫正+直方图均衡化

两者都是只对单通道使用,对多通道的话 就需要分离通道处理再合并通道 两种方法,第一个要运算次数太多了,第二个只需要查表 伽马矫正函数,这里用第二种方法,且写法有点高级 int gammaCorrection(cv::Mat srcMat, cv::…...

并发——ThreadPoolExecutor 类简单介绍

文章目录 1 ThreadPoolExecutor 类分析2 推荐使用 ThreadPoolExecutor 构造函数创建线程池 线程池实现类 ThreadPoolExecutor 是 Executor 框架最核心的类。 1 ThreadPoolExecutor 类分析 ThreadPoolExecutor 类中提供的四个构造方法。我们来看最长的那个,其余三个…...

SharePoint 审核和监控工具

审核在顺利的 SharePoint 管理中起着重要作用,尤其是在满足法规遵从性和取证要求方面。为避免数据泄露,必须了解谁来自哪个组访问了哪个文档,以及谁创建或删除了网站或网站集。 审核 SharePoint 服务器 SharePoint采用率的提高导致企业在其…...

java+springboot+mysql法律咨询网

项目介绍: 使用javassmmysql开发的法律咨询网,系统包含超级管理员,系统管理员、用户角色,功能如下: 用户:主要是前台功能使用,包括注册、登录;查看法律领域;法律法规&a…...

无涯教程-Perl - getservbyport函数

描述 此功能转换协议PROTO的服务编号PORT,在标量context中返回服务名称,并在列表context中返回名称和相关信息- ($name,$aliases,$port_number,$protocol_name) 该调用基于/etc/services文件返回这些值。 语法 以下是此函数的简单语法- getservbyport PORT, PROTO返回值 …...

iOS开发-JsonModel的学习及使用

IOS JsonModel的学习及使用 当我们从服务端获取到json数据后的时候,我们需要在界面上展示或者保存起来,下面来看下直接通过NSDictionary取出数据的情况。 NSDictionary直接取出数据的诟病。 NSString *name [self.responseObj objectForKey:"nam…...

jquery 遍历所有元素

要遍历所有元素,您可以使用 jQuery 的 .each() 方法。以下是使用 .each() 方法来遍历所有元素的示例代码: $(selector).each(function() {// 在这里编写处理每个元素的代码// 使用 $(this) 来访问当前迭代的元素 });在上面的代码中,您需要将…...

Tik Tok跨境电商新风向,跨境卖家该如何布局?

TikTok作为优质的中国出海企业,近年来在电商业务上的布局也越来越广泛,除了之前的内容电商,TikTok Shop也上线了商城业务,补全了“人找货”的场景,为卖家增加了在直播、短视频之外的新流量来源。 TikTok美国小店现状 …...

OR36 链表的回文结构 题解

题目描述:链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结…...

“去没有天花板的地方” | 小红书用户情绪数据

最近,话题#人就要待在没有天花板的地方#社媒讨论度居高不下,小红书相关话题近90天互动量超百万。 生活的无常之外,越来越多人渴望与大自然更深层次的链接,以此寻找情绪的不同出口。或许,剖析这些情绪的生成机理&#x…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

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 -…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

docker 部署发现spring.profiles.active 问题

报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...