一、日志封装及应用(理解)
🔴日志的作用:
- 记录程序运行的步骤和错误。
🔴日志的场景:
- 1、调试bug
- 2、查看程序运行轨迹
🔴日志基本应用:
# 1、导包
import logging
# 2、调用日志⼊口
logging.error("出错啦,错误原因:{}".format(e))
import logging
# 设置日志级别 及保存⽂件名
logging.basicConfig(level=logging.DEBUG, filename="../log/p2p.log")
# 调用日志
logging.debug("调试信息")
logging.info("信息级别")
logging.warning("警告")
logging.error("断⾔错误!")
logging.critical("严重错误")
🔴测试人员使用的日志的入口:
- info:记录运行步骤
- error:记录运行错误
🔴日志底层组成介绍:了解底层是为了修改log打印出的信息进行美化封装
- 说明:logging库底层有4大组件(日志器、处理器、格式器、过滤器)
- 1、日志器:接受日志信息,设置日志显示级别
- 2、处理器:控制日志显示位置或文件
- 3、格式器:控制日志输出的显示样式
- 关系:
- 格式器必须关联处理器
- 处理器必须关联日志器
🔴日志封装应用:
重组封装的目的:解决日志显示的样式、存储方式
①日志工具的封装
在util.py中添加日志工具的封装:
下面这个日志工具类可以当模板用,最多改一下保存日志的.log文件名称
import logging.handlers# 日志工具
class GetLog:@classmethoddef get_log(cls):cls.log = Noneif cls.log is None:# 1、获取日志器cls.log = logging.getLogger()# 设置日志级别 infocls.log.setLevel(logging.INFO)filepath = DIR_PATH + os.sep + "log" + os.sep + "p2p.log"# 2、获取处理器 TimedRotatingFileHandler:日志保存到文件且根据时间去分割tf = logging.handlers.TimedRotatingFileHandler(filename=filepath,when="midnight",interval=1,backupCount=3,encoding="utf-8")# 3、获取格式器fmt = "%(asctime)s %(levelname)s [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s"fm = logging.Formatter(fmt)# 4、将格式器添加到处理器中tf.setFormatter(fm)# 5、将处理器添加到日志器中cls.log.addHandler(tf)# 返回日志器return cls.log# 下面只是测试上面的工具能不能用的,如果运行成功,则会在log目录下产生p2p.log
# p2p.log文件内容类似为:2025-01-14 22:30:41,013 INFO [util.py(<module>:50)] - 信息级别测试
if __name__ == '__main__':GetLog.get_log().info("信息级别测试")
②工具使用
应用的级别:info、error
- info:i记录程序运行的步骤
- error:记录程序错误
标注地方:api和script
api层:记录程序步骤
script:记录程序执行结果、断言结果、错误原因
可以在api和script中每个方法中标注log,下面仅为示例:
# script目录中文件标注的示例
#2、获取短信验证码接口 测试@parameterized.expand(read_json("register_login.json", "phone_code"))def test02_phone_code(self,phone,imgVerifyCode,expec_text):try:# 1、调用获取图片验证码接口 -- 目的:让session对象记录cookie# 调用接口后session会自动记录cookieself.reg.api_img_code(234)# 2、调用短信验证码接口r = self.reg.api_phone_code(phone=phone,imgVerifyCode=imgVerifyCode)# 3、查看响应结果log.info("执行接口结果为:{}".format(r.text))self.assertIn(expec_text,r.text) # 使用text提取结果是更方便,json还要根据键找值log.info("执行断言通过!")except Exception as err:# 日志# print(err)log.error("断言失败,原因:{}".format(err))# 抛异常raise
# api目录中的示例
# 2、获取短信验证码接⼝ 封装def api_phone_code(self,phone,imgVerifyCode):data = {"phone": phone,"imgVerifyCode": imgVerifyCode,"type": "reg"}log.info("正在调用获取短信验证码接口,请求方法:{}, 请求url:{} 请求参数:{}".format("post", self.__url_phone_code,data))return self.session.post(url=self.__url_phone_code,data=data)
二、认证开户接口脚本编写
1、代码编写
1️⃣api目录
①结构
from config import HOSTclass ApiApproveTrust:# 初始化def __init__(self, session):# 获取session对象self.session = session# 认证urlself.__url_approve = HOST + "/member/realname/approverealname"# 查询认证状态urlself.__url_approve_status = HOST + "/member/member/getapprove"# 开户urlself.__url_trust = HOST + "/trust/trust/register"# 图片验证码urlself.__url_img_code = HOST + "/common/public/verifycode/{}"# 充值urlself.__url_recharge = HOST + "/trust/trust/recharge"# 1、认证接口 封装def api_approve(self):pass# 2、查询认证状态接口 封装def api_approve_status(self):pass# 3、开户接口 封装def api_trust(self):pass# 4、获取图片验证码接口 封装def api_img_code(self, random):pass# 5、充值接口封装def api_recharge(self,valicode):pass
②实现
from config import HOSTclass ApiApproveTrust:# 初始化def __init__(self, session):# 获取session对象self.session = session# 认证urlself.__url_approve = HOST + "/member/realname/approverealname"# 查询认证状态urlself.__url_approve_status = HOST + "/member/member/getapprove"# 开户urlself.__url_trust = HOST + "/trust/trust/register"# 图片验证码urlself.__url_img_code = HOST + "/common/public/verifycode/{}"# 充值urlself.__url_recharge = HOST + "/trust/trust/recharge"# 1、认证接口 封装def api_approve(self):# 1、请求参数data = {"realname":"华仔","card_id":"350102199003072237"}# 2、调用请求方法 难题:multipart/form-data使用:data+files来实现多消息体类型return self.session.post(url=self.__url_approve, data=data, files={"x": "y"})# 2、查询认证状态接口 封装def api_approve_status(self):return self.session.post(url=self.__url_approve_status)# 3、开户接口 封装def api_trust(self):return self.session.post(url=self.__url_trust)# 4、获取图片验证码接口 封装def api_img_code(self, random):return self.session.get(url=self.__url_img_code.format(random))# 5、充值接口封装def api_recharge(self,valicode):# 1、请求参数data = {"paymentType": "chinapnrTrust","amount": "1000","formStr":"reForm","valicode":valicode}# 2、调用请求方法return self.session.post(url=self.__url_recharge, data=data)
难点:认证接口请求参数类型为:multipart/form-data多消息类型,如何实现?
- 解决:请求使用data+files两种参数格式,消息头会自动切换到multipart即可。
- 示例:self.session.post(url=self.__url_approve, data=data, files={"x": "y"})
- files={"x": "y"}只是起到占位作用,表明有文件而已。
2️⃣script目录
①结构
②实现