接口自动化测试框架搭建详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快  

1、基本目录的搭建

report:静态输出目录(报告或者日志)

data:静态输入目录(可以存放Excel数据,被读取的一些数据)

utils:实用方法层(这里存放的是项目的公共方法,一般拿到别的项目可以直接使用,列如:读取Excel中的数据,连接数据库,)

apis:接口请求层(这里封装的方法一般都是和项目有关系,列如:发送post请求,发送get请求,登录接口,注册接口,支付接口,加入购物车接口)

testcases:用例目录(用来存放项目中涉及到的用例,用例即包含单接口用例,也包含关联接口用例,管理目录时,也可以通过目录分层结构管理)

conftest:这里存放的是fixture,只对文件的所在目录生效,如果只是单目录用例那么可以在根目录下创建,如果分为分层目录结构的用例,那么为了满足当前目录的用例,可以在该目录下创建一个conftest,用来存放fixture,fixture是pytest框架的根髓

pytest.ini:是pytest的配置文件,可用来存放一些运行配置项,如:-v -s ;或者配置日志输出渠道;该文件的具体配置,可百度学习

2、接口框架的重要思想=======》金字塔的配置

①report=data---》utils=apis=---》conftest---》pytest.ini---》testcases

②以上相当于金字塔结构,从左至右为从底部到顶部的过程

③金字塔精髓之处在于,(上部依赖底部,底部不依赖于上部),举一个列子,(testcases中的用例,需要调用apis目录中的接口请求方法,而apis不会去主动调用testcases),所以
        
在工作中,我们如果修改了某一个文件,需要往上找,看看谁调用了这个文件,相对应的进行修改

##########################utils中的db.py的封装
import pymysql#
# # 1. 连接数据库
# conn = pymysql.connect(
#     host='服务器地址',
#     port=3306,
#     user='用户名',
#     password='密码',
#     db='数据库名'
# )
# # 2. 建立游标
# cur = conn.cursor(pymysql.cursors.DictCursor)  # 没有s 有括号
#
# # 3. 执行sql
# # 3.1 执行查询
# cur.execute("SELECT * FROM cardInfo WHERE cardNumber='hzc_00011';")
# conn.commit()
# # 获取结果
# result = cur.fetchall()
# # result = cur.fetchone() # 取一条少一条
# # cur.fetchmany(3)
# print(result)
#
# # 3.2 执行修改
# # cur.execute("DELETE FROM cardInfo WHERE cardNumber='hzc_00011';")
# # conn.commit()
#
# # 4. 关闭
# cur.close()
# conn.close()class DB(object):def __init__(self):self.conn = pymysql.connect(host='服务器地址',port=3306,user='用户名',password='密码',db='数据库名',autocommit=True)self.cur = self.conn.cursor(pymysql.cursors.DictCursor)    #添加此配置项,默认commit了,即建立游标def do_sql(self, sql):print('执行sql', sql)self.cur.execute(sql)    #执行sql语句# self.conn.commit()    return self.cur.fetchall()    #返回查询到的所有结果class FuelCardDB(DB):    #继承DB"""执行具体的sql语句"""def del_card(self, card_number):"""执行删除语句"""self.do_sql(f"DELETE FROM cardInfo WHERE cardNumber='{card_number}'")def check_card(self, card_number):"""执行查询语句"""result = self.do_sql(f"SELECT * FROM cardInfo WHERE cardNumber='{card_number}';")if result:return Truereturn Falsedef add_card(self, card_number):"""执行添加语句"""result = self.check_card(card_number)if not result:self.do_sql(f"INSERT INTO cardInfo (cardNumber) VALUES ('{card_number}');")

api文件的封装

思想:该文件可以将不同的请求方法,不同的请求地址接口,封装成一个类,然后在用例层用到了哪一个就去调取哪一个

以下实列是添加加油卡项目

import requestsDATA_SOURCE_ID = "bHRz"class Api(object):def __init__(self, base_url):self.url = base_url + '/gasStation/process'self.session = requests.session()def add_fuelcard(self, card_number):json_data = {"dataSourceId": DATA_SOURCE_ID, "methodId": "00A", "CardInfo": {"cardNumber": card_number}}res = self.session.post(self.url, json=json_data)print(res.text)return resdef bind_card(self, user_name, id_type, id_number, card_number):json_data = {"dataSourceId": DATA_SOURCE_ID,"methodId": "01A","CardUser": {"userName": user_name,"idType": id_type,"idNumber": id_number},"CardInfo": {"cardNumber": card_number}}res = self.session.post(self.url, json=json_data)print(res.text)return resdef query_card(self, user_id, card_number):#dataSourceId=bHRjczEx&userId=1039&cardNumber=1111111111&methodId=02Aparams = {"dataSourceId": DATA_SOURCE_ID,"methodId": "02A","userId": user_id,"cardNumber": card_number}res = self.session.get(self.url, params=params)print(res.text)return res

思想:该文件下主要封装的是fixtures方法,即为了简化用例层步骤,可以将操作前提步骤和过程步骤在此文件下完成,在该文件下有一个base_url,这个是安装的插件,安装方法为pip install pytest-base-url

import pytest
from utils.db import FuelCardDB
from apis.fuelcard_api import Api@pytest.fixture(scope='session')
def db():#实例化一个对象return FuelCardDB()@pytest.fixture(scope='session')
def api(base_url):#实例化一个对象,并将配置文件中的base_url传给Api层的方法return Api(base_url)@pytest.fixture
def del_card(db):def _del_card(card_number):db.del_card(card_number)yielddb.del_card(card_number)return _del_card

pytest.ini文件的封装

思想:上述已说明,该文件为pytest框架的配置文件,即运行用例时会默认执行该文件操纵,注意表达格式,conftest文件和api文件中都用到了base_url,就是这里的base_url,目的是当服务器地址变了之后,不用去接口层去一一修改服务器地址,只需要修改这里的地址就行,但是如果接口的请求地址变了,就要去一一修改了,毕竟针对不同的请求地址封装了不同的方法

[pytest]
addopts = -s --html=reports/report.html --self-contained-html
testpaths = testcases
base_url = http://***.***.***.***:***
 

3、总结

①接口的主要框架基本已经出来了,当我们需要其他方法时,可以再去相对应的添加,例如读取excel表格数据的方法,可以再封装到utils目录下

②如果需要公共的方法时,可以去百度查一下别人写好的模块,说实话自己写半天也不如人家封装好的实用性更高,我们的目标就是会使用别人封装好的方法就OK了

③如果涉及到自己的业务模块,就要自己去封装了,例如上面所说的,api文件,conftest文件,都是和业务相关的

④对于初级的自动化测试人员,最主要的不是去写框架,而是去运用好别人写好的框架,来设计用例,写用例

⑤一条用例的基本流程:测试环境准备、测试数据准备、发送数据、获取数据响应结果、设置断言、环境清理

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

找不到x3daudio1_7.dll无法继续执行代码怎么解决,共有七种方法

​在使用某些游戏或多媒体应用时,您可能会遇到“找不到X3DAudio1_7.dll”这样的错误提示。这个问题不仅会影响游戏的启动和音效质量,还可能引发其他系统性能问题。本文将全面解读X3DAudio1_7.dll丢失的原因、具体影响、解决方法以及预防措施,…

连接器上市企业观察:通讯利好,光储承压

【哔哥哔特导读】2024年已临近尾声,前三季度,29家连接器上市企业业绩如何?通讯、光伏、储能等器热门领域,连接器行业总体趋势相较上一年发生了什么变化? 10月份,连接器上市企业集中发布三季度业绩报告。《国际线缆与…

锂电池保护板行业分析与未来预测

锂电池保护板是对串联锂电池组的充放电保护;在充满电时能保证各单体电池之间的电压差异小于设定值(一般20mV),实现电池组各单体电池的均充,有效地改善了串联充电方式下的充电效果;同时检测电池组中各个单体…

企业u盘管控丨企业禁止U盘使用的5个小妙招分享!你最看好哪一个?

在企业日常运营中,U盘因其便携性和易用性,成为了数据传输的重要工具。 然而,若不对U盘使用加以严格管控,便可能引发数据泄露、病毒感染、管理混乱和资源滥用等一系列问题。 接下来,我们将分享五个企业禁止U盘使用的小…

Linux中扫描网络的“nmap”工具使用方法

0-介绍 在Linux中进行网络管理的最强大工具之一首推nmap。如果您想要扫描您的网络,查看哪些端口是开放的以及正在运行的服务,nmap是您的理想选择。注意手机上termux 中的用法一致。 1-什么是nmap? nmap属于网络映射器h工具,是一个用于扫描…

NVR小程序接入平台EasyNVR多品牌NVR管理设备:GB28181协议摄像头如何接入到EasyNVR中?

随着视频监控技术的不断进步,摄像头拉流技术已经成为现代安防系统中的关键组成部分。在众多拉流协议中,GB28181协议凭借其高安全性和设备兼容性,在大规模、跨区域的视频监控系统中展现出显著优势。本文将详细介绍如何将GB28181协议摄像头接入…

通胀降温遇到波动,美联储降息或成更大争议焦点

近期美国的通胀数据继续呈现出不均衡的走低趋势。尽管10月份的消费价格同比上涨略有回升,通胀整体走势依然显示出降温的迹象。根据最新报告,虽然通胀没有完全消退,但依然无法阻止市场对美联储在12月份可能再次降息的预期。不过,这…

不锈钢高速肉馅斩拌机:

不锈钢高速肉馅斩拌机通过斩切作用提高产品的细密度和弹性,广泛应用于肉制品的深加工制作,如机制作肉丸、香肠等。其工作原理是利用斩刀高速旋转的斩切作用,将原料进行斩切和乳化处理,从而提高产品的细腻度和弹性。斩拌机具有以下…

1.0版-结构化(经典)软件开发方法: 需求分析阶段+设计阶段

结构化软件开发方法: 特点: 面向数据流, 以数据流为中心构建软件的分析/设计模型 结构化分析模型:数据流图 结构化设计模型:结构图, 模块的程序流程图 1.建立结构化分析模型: 数据流图--DFD图 功能建模, 规约加工流程 实体关系图-ER图 数据建模, 对实体对象的描述 状态转换图-S…

C++基础:Pimpl设计模式的实现

2024/11/14: 在实现C17的Any类时偶然接触到了嵌套类的实现方法以及Pimpl设计模式,遂记录。 PIMPL ( Private Implementation 或 Pointer to Implementation )是通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏。 …

Intellij idea 报错:Error : java 不支持发行版本5

点击“Settings”-->“Bulid, Execution,Deployment”-->“Java Compiler”,Target bytecode version设为本地Java版本。(可以在Default Settings中把Project bytecode version 一劳永逸地配置成本地Java版本) Default Settings&#x…

物理验证Calibre LVS Stamping Conflict SoftConnect案例解析

最近有好几个星球会员问到物理验证Calibre LVS检查中的Stamping Conflict问题。小编今天给大家分享下Stamping冲突的相关topic。 Calibre PEX Hspice Netlist提取步骤(数模芯片提取spice netlist流程) Stamping Conflict概念 当不同的net对应的net sha…

TypeScript在现代前端开发中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 TypeScript在现代前端开发中的应用 TypeScript在现代前端开发中的应用 TypeScript在现代前端开发中的应用 引言 TypeScript 概述…

代码随想录训练营Day24 | 134. 加油站 - 135. 分发糖果 - 860.柠檬水找零 - 406.根据身高重建队列

134. 加油站 题目链接:134. 加油站 思路: 由题意可得,需要能够走完所有的加油站,就需要保证车到达每一个加油站的时候有油,故先对gas和cost数组做差,得到每个加油站的油差,正代表着车在这里能加…

Burp Suite 专业版使用【Mac版本 m1处理器】

前言 Burp Suite 专业版(Professional)是需要付费使用的,但是社区版(Community)是免费的,下图第一个下拉框可以切换专业版和社区版本。 Burp Suite 专业版如果没有License key,是不能正常使用的,下边是在没有购买License key的情况下使用Burp Suite 专业版的方法。 本文是…

【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)

事务的隔离级别 1. 如何理解事务的隔离性2. 事务隔离级别的分类3. 查看和设置事务隔离级别3.1 全局和会话隔离级别3.2 查看和设置隔离级别 4. 事务隔离级别的演示4.1 读未提交(Read Uncommitted)4.2 读已提交(Read Committed)4.3 …

【热门主题】000044 大数据治理:开启数据时代新征程

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

JavaWeb后端开发知识储备1

目录 1.DTO/VO/PO 2.MVC架构/微服务架构 3.JWT令牌流程 4.ThreadLocal 5.接口路径/路径参数 1.DTO/VO/PO 1.1 DTO DTO 即 Data Transfer Object—— 数据传输对象,是用于传输数据的对象,通常在服务层与表现层之间传递数据,DTO 通常用于…

35岁程序员的四条职业发展路径:提前规划,迎接新起点

引言 20多岁:初入职场,怀揣梦想,对未来充满期待。30多岁:面临家庭与事业的双重压力,开始感到迷茫与焦虑。40岁:步入中年,如何在激烈的职场竞争中保持优势,继续书写精彩人生&#xf…

C++提高编程-泛型编程

一、模板: 1.1.模板的概念: 1.模板就是建立通用的模具,大大提高复用性2.例如生活中的模板: 一寸照片模板: PPT模板: 模板的特点: 模板不可以直接使用,它只是一个框架模板的通用并不是万能的 二、泛型编…