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

news/2023/11/28 12:29:07

前言:本文主要介绍在企业使用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操作数据库对数据准确性做验证,实现了接口自动化测试,对重要接口进行测试和数据验证,可用于冒烟测试,紧急发版前进行自动化测试,在企业落地后可以提升工作效率,节省手工测试的时间


http://www.ppmy.cn/news/1019656.html

相关文章

博客项目(Spring Boot)

1.需求分析 注册功能(添加用户操纵)登录功能(查询操作)我的文章列表页(查询我的文章|文章修改|文章详情|文章删除)博客编辑页(添加文章操作)所有人博客列表(带分页功能)…

C语言笔试训练【第七天】

文章目录 🪒1、以下对C语言函数的有关描述中,正确的有【多选】( )🧯2、在C语言中,以下正确的说法是( )🪪3、在上下文及头文件均正常的情况下,下列代码的输出是…

实战:使用Docker部署Hadoop集群

文章目录 Hadoop简介Hadoop优势Hadoop应用场景docker与docker-compose安装Hadoop集群搭建环境变量docker-compose环境文件树结构编排并运行容器运行wordcount例子 写在最后 Hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节…

Python-OpenCV中的图像处理-图像梯度

Python-OpenCV中的图像处理-图像梯度 图像梯度Sobel 算子和 Scharr 算子Laplacian 算子 图像梯度 图像梯度,图像边界等使用到的函数有: cv2.Sobel(), cv2.Scharr(), cv2.Laplacian() 等原理:梯度简单来说就是求导。Op…

Python(七十五--总结)列表、字典、元组、集合总结

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

【ARM64 ATF 系列 4 - ATF 与 kernel 中从处理器启动】

文章目录 1.1 kernel 中启动从处理器1.2 ATF 从处理器启动1.2.1 EL31 处理总体流程(bl31)1.2.2 DECLARE_RT_SVC 服务注册1.2.3 运行时服务初始化处理1.2.4 smc指令触发进入el3异常向量表1.2.5 ATF 开核工作1.2.6 psci_cpu_on 小结 1.3 从处理器进入内核后的动作1.3.1 psci_dt_i…

[系统安全] 五十二.DataCon竞赛 (1)2020年Coremail钓鱼邮件识别及分类详解

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

Qt应用开发(基础篇)——时间微调输入框 QDateTimeEdit、QDateEdit、QTimeEdit

一、前言 QAbstractSpinBox是全部微调输入框的父类,这是一种允许用户通过点击上下箭头按钮或输入数字来调整数值的图形用户界面控件,父类提供了当前值text、对齐方式align、只读readOnly等通用属性和方法。在上一篇数值微调输入框中有详细介绍。 QDateTi…

使用mybatis-plus的updateById方法更新一个numeric(1)类型字段,sql成功执行,但是updates为0,更新失败的解决办法

使用mybatis-plus的updateById方法更新一个numeric(1)类型字段,sql成功执行,但是updates为0,更新失败的解决办法: 背景:我有一张表,有个启用禁用功能,没有放在编辑页面一起编辑保存,…

4个方面介绍云渲染技术的发展趋势和前景!

云渲染技术是一种新兴的渲染技术,它利用云计算的优势,将渲染任务分配到云端服务器上进行处理,从而大大提高了渲染效率和质量。云渲染技术在影视动画、建筑设计、游戏开发等领域有广泛的应用,为数字内容创作提供了便捷和高效的解决…

Python Opencv实践 - 图像属性相关

import numpy as np import cv2 as cv import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) plt.imshow(img[:,:,::-1])#像素操作 pixel img[320,370] print(pixel)#只获取蓝色通道的值 pixel_blue img[320,370,0]…

Kotlin语法

整理关键语法列表如下: https://developer.android.com/kotlin/interop?hlzh-cn官方指导链接 语法形式 说明 println("count ${countnum}")字符串里取值运算 val count 2 var sum 0 类型自动推导 val 定义只读变量,优先 var定义可变变量…

儿童滑梯CE认证标准EN71测试标准

我国是玩具出口大国,目前的主要出口目标市场是欧洲市场,其中出口欧洲市场的玩具平均约占据我国玩具年出口额的40%左右。 EN 71是欧盟国家强制执行的标准,针对为14岁以下的儿童设计的玩具。其意义是通过EN71标准对进入欧洲市场的玩具产品进行…

dotNet 之数据库sqlite

Sqlite3是个特别好的本地数据库,体积小,无需安装,是写小控制台程序最佳数据库。NET Core是同样也是.NET 未来的方向。 **硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 D…

[分享]STM32G070 串口 乱码 解决方法

硬件 NUCLEO-G070RB 工具 cubemx 解决方法 7bit 改为 8bit printf 配置方法 添加头文件 #include <stdio.h> 添加重定向代码 #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endi…

JS逆向系列之猿人学爬虫第14题-备而后动-勿使有变

文章目录 题目地址参数分析参考jspython 调用往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/14题目难度标的是困难,主要难在js混淆部分。 参数分析 初始抓包有无限debugger反调试,可以直接hook 函数构造器过掉无限debugger Function.prototype.__construc…

uniapp写一个随时间变化的预约日期列表

const today new Date(); const dateArray []; const dayOfWeekArray []; const yearMonthDayArray []; for (let i 0; i < 7; i) { // 获取时间戳 …

灰度非线性变换之c++实现(qt + 不调包)

本章介绍灰度非线性变换&#xff0c;具体内容包括&#xff1a;对数变换、幂次变换、指数变换。他们的共同特点是使用非线性变换关系式进行图像变换。 1.灰度对数变换 变换公式&#xff1a;y a log(1x) / b&#xff0c;其中&#xff0c;a控制曲线的垂直移量&#xff1b;b为正…

一文学会sklearn中的交叉验证方法,cross_validate和KFlod实战案例

前言 在机器学习中&#xff0c;我们经常需要评估模型的性能。而为了准确评估模型的性能&#xff0c;我们需要使用一种有效的评估方法。五折交叉验证&#xff08;5-fold cross-validation&#xff09;就是其中一种常用的模型评估方法&#xff0c;用于评估机器学习模型的性能和泛…

R语言ggplot2 | R语言绘制物种组成面积图(三)

&#x1f4cb;文章目录 面积图简介准备数据集加载数据集数据处理数据可视化 利用R语言绘制物种组成图。本文以堆叠面积图的方式与大家分享。 面积图简介 面积图又叫区域图。它是在折线图的基础之上形成的, 它将折线图中折线与自变量坐标轴之间的区域使用颜色或者纹理填充&…
最新文章