自动化测试框架搭建

news2024/11/25 21:29:22

思想:
    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),所以
        
            在工作中,我们如果修改了某一个文件,需要往上找,看看谁调用了这个文件,相对应的进行修改

 
  1. ##########################utils中的db.py的封装

  2. import pymysql

  3. #

  4. # # 1. 连接数据库

  5. # conn = pymysql.connect(

  6. # host='服务器地址',

  7. # port=3306,

  8. # user='用户名',

  9. # password='密码',

  10. # db='数据库名'

  11. # )

  12. # # 2. 建立游标

  13. # cur = conn.cursor(pymysql.cursors.DictCursor) # 没有s 有括号

  14. #

  15. # # 3. 执行sql

  16. # # 3.1 执行查询

  17. # cur.execute("SELECT * FROM cardInfo WHERE cardNumber='hzc_00011';")

  18. # conn.commit()

  19. # # 获取结果

  20. # result = cur.fetchall()

  21. # # result = cur.fetchone() # 取一条少一条

  22. # # cur.fetchmany(3)

  23. # print(result)

  24. #

  25. # # 3.2 执行修改

  26. # # cur.execute("DELETE FROM cardInfo WHERE cardNumber='hzc_00011';")

  27. # # conn.commit()

  28. #

  29. # # 4. 关闭

  30. # cur.close()

  31. # conn.close()

  32. class DB(object):

  33. def __init__(self):

  34. self.conn = pymysql.connect(

  35. host='服务器地址',

  36. port=3306,

  37. user='用户名',

  38. password='密码',

  39. db='数据库名',

  40. autocommit=True

  41. )

  42. self.cur = self.conn.cursor(pymysql.cursors.DictCursor) #添加此配置项,默认commit了,即建立游标

  43. def do_sql(self, sql):

  44. print('执行sql', sql)

  45. self.cur.execute(sql) #执行sql语句

  46. # self.conn.commit()

  47. return self.cur.fetchall() #返回查询到的所有结果

  48. class FuelCardDB(DB): #继承DB

  49. """执行具体的sql语句"""

  50. def del_card(self, card_number):

  51. """执行删除语句"""

  52. self.do_sql(f"DELETE FROM cardInfo WHERE cardNumber='{card_number}'")

  53. def check_card(self, card_number):

  54. """执行查询语句"""

  55. result = self.do_sql(f"SELECT * FROM cardInfo WHERE cardNumber='{card_number}';")

  56. if result:

  57. return True

  58. return False

  59. def add_card(self, card_number):

  60. """执行添加语句"""

  61. result = self.check_card(card_number)

  62. if not result:

  63. self.do_sql(f"INSERT INTO cardInfo (cardNumber) VALUES ('{card_number}');")

#######################api文件的封装

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

 
  1. import requests

  2. DATA_SOURCE_ID = "bHRz"

  3. class Api(object):

  4. def __init__(self, base_url):

  5. self.url = base_url + '/gasStation/process'

  6. self.session = requests.session()

  7. def add_fuelcard(self, card_number):

  8. json_data = {"dataSourceId": DATA_SOURCE_ID, "methodId": "00A", "CardInfo": {"cardNumber": card_number}}

  9. res = self.session.post(self.url, json=json_data)

  10. print(res.text)

  11. return res

  12. def bind_card(self, user_name, id_type, id_number, card_number):

  13. json_data = {

  14. "dataSourceId": DATA_SOURCE_ID,

  15. "methodId": "01A",

  16. "CardUser": {

  17. "userName": user_name,

  18. "idType": id_type,

  19. "idNumber": id_number

  20. },

  21. "CardInfo": {

  22. "cardNumber": card_number

  23. }

  24. }

  25. res = self.session.post(self.url, json=json_data)

  26. print(res.text)

  27. return res

  28. def query_card(self, user_id, card_number):

  29. #dataSourceId=bHRjczEx&userId=1039&cardNumber=1111111111&methodId=02A

  30. params = {

  31. "dataSourceId": DATA_SOURCE_ID,

  32. "methodId": "02A",

  33. "userId": user_id,

  34. "cardNumber": card_number

  35. }

  36. res = self.session.get(self.url, params=params)

  37. print(res.text)

  38. return res

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

 
  1. import pytest

  2. from utils.db import FuelCardDB

  3. from apis.fuelcard_api import Api

  4. @pytest.fixture(scope='session')

  5. def db():

  6.    #实例化一个对象

  7. return FuelCardDB()

  8. @pytest.fixture(scope='session')

  9. def api(base_url):

  10.   #实例化一个对象,并将配置文件中的base_url传给Api层的方法

  11. return Api(base_url)

  12. @pytest.fixture

  13. def del_card(db):

  14. def _del_card(card_number):

  15. db.del_card(card_number)

  16. yield

  17. db.del_card(card_number)

  18. 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://***.***.***.***:***

#######################总结

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

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

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

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

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

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

文档获取方式:

加入我的软件测试交流群:1007119548免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

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

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

相关文章

2024年2月12日-2月18日周报

文章目录 1. 本周计划2. 完成情况2.1 论文摘要2.2 数据集2.3 基准测试 3. 总结及收获4. 下周计划 1. 本周计划 阅读论文《 E F W I E^{FWI} EFWI: Multiparameter Benchmark Datasets for Elastic Full Waveform Inversion of Geophysical Properties》 了解一种新型的数据集&…

备战蓝桥杯 Day7(序列dp)

基本分类 (1)单序列 a.最大子段和 b.最长上升子序列LIS (2)多序列 a.最长公共子序列 b.编辑距离 最大子段和 单序列dp一般开一维数组 最大子段和 - 洛谷https://www.luogu.com.cn/problem/P1115 分析: 写出状态和状…

chrome版本117驱动下载路,解决版本不匹配问题

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

生成式 AI - Diffusion 模型的数学原理(2)

来自 论文《 Denoising Diffusion Probabilistic Model》(DDPM) 论文链接: https://arxiv.org/abs/2006.11239 Hung-yi Lee 课件整理 文章目录 一、基本概念二、VAE与Diffusion model三、算法解释四、训练过程五、推理过程 一、基本概念 Diff…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之NavDestination组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之NavDestination组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、NavDestination组件 作为NavRouter组件的子组件,用于显示导…

计网day4

五 网络层 5.1 网络层功能概述 5.2 路由算法 5.3 IP数据报格式 无分类编址CIDR: ARP协议: DHCP协议: ICMP协议: 5.4 IPv6 5.5 RIP协议及距离向量算法 OSPF协议及链路状态算法: BGP协议&#xf…

作为一个程序员,最少要看过这几部电影吧?

计算机专业必看的几部电影 计算机专业必看的几部电影,就像一场精彩的编程盛宴!《黑客帝国》让你穿越虚拟世界,感受高科技的魅力;《社交网络》揭示了互联网巨头的创业之路,《源代码》带你穿越时间解救世界,…

【每天学习一点点 day05】工程化 重新认识npm 02_包(package.json)的概念、模块(node_modules)、范围(scoped

1. 包package About packages and modules | npm Docs (npmjs.com) 1.1. package package.json包的描述性文件 A package is a file or directory that is described by a package.json file. 包是由 package.json 文件描述的文件或目录。 A package must contain a packa…

追赶OpenAI的Sora:Meta开源V-JEPA,让AI学会认识世界!

就在Sora疯狂刷屏那天,还有两款重磅产品发布:一个是谷歌的Gemini 1.5,首个支持100万tokens上下文的大模型;另外一个便是全球科技、社交巨头Meta的V-JEPA。 有趣的是,在功能方面V-JEPA与Sora有很多相似之处&#xff0c…

备战蓝桥杯 Day5

1191:流感传染 【题目描述】 有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得…

用户空间与内核通信(一)

在Linux中,内核空间与用户空间是操作系统中的两个主要部分,它们有着明显的区别和不同的功能。 内核空间: 内核空间是操作系统内核运行的区域,它包括了操作系统内核代码、数据结构和设备驱动程序等。内核空间位于虚拟地址空间的最…

CleanMyMac X2024破解电脑版安装包下载

CleanMyMac X 4.14.6 是 CleanMyMac X 的一个具体版本号。这个版本可能包含了一些新的功能、改进和修复,以提高软件的性能和稳定性。以下是一些关于 CleanMyMac X 4.14.6 的特点和更新内容: 恶意软件保护:CleanMyMac X 4.14.6 继续加强其恶意…

SpringBoot源码解读与原理分析(五)SpringBoot的装配机制

文章目录 2.5 Spring Boot的装配机制2.5.1 ComponentScan2.5.1.1 ComponentScan的基本使用方法2.5.1.2 TypeExcludeFilter(类型排除过滤器)2.5.1.3 AutoConfigurationExcludeFilter(自动配置类排除过滤器) 2.5.2 SpringBootConfiguration2.5.3 EnableAutoConfiguration2.5.3.1 …

Shiro-05-5 分钟入门 shiro 安全框架实战笔记

序言 大家好,我是老马。 前面我们学习了 web 安全之 Spring Security 入门教程 这次我们来一起学习下另一款 java 安全框架 shiro。 什么是Apache Shiro? Apache Shiro是一个功能强大且易于使用的Java安全框架,它为开发人员提供了一种直…

【深度学习笔记】深度学习训练技巧——处理过拟合

处理过拟合 过拟合 定义:对训练集拟合得很好,但在验证集表现较差 神经网络 通常含有大量参数 (数百万甚至数十亿), 容易过拟合 处理策略:参数正则化、早停、随机失活、数据增强 早停 当发现训练损失逐渐下降,但验证集损失逐渐…

【项目管理】CMMI-项目监督和控制

项目监督和控制(Monitoring and Control, MC)的目的是通过周期性地跟踪项目计划的各种性能参数如工作产品的规模、工作量、成本、进度、风险等,不断地了解项目的进展情况,以便当项目实际进展状况显著偏离项目计划时能够及时采取纠…

Apache Flink连载(二十八):Flink细粒度资源管理(1)-适用场景和原理

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录

Hack The Box-Office

端口扫描&信息收集 使用nmap对靶机进行扫描 nmap -sC -sV 10.10.11.3开放了80端口,并且注意到该ip对应的域名为office.htb,将其加入到hosts文件中访问之 注意到扫描出来的还有robots文件,经过尝试后只有administrator界面是可以访问的 …

程序员的自我修养笔记

导读 本书将详细描述现在流行的Windows和Linux操作系统下各自的可执行文件、 目标文件格式; 普通C/C程序代码如何被编译成目标文件及程序在目标文件中如何存储; 目标文件如何被链接器链接到一起, 并且形成可执行文件; 目标文件在…

大白话说说redux

redux的3个重要概念 store 就是用来存放应用的各种状态的action 就是用来描述应用发生了什么动作的,注意理解他是对动作的描述reducer 就是用来处理应用的动作,并且决定怎么去更新应用存放在store里面的状态。 redux的3个原则 应用的所有状态存储为re…