CSDN【top1】Pytest接口测试框架实战项目搭建_pytest框架搭建

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

import requests
from tools.logger import log # 导入封装的logger方法

class Common:
‘’‘封装通用接口’‘’

#request-post请求,适用Content-Type:application/x-www-form-urlencoded,即表单传参,类似some=data&xxx=xxx 的形式
def r_post_form(url,headers,data):
log.info(“请求参数为:{},{}”.format(url,data))
res = requests.post(url,headers=headers,data=data).json()
log.info(“响应结果为:{}”.format(res))
return res

#request-post请求,适用’Content-Type’: ‘application/json’,即json传参
def r_post(url,headers,json):
log.info(“请求参数为:{},{}”.format(url, json))
res = requests.post(url,headers=headers,json=json).json()
log.info(“响应结果为:{}”.format(res))
return res

request-post请求,适用’Content-Type’: ‘application/json’,即json传参——请求时不转换成json,适配s统一登录系统接口请求

def r_s_post(url, headers, json):
log.info(“请求参数为:{},{}”.format(url, json))
res = requests.post(url, headers=headers, json=json)
log.info(“响应结果为:{}”.format(res.text))
return res

#request-get请求
def r_get(url,heasers,json):
log.info(“请求参数为:{},{}”.format(url, json))
res = requests.get(url,headers=heasers,json=json)
log.info(“响应结果为:{}”.format(res))
return res

#断言:s统一登录系统的message=操作成功
def assert_s_code_message(res_json):
code = res_json[‘code’]
message = res_json[‘message’]
assert code == ‘200’ and message == ‘操作成功’

断言:业务系统的message=请求成功

def assert_tg_code_message(res_json):
code = res_json[‘code’]
message = res_json[‘message’]
assert code == ‘200’ and message == ‘请求成功’

四、logger.py

1、logger.py源码如下

知识点一:

应该大多数的日志都是用的内置的logging库,但是该框架使用的是loguru库,所以需要安装下 pip3 install loguru

知识点二:

1.os.path.abspath 作用: 获取当前脚本的完整路径

2.os.path.dirname 功能:去掉文件名,返回目录

3.os.path.join() 连接 两个或更多的路径名组件

知识点三:

.format():用于格式化方法,即用来控制字符串和变量的显示效果,增强了字符串格式化的功能

‘’’
@Date:2022/9/30 20:49
@Author:一加一
‘’’

-- coding:utf-8 --

from loguru import logger
from datetime import datetime
from conf.setting import *

class Logger:
‘’’
loguru封装日志记录器
‘’’

def new(cls, *args, **kwargs):
‘’’
1.os.path.abspath 作用: 获取当前脚本的完整路径
2.os.path.dirname 功能:去掉文件名,返回目录
3.os.path.join() 连接两个或更多的路径名组件
:param args:
:param kwargs:
:return:
‘’’

log_name = datetime.now().strftime(“%Y-%m-%d”) # 以时间命名日志文件,格式为"年-月-日"
sink = os.path.join(LOG_PATH,“{}.log”.format(log_name)) # 日志记录文件路径
level = “DEBUG” # 记录的最低日志级别为DEBUG
encoding = “utf-8” # 写入日志文件时编码格式为utf-8
enqueue = True # 多线程多进程时保证线程安全
rotation = “500MB” # 日志文件最大为500MB,超过则新建文件记录日志
retention = “1 week” # 日志保留时长为一星期,超时则清除
logger.add(
sink=sink, level=level, encoding=encoding,
enqueue=enqueue, rotation=rotation, retention=retention
)
return logger

log = Logger()

2、直接执行该文件,会在log文件夹生成一个.log文件,如下图

3、该文件需要导入目录文件设置,即conf.setting,主要用于读取LOG_PATH

‘’’
@Date:2022/10/3 20:56
@Author:一加一
‘’’

import os

‘’‘管理文件存放路径’‘’

BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(file)))

REPORT_PATH = os.path.join(BASE_PATH,‘report’) #报告存放的目录

CASE_PATH = os.path.join(BASE_PATH,‘testcase’) #测试用例的目录

CASE_DATA_PATH = os.path.join(BASE_PATH,‘data’) #测试数据的目录

LOG_PATH = os.path.join(BASE_PATH,“log”)

CONFIG_FILE = os.path.join(BASE_PATH,‘conf’,‘config.ini’) #配置文件的目录

LOGIN_DATA_YAML_FILE = os.path.join(BASE_PATH, ‘data’, ‘userInfo.yaml’) #配置文件的目录

五、operate_config.py

1、该文件主要是读取配置文件,即读取conf/config.ini,这里先贴上operate_config.py源码,后面用到该方法会提及

读取配置文件主要是为了适配公司的多个测试环境,如若有需要切换环境,则直接改配置文件即可

-- coding:utf-8 --

import yaml
import configparser
from conf.setting import CONFIG_FILE,LOGIN_DATA_YAML_FILE

def get_yaml(goal):
with open(LOGIN_DATA_YAML_FILE, encoding=‘utf-8’) as f:
yaml_log = yaml.load(f, Loader=yaml.FullLoader)
goal_list = yaml_log.keys()
if goal in goal_list:
return yaml_log[goal]
else:
print(‘不存在的配置’)

class OperateConfig:
def init(self):
self.config = configparser.ConfigParser() # 调用外部的读取配置文件的方法
self.config.read(CONFIG_FILE, encoding=‘GBK’)

def get_node_value(self,node, name):
value = self.config.get(node, name)
return value

def set_node_value(self,section,node,name):
“”“写入配置文件”“”
self.config.set(section,node,name) # 修改指定section 的option
self.config.write(open(CONFIG_FILE, ‘w’))

2、conf/config.ini源码如下

因为涉及到公司敏感信息,所以用xxx代替了,配置文件主要存储登录系统和业务系统的接口域名

[ENV]
env = QA1

[QA1]
y_api_url = https://qa1-api.y.cn
s_api_url = https://qa-s-xxx.cn

[QA2]
y_api_url = https://qa2-api.y.cn
s_api_url = https://qa-s-xxx.cn

六、operate_json.py

1、该文件主要封装对.json文件的读取或修改操作,用于接口请求时要读取请求体或请求头,又或者往请求体里插入变量字段,源码如下

‘’’
@Date:2022/10/2 8:18
@Author:一加一
‘’’

import json
import os
from conf.setting import CASE_DATA_PATH

data_path = os.path.join(CASE_DATA_PATH, “test.json”)

class OperationJson:
def init(self, file_names=None):
if file_names:
self.file_name = file_names
else:
self.file_name = data_path

def open_json(self):
“”“打开json文件
:return:返回json文件数据
“””
with open(self.file_name, ‘r’,encoding=‘utf-8’) as fp:
data = json.load(fp)
return data
fp.close()

def key_get_data(self, key1, key2=None):
“”“通过key值获取数据
:param key1:
:param key2:
:return:
“””
if key2 is None:
data = self.open_json()[key1]
else:
data = self.open_json()[key1][key2]
return data

def write_data(self, w_data, key1, key2=None):

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
2]
return data

def write_data(self, w_data, key1, key2=None):

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-9gaPj3Mj-1713293801924)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值