(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) #也可以用params
        return res.text
if __name__ == '__main__':
    res = Login().login("18988888888","ABCabc012!@#")
    print(res)

数据驱动

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

import xlrd
import json


def is_json(str_data):
    try:
        json.loads(str_data)
    except ValueError:
        return False
    return True


class 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 = 0
        list_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 += 1
        return list_case


if __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 == expdata


if __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.mfbz.cn/a/67373.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL事务:ACID特性实现原理

事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段。本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并分析其实现原理。 MySQL博大精深,文章疏漏之处在所难免,欢迎批评指…

Eudic欧路词典 for Mac v4.4.5增强版

欧路词典 (Eudic)是一个功能强大的英语学习工具,它包含了丰富的英语词汇、短语和例句,并提供了发音、例句朗读、单词笔记等功能。 多语种支持:欧路词典支持多种语言,包括英语、中文、日语、法语等等,用户可以方便地进…

【计算机网络】概述及数据链路层

每一层只依赖于下一层所提供的服务,使得各层之间相互独立、灵活性好,已于实现和维护,并能促进标准化工作。 应用层:通过应用进程间的交互完成特定的网络应用,HTTP、FTP、DNS,应用层交互的数据单元被称为报…

List和数组互转方法以及踩坑点

一、数组转List 1. 使用for循环逐个添加 String[] array {"A", "B", "C"}; List<String> list new ArrayList<>(); for (String element : array) {list.add(element); }2. 使用Arrays.asList(arr) String[] array {"A&q…

如何在群辉NAS系统下安装cpolar套件,并使用cpolar内网穿透?

如何在群辉NAS系统下安装cpolar套件,并使用cpolar内网穿透&#xff1f; 文章目录 如何在群辉NAS系统下安装cpolar套件,并使用cpolar内网穿透&#xff1f;前言1. 在群辉NAS系统下安装cpolar套件2. 管理隧道列表3. 创建固定数据隧道 前言 群晖作为大容量存储系统&#xff0c;既可…

数字万用表测量基础知识--使用DMM测量电阻

概览 DMM&#xff08;即数字万用表&#xff09;是一种电气测试和测量仪器&#xff0c;可测量直流和交流信号的电压、电流和电阻。本文介绍如何正确使用和理解数字万用表(DMM)。 使用DMM测量电阻 电阻测量通常用于测量电阻器或其他组件的电阻&#xff0c;如传感器或扬声器。电…

全开源跨境电商一键铺货货源平台--后台数据采集功能

数据库设计在设计数据库时&#xff0c;需要考虑到以下信息&#xff1a; 货源信息&#xff1a;包括货源标题、价格、描述、图片等信息。 用户信息&#xff1a;包括用户名、密码、邮箱、电话等信息。 订单信息&#xff1a;包括订单号、用户信息、货源信息、支付信息等。 支付信息…

【白猫】图片转文字在线-图片文字提取

图片转文字 - 图片转Excel表格 - PDF转Word - 白描网页版白描&#xff0c;高效准确的中文ocr文字识别软件与文件扫描软件&#xff0c;支持简体、繁体、英文、韩语、日语、俄语等多国语言的准确识别&#xff0c;高清晰的文件扫描合成PDF,好用的手机扫描仪&#xff0c;可以表格识…

知识图谱推荐系统研究综述

基于协同过滤的推荐是当前应用最为广泛的推荐方法,但也存在着新用户或新项目的冷启动以及数据稀疏等问题。针对上述两种方法出现的问题,研究者进一步提出了混合推荐系统。混合推荐系统结合上述两种方法的优点,可以有效缓解其中的不足,增加推荐的准确性。但是,混合推荐系统…

clickhouse 删除操作

OLAP 数据库设计的宗旨在于分析适合一次插入多次查询的业务场景&#xff0c;市面上成熟的 AP 数据库在更新和删除操作上支持的均不是很好&#xff0c;当然 clickhouse 也不例外。但是不友好不代表不支持&#xff0c;本文主要介绍在 clickhouse 中如何实现数据的删除&#xff0c…

从数据仓库到数据结构:数据架构的演变之路

在上个世纪&#xff0c;从电子商务巨头到医疗服务机构和政府部门&#xff0c;数据已成为每家组织的生命线。有效地收集和管理这些数据可以为组织提供宝贵的洞察力&#xff0c;以帮助决策&#xff0c;然而这是一项艰巨的任务。 尽管数据很重要&#xff0c;但CIOinsight声称&…

定制 ChatGPT 以满足您的需求 自定义说明

推荐&#xff1a;使用 NSDT场景编辑器 快速助你搭建可二次编辑的3D应用场景 20 月 <> 日&#xff0c;OpenAI 宣布他们正在引入带有自定义说明的新流程&#xff0c;以根据您的特定需求定制 ChatGPT。 什么是自定义说明&#xff1f; 新的测试版自定义指令功能旨在通过防止…

BM8 链表中倒数最后k个结点

/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param pHead ListNode类 …

leetcode 343. 整数拆分

2023.8.10 本题用dp算法来做&#xff0c;dp[i]代表的含义是&#xff1a;当前数字i 在拆分之后所能获得的最大乘积。然后由于n>2&#xff0c;所以dp[0]和dp[1]没有意义&#xff0c;不用初始化&#xff0c;直接初始化dp[2] 1。 然后再遍历给dp数组赋值&#xff1a;dp[i]的来源…

业务逻辑漏洞之支付逻辑漏洞

业务逻辑漏洞之支付逻辑漏洞 一、漏洞挖掘介绍二、Web漏洞产生的原因三、业务逻辑简述四、 常见业务逻辑漏洞的功能点五、支付逻辑漏洞5.1、漏洞背景5.2、产生原因5.3、测试方法 六、挖到这些漏洞有什么用&#xff1f; 一、漏洞挖掘介绍 漏洞定义&#xff1a; 官方定义&#…

Linux基础与拓展

文章目录 虚拟机网络连接方式VIMvi和vim常用的三种模式各种模式的相互切换快捷键 用户管理权限 基本介绍&#xff1a;添加用户指定/修改密码删除用户切换用户用户组 路径命令学习mkdir命令介绍语法注意 touch 创建文件介绍语法 cat 查看文件内容介绍语法 more 查看文件内容介绍…

pve和openwrt以及我的电脑中网络的关系和互通组网

情况1 一台主机 有4个口&#xff0c;分别eth0,eth1,eth2,eth3 pve有管理口 这个情况下 &#xff0c;没有openwrt 直接电脑和pve管理口连在一起就能进pve管理界面 情况2 假设pve 的管理口味eth0 openwrt中桥接的是eth0 eth1 eth2 那么电脑连接eth3或者pve管理口设置eth3&#xf…

mysql不用窗口函数,后面加一列序号

前言 在后端开发中最常用的数据库还是比较稳定的5.8&#xff0c;而窗口函数是只有在mysql8以上才有的&#xff0c;然后在开发中有个需要排序序号的需求&#xff0c;翻找资料&#xff0c;问AI得出结论可以实现。 列出方法 如果你使用的是MySQL 5.7版本&#xff0c;而没有窗口…

C++笔记之回调函数的演变

C笔记之回调函数的演变 code review! 文章目录 C笔记之回调函数的演变1.使用函数指针2.使用typedef加函数指针3.使用std::using加函数指针4.使用typedef加std::function5.使用std::using加std::function6.使用回调和不使用回调对比 1.使用函数指针 代码 #include <iostre…

C# WPF 开源主题 HandyControl 的使用(一)

HandyControl是一套WPF控件库&#xff0c;它几乎重写了所有原生样式&#xff0c;同时包含80余款自定义控件&#xff08;正逐步增加&#xff09;&#xff0c;下面我们开始使用。 1、准备 1.1 创建项目 C# WPF应用(.NET Framework)创建项目 1.2 添加包 1.3 在App.xaml中引用…
最新文章