接口自动化测试框架搭建完整版

news2024/11/19 9:30:43

1、基本目录的搭建

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

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

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

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

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

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

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

同时,我也为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看,也可以直接点击文末小卡片免费领取资料文档

软件测试视频教程观看处:

华测教育软件测试进阶全套视频教程(2023全网最新版,软件测试进阶自学必备)

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 True
        return False
 
    def 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 requests
 
DATA_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 res
 
 
    def 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 res
 
 
    def query_card(self, user_id, card_number):
        #dataSourceId=bHRjczEx&userId=1039&cardNumber=1111111111&methodId=02A
        params = {
            "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)
        yield
        db.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文件,都是和业务相关的

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

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

写在最后

PS:这里分享一套软件测试的自学教程合集。对于在测试行业发展的小伙伴们来说应该会很有帮助。除了基础入门的资源,博主也收集不少进阶自动化的资源,从理论到实战,知行合一才能真正的掌握。全套内容已经打包到网盘,内容总量接近500个G【点击文末小卡片免费领取】

☑ 240集-零基础到精通全套视频课程
☑ [课件+源码]-完整配套的教程
☑ 18套-测试实战项目源码
☑ 37套-测试工具软件包
☑ 268道-真实面试题
☑ 200个模板-面试简历模板、测试方案模板、软件测试报告模板、测试分析模版、测试计划模板、性能测试报告、性能测试报告、性能测试脚本用例模板(信息完整)

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

送给大家一句话,共勉:当我们能力不足的时候,首先要做的是内修!当我们能力足够强大的时候,就可以外寻了! 

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

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

相关文章

【列存储学习总结】

在 OpenGauss 中,列存储是一种高效的数据存储方式,它在处理分析查询和数据仓库工作负载时具有很高的性能优势。列存储将表中的数据按列存储在磁盘上,而不是按行存储,这样可以极大地提高数据读取和分析操作的效率。当涉及大量数据的…

护眼灯买哪种好? 推荐五款儿童护眼台灯

台灯如何选择,随着人们生活水平的提高及科技的不断进步,台灯的品质也得到了极大的提高,在生活中很多时候都需要使用台灯,但是市面上的台灯那么多,台灯如何选择。本次小编为大家推荐五款好用的护眼灯。 1.书客护眼台灯L…

一款功能强大的视频编辑软件会声会影2024中文破解版安装教程教程含会声会影2024注册机下载

会声会影2023中文破解版是一款功能强大的视频编辑软件、大型视频制作软件、专业视频剪辑软件。会声会影专业视频编辑处理软件,可以用于剪辑合并视频,制作视频,屏幕录制,光盘制作,视频后期编辑、添加特效、字幕和配音等…

关于亚马逊 CodeWhisperer 的使用体验

Amazon CodeWhisperer 是亚⻢逊出品的一款基于机器学习的 AI 编程助手,可实时提供代码建议。现在已正式可用,面向个人提供免费服务,通过在各种流行的IDE里集成 CodeWhisperer(包括我们常用的 JetBrains 产品包及 Vscode 工具集&am…

Java实现快递管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快递区域模块2.4 快递货架模块2.5 快递档案模块 三、界面展示3.1 登录注册3.2 快递类型3.3 快递区域3.4 快递货架3.5 快递档案3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 …

node 第十三天 express初见

express概念 Fast, unopinionated, minimalist web framework for Node.js 快速、独立、极简的 Node.js Web 框架。 express相当于前端的jquery, 在不更改不侵入原生node的基础上封装了大量易用且实用的服务端api, express框架的封装原理就是前面第十天我们自己封装的简易服务器…

BI是什么?想要了解BI需要从哪些方面入手?

企业为了执行数字化战略,实行数字化转型,实现数据价值,除了需要相关数字化技术及理念、人才等,还需要借助数字化相关应用,例如商业世界中广受企业欢迎的ERP、OA、CRM等业务信息系统,以及上升势头非常迅猛的…

设计模式(2)-创建型模式

1,创建型模式 4.1 单例设计模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己…

c语言中各类指针的总结

1、数组指针 在c语言中,指针常被用于应用数组,或者作为数组的元素。顾名思义,指向数组的指针常被简称为数组指针。值得注意的是,数组指针指向的数组是数组名,也是其数值中首元素的地址。 我们定义数组指针的方式如下…

26 行为型模式-命令模式

1 命令模式介绍 2 命令模式原理 3 命令模式实现 模拟酒店后厨的出餐流程,来对命令模式进行一个演示,命令模式角色的角色与案例中角色的对应关系如下: 服务员: 即调用者角色,由她来发起命令. 厨师: 接收者,真正执行命令的对象. 订单: 命令中包含订单 /*** 订单类**/ public cl…

深入浅出排序算法之堆排序

目录 1. 算法介绍 2. 执行流程⭐⭐⭐⭐⭐✔ 3. 代码实现 4. 性能分析 1. 算法介绍 堆是一种数据结构,可以把堆看成一棵完全二叉树,这棵完全二叉树满足:任何一个非叶结点的值都不大于(或不小于)其左右孩子结点的值。若父亲大孩子小&#x…

Azure - 机器学习实战:快速训练、部署模型

本文将指导你探索 Azure 机器学习服务的主要功能。在这里,你将学习如何创建、注册并发布模型。此教程旨在让你深入了解 Azure 机器学习的基础知识和常用操作。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验…

按照正规的软件开发流程,项目原型评审是全程对着页面评审吗

项目原型评审是软件开发过程中的一步,它的目的是确保设计和需求的一致性,以及提供一个可视化的界面供所有相关方进行沟通和理解。评审过程中,可能会涉及到多个方面: 用户界面(UI):确保UI设计满足…

2023第51届(郑州)全国文房四宝艺术博览会将于11月10日在郑州启幕

由中国文房四宝协会、《中国文房四宝》杂志社主办的2023第51届全国房四宝艺术博览会暨首届中国书房艺术空间展即将于11月10-13日在郑州国际会展中心盛大启幕。 这是首次文房四宝企业精英携千款优质产品,进入中原文化胜地集体亮相。这是一次书香郑州与中国文房的相遇…

北太天元安装教程 及使用方法

北太天元是面向科学计算与工程计算的国产通用型科学计算软件。提供科学计算、可视化、交互式程序设计,具备丰富的底层数学函数库,支持数值计算、数据分析、数据可视化、数据优化、算法开发等工作,并通过SDK与API接口,扩展支持各类…

手机apn介绍

公司遇到一件很棘手的事情,app发版之后,长江以北地方的用户网络信号很好,但是打开app之后网络连接不上,而长江以南的用户网络却很好。大家找了很多资料,提出一些方案: 1、是不是运营商把我们公司的ip给限制…

BDS/GNSS 卫星定位 SOC 芯片AT6558R 适用车载定位与导航

芯片简介 AT6558R 是一款高性能 BDS/GNSS 多模卫星导航接收机 SOC 单芯片,片上集成射频前端,数字基带处理器,32 位的 RISC CPU,电 源管理功能。 芯片支持多种卫星导航系统,包括中国的北斗卫星导航系统 BDS&#xff0c…

1985-2023年6月全球各国经济政策不确定性数据

1985-2023年6月全球各国经济政策不确定性数据 1、时间:1985年1月-2023年6月(月度) (2、来源:Economic Policy Uncertainty 3、范围:20多个国家的月度EPU数据(澳大利亚、巴西、加拿大、智利、…

正点原子嵌入式linux驱动开发——Linux SPI驱动

到目前为止的学习笔记,已经介绍了Linux下的platform总线框架、I2C总线框架,本篇笔记将介绍Linux下的SPI总线框架。与I2C总线一样,SPI是物理总线,也是一种很常用的串行通信协议。本章就来学习如何在Linux下编写SPI总线接口的设备驱…

电脑如何下载视频号的视频?电脑微信视频号使用的方法!

近年来,随着智能手机的普及和互联网技术的快速发展,社交媒体成为人们生活中不可或缺的一部分。微信作为中国最大的社交媒体平台之一,拥有庞大的用户群体和丰富多样的功能。然而,随着移动设备使用时间的增加,越来越多的…