2024年软件测试最全Pytest接口自动化测试实战演练_from comms(1),大厂内部资料

img
img
img

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

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

需要这份系统化的资料的朋友,可以戳这里获取

        msg = Api_Auth_Service().api_service_info(serviceId,developerId)
    self.log.info('%s:%s' % ((sys._getframe().f_code.co_name, '获取请求结果:%s' % msg.json())))
    # 断言
    assert msg.json()["result_message"] == expect['result_message']
    assert msg.json()['result_code'] == expect['result_code']
    assert 'url' in msg.json()['data']

 conftest.py



‘’’
Code description:配置信息
Create time: 2020/12/3
Developer: 叶修
‘’’
import os
import pytest
from api.get_token import Get_Token
from common.http_requests import HttpRequests

@pytest.fixture(scope=“session”)
def get_token():
‘’‘前置操作获取token并传入headers’‘’
Get_Token().get_token()
if not HttpRequests().params.get(“access_token”, “”):#没有get到token,跳出用例
pytest.skip(“未获取token跳过用例”)
yield HttpRequests().req
HttpRequests().req.close()

def pytest_addoption(parser):
parser.addoption(
“–cmdhost”, action=“store”, default=“http://192.168.1.54:32099”,
help=“my option: type1 or type2”
)
@pytest.fixture(scope=“session”,autouse=True)
def host(request):
‘’‘获取命令行参数’‘’
#获取命令行参数给到环境变量
#pytest --cmdhost 运行指定环境
os.environ[“host”] = request.config.getoption(“–cmdhost”)
print(“当前用例运行测试环境:%s” % os.environ[“host”])


 common/connect\_mysql.py



‘’’
Code description: 配置连接数据库
Create time: 2020/12/3
Developer: 叶修
‘’’
import pymysql

dbinfo = {
“host”:““,
“user”:“root”,
“password”:”
”,
“port”:31855
}
class DbConnect():
def init(self,db_conf,database=“”):
self.db_conf = db_conf
#打开数据库
self.db = pymysql.connect(database = database,
cursorclass = pymysql.cursors.DictCursor,
**db_conf)
#使用cursor()方式获取操作游标
self.cursor = self.db.cursor()

def select(self,sql):
    #sql查询
    self.cursor.execute(sql)#执行sql
    results = self.cursor.fetchall()
    return results

def execute(self,sql):
    #sql 删除 提示 修改
    try:
        self.cursor.execute(sql)#执行sql
        self.db.commit()#提交修改
    except:
        #发生错误时回滚
        self.db.rollback()

def close(self):
    self.db.close()#关闭连接

def select_sql(select_sql):
‘’‘查询数据库’‘’
db = DbConnect(dbinfo,database=‘auth_platform’)
result = db.select(select_sql)
db.close()
return result

def execute_sql(sql):
‘’‘执行SQL’‘’
db = DbConnect(dbinfo,database=‘auth_platform’)
db.execute(sql)
db.close()

if name == ‘main’:
sql = “SELECT * FROM auth_platform.auth_service where name=‘四要素认证’”
sel = select_sql(sql)[0][‘name’]
print(sel)


 common/http\_requests.py



‘’’
Code description: 封装自己的请求类型
Create time: 2020/12/3
Developer: 叶修
‘’’

import requests

定义一个HttpRequests的类

class HttpRequests(object):

req = requests.session()#定义session会话
# 定义公共请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36',
    'cookie':''
}
params = {
    'access_token':''
}
# 封装自己的get请求,获取资源
def get(self, url='', params='', data='', headers=None, cookies=None,stream=None,verify=None):
    response = self.req.get(url,params=params,data=data,headers=headers,cookies=cookies,stream=stream,verify=verify)
    return response

# 封装自己的post方法,创建资源
def post(self, url='', params='',data='', json='', headers=None, cookies=None,stream=None,verify=None):
    response = self.req.post(url,params=params,data=data,json=json,headers=headers,cookies=cookies,stream=stream,verify=verify)
    return response

# 封装自己的put方法,更新资源
def put(self, url='', params='', data='', headers=None, cookies=None,verify=None):
    response = self.req.put(url, params=params, data=data, headers=headers, cookies=cookies,verify=verify)
    return response

# 封装自己的delete方法,删除资源
def delete(self, url='', params='', data='', headers=None, cookies=None,verify=None):
    response = self.req.delete(url, params=params, data=data, headers=headers, cookies=cookies,verify=verify)
    return response

 common/logger.py



‘’’
Code description: 封装输出日志文件
Create time: 2020/12/3
Developer: 叶修
‘’’
import logging,time
import os
import getpathinfo

path = getpathinfo.get_path()#获取本地路径
log_path = os.path.join(path,‘logs’)# log_path是存放日志的路径

如果不存在这个logs文件夹,就自动创建一个

if not os.path.exists(log_path):os.mkdir(log_path)

class Log():
def init(self):
#文件的命名
self.logname = os.path.join(log_path,‘%s.log’%time.strftime(‘%Y_%m_%d’))
self.logger = logging.getLogger()
self.logger.setLevel(logging.DEBUG)
#日志输出格式
self.formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s’)

def __console(self,level,message):
    #创建一个fileHander,用于写入本地
    fh = logging.FileHandler(self.logname,'a',encoding='utf-8')
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(self.formatter)
    self.logger.addHandler(fh)

    #创建一个StreamHandler,用于输入到控制台
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    ch.setFormatter(self.formatter)
    self.logger.addHandler(ch)

    if level == 'info':
        self.logger.info(message)
    elif level == 'debug':
        self.logger.debug(message)
    elif level == 'warning':
        self.logger.warning(message)
    elif level == 'error':
        self.logger.error(message)
    #避免日志重复
    self.logger.removeHandler(fh)
    self.logger.removeHandler(ch)
    #关闭打开文件
    fh.close()

def debug(self,message):
    self.__console('debug',message)

def info(self,message):
    self.__console('info',message)

def warning(self,message):
    self.__console('warning',message)

def error(self,message):
    self.__console('error',message)

if name == ‘main’:
log = Log()
log.info(‘测试’)
log.debug(‘测试’)
log.warning(‘测试’)
log.error(‘测试’)


 common/read\_save\_data.py



‘’’
Code description: 读取保存数据
Create time: 2020/12/8
Developer: 叶修
‘’’
import os
import yaml
import getpathinfo
class Read_Save_Date():
def init(self):
path = getpathinfo.get_path()#获取本地路径
self.head_img_path = os.path.join(path,‘data’,‘save_data’)+“/”+‘head_img_path.txt’# head_img_path文件地址
self.order_id_path = os.path.join(path, ‘data’, ‘save_data’) + “/” + ‘order_id.txt’ # order_id.txt文件地址

def get_head_img_path(self):
    # 获取head_img_path
    with open(self.head_img_path, "r", encoding="utf-8")as f:
        return f.read()

def get_order_id(self):
    # 获取order_id
    with open(self.order_id_path, "r", encoding="utf-8")as f:
        return f.read()

if name == ‘main’:
print(Read_Save_Date().get_head_img_path())
print(Read_Save_Date().get_order_id())


 common/read\_yaml.py



‘’’
Code description: 读取yml文件测试数据
Create time: 2020/12/3
Developer: 叶修
‘’’
import os
import yaml
import getpathinfo
class ReadYaml():
def init(self,filename):
path = getpathinfo.get_path()#获取本地路径
self.filepath = os.path.join(path,‘data’,‘test_data’)+“/”+filename#拼接定位到data文件夹

def get_yaml_data(self):
    with open(self.filepath, "r", encoding="utf-8")as f:
        # 调用load方法加载文件流
        return yaml.load(f,Loader=yaml.FullLoader)

if name == ‘main’:
data = ReadYaml(“auth_service.yml”).get_yaml_data()[‘add_or_update_service’]
print(data)


data/


![](https://img-blog.csdnimg.cn/img_convert/44587354054565714c9af09c3e4e755f.png)


 data/test\_data/auth\_service.yml



home_service_list:

  • [{‘result_code’: ‘0’, ‘result_message’: ‘处理成功’}]
    service_info:
  • [‘’,‘’,{‘result_code’: ‘0’, ‘result_message’: ‘处理成功’}]
    add_or_update_service:
  • [[‘1’,‘1’,‘1’,‘1’,‘1’,‘123456’,‘1’,‘测试’,‘1’,‘1’,‘1’,‘1’,‘1’,‘1’],{‘result_code’: ‘0’, ‘result_message’: ‘处理成功’}]
    add_service_price:
  • [‘123456789’,‘10’,‘0’,‘’,‘0’,{‘result_code’: ‘0’, ‘result_message’: ‘处理成功’}]
    apply_service:
  • [‘’,‘’,{‘result_code’: ‘0’, ‘result_message’: ‘处理成功’}]

 logs/


![](https://img-blog.csdnimg.cn/img_convert/a9152519d0ea24306b03b7b15d59b227.png)


 report/


![](https://img-blog.csdnimg.cn/img_convert/a80aee9589e12f9caa28ecf2d04eee93.png)


 getpathinfo.py



‘’’
Code description:配置文件路径
Create time: 2020/12/3
Developer: 叶修
‘’’
import os

def get_path():
# 获取当前路径
curpath = os.path.dirname(os.path.realpath(file))
return curpath

if name == ‘main’:# 执行该文件,测试下是否OK
print(‘测试路径是否OK,路径为:’, get_path())


pytest.ini



#pytest.ini
[pytest]
markers = process
addopts = -p no:warnings
#addopts = -v --reruns 1 --html=./report/report.html --self-contained-html
#addopts = -v --reruns 1 --alluredir ./report/allure_raw
#addopts = -v -s -p no:warnings --reruns 1 --pytest_report ./report/Pytest_Report.html


requirements.txt



allure-pytest2.8.18
allure-python-commons
2.8.18
BeautifulReport0.1.3
beautifulsoup4
4.9.3
ddt1.4.1
Faker
4.18.0
Flask1.1.1
httpie
1.0.3
httplib20.9.2
HttpRunner
1.5.8
py1.9.0
PyMySQL
0.10.1
pytest6.1.1
pytest-base-url
1.4.2
pytest-cov2.10.1
pytest-forked
1.3.0
pytest-html2.1.1
pytest-instafail
0.4.2
pytest-metadata1.10.0
pytest-mock
3.3.1
pywin32228
PyYAML
5.3.1
requests==2.22.0

img
img
img

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

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

需要这份系统化的资料的朋友,可以戳这里获取

1
pywin32228
PyYAML
5.3.1
requests==2.22.0

[外链图片转存中…(img-jAVNbKMp-1715264136166)]
[外链图片转存中…(img-JyzqqTqd-1715264136166)]
[外链图片转存中…(img-H5SzJauN-1715264136167)]

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

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

需要这份系统化的资料的朋友,可以戳这里获取

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值