一、日志
日志的作用?
记录程序运行的步骤和错误
日志的场景
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:记录运行错误
日志底层组成介绍
说明:logging底层库有4大组件(日志器、处理器、格式器、过滤器)
1、日志器:接受日志信息,设置日志显示级别
2、处理器:控制日志显示位置或文件
3、格式器:控制日志输出的显示样式
关系:
格式器必须关联处理器
处理器必须关联日志器
日志封装应用
重组封装的目的:解决日志显示的样式、储存方式
import logging.handlers #日志工具 class GetLog: @classmethod def get_log(cls): cls.log = None if cls.log is None: #1、获取日志器 cls.log = logging.getLogger() #设置日志级别 info cls.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
应用
应用的级别:info、eeror
info:info记录程序运行的步骤
error:记录程序错误
标注地方:api和scrpit
api层:记录程序步骤
scrpit:记录程序执行结果、断言结果、错误原因
# 1、获取图片验证码接口 测试 @parameterized.expand(read_json("register_login.json","img_code")) def test01_img_code(self,random,expect_code): try: # 1、调用图片验证码接口 r = self.reg.api_img_code(random) log.info("执行图片验证码响应状态码为:{}".format(r.status_code)) # 2、查看响应验证码 self.assertEqual(expect_code, r.status_code) log.info("执行图片验证码断言通过") except Exception as e: # 1、日志 log.error("断言失败,原因:{}",format(e)) # 2、抛异常 raise
二、认证开户
2.1封装(api_approve_trust.py)
from config import HOST class ApiApproveTrust: #初始化 def __init__(self,session): #获取session对象 self.session = session #认证url self.__url_approve = HOST + "/member/realname/approverealname" #查询认证状态url self.__url_approve_status = HOST + "/member/member/getapprove" #开户url self.__url_trust = HOST + "/trust/trust/register" #图片验证码url self.__url_img_code = HOST + "/common/public/verifycode/{}" #充值url self.__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_cdoe(self): pass #5、充值接口 封装 def api_recharge(self): pass 难点:认证接口请求参数类型为:multipart/form-data多消息类型,如何实现? 解决:请求使用data+files两种参数格式,消息会自动切换到multipart即可 示例:self.session.post(url=self.__url_approve,data=data,files={"x":"y"}) 2.2调用(test02_approve_trust.py) 结构 import unittest import requests from api.api_approve_trust import ApiApproveTrust from api.api_reqister_login import ApiRegisterLogin class TestApproveTrust(unittest.TestCase): #初始化 def setUp(self) -> None: #1、获取session self.session = requests.session() #2、获取ApiApproveTrust对象 self.approve = ApiApproveTrust(self.session) #3、调用登录成功 ApiRegisterLogin(self.session).api_login() #结束 def tearDown(self) -> None: self.session.close() #1、认证接口 测试 def test01_approve(self): pass
实现
import unittest import requests from api import log from api.api_approve_trust import ApiApproveTrust from api.api_reqister_login import ApiRegisterLogin class TestApproveTrust(unittest.TestCase): # 初始化 def setUp(self) -> None: # 1、获取session self.session = requests.session() # 2、获取ApiApproveTrust对象 self.approve = ApiApproveTrust(self.session) # 3、调用登录成功 ApiRegisterLogin(self.session).api_login() # 结束 def tearDown(self) -> None: self.session.close() # 1、认证接口 测试 def test01_approve(self): try: # 调用认证接口 r = self.approve.api_approve() log.info("接口执行为".format(r.text)) # 断言 self.assertIn("提交成功", r.text) log.info("断言通过!") except Exception as e: #日志 log.error("断言错误!原因{}".format(e)) #抛异常 raise # 2、查询认证状态接口 测试 def test02_approve_status(self): try: # 调用认证状态接口 r = self.approve.api_approve_status() log.info("接口执行为".format(r.text)) # 断言 self.assertIn("华", r.text) log.info("断言通过!") except Exception as e: # 日志 log.error("断言错误!原因{}".format(e)) # 抛异常 raise # 3、开户接口 测试 def test03_trust(self): try: # 调用认证接口 r = self.approve.api_trust() log.info("接口执行结果为:{}".format(r.text)) # 断言 self.assertIn("form", r.text) print("请求后台开户结果为:", r.json()) log.info("断言通过!") #三方开户 except Exception as e: # 日志 log.error("断言错误!原因{}".format(e)) # 抛异常 raise # 4、获取图片验证码接口 测试 def test04_img_code(self,random=123): try: # 调用接口 r = self.approve.api_img_code(random) log.info("接口执行为:{}".format(r.status_code)) # 断言 self.assertEqual(200, r.status_code) log.info("断言通过!") except Exception as e: # 日志 log.error("断言错误!原因{}".format(e)) # 抛异常 raise # 5、充值接口 测试 def test05_recharge(self,valicode=8888): try: #调用图片验证码 self.approve.api_img_code(1231123) # 调用接口 r = self.approve.api_recharge(valicode) log.info("接口执行为:{}".format(r.json())) print("请求后台充值结果为:{}".format(r.json)) # 断言 self.assertIn("form", r.text) log.info("断言通过!") #三方充值 except Exception as e: # 日志 log.error("断言错误!原因{}".format(e)) # 抛异常 raise
问题:
三方开户、三方充值如何操作?-- 从响应数据中提取input标签name属性值和value属性,在Python中如何提取?
扩展
BeautifulSoup
学习目标
1、掌握如何使用BeautifulSoup解析HTML文档
安装BeautifulSoup:
要安装beautifulsoup4
,你可以使用pip(Python的包安装器)来执行安装命令。在命令行或终端中,你可以输入以下命令:
pip install beautifulsoup4 |
这将会从Python包索引(PyPI)下载并安装beautifulsoup4
包。如果你正在使用Python 3(这是大多数现代系统上的默认情况),并且你的系统中同时安装了Python 2和Python 3,你可能需要使用pip3
而不是pip
来确保为正确的Python版本安装包:
pip3 install beautifulsoup4 |
此外,如果你在使用虚拟环境(推荐做法,因为它可以避免包之间的冲突),请确保你的虚拟环境已经激活,然后再运行上述命令。
如何使用BeautifulSoup:
BeautifulSoup的基本用法:
2.3BeautifulSoup库
说明:一个python中解析html/xml的三方库
安装:pip install beautifulsoup4
应用步骤:
1、导包
2、实例化
3、调用方法
实例:
#1、导包 from bs4 import BeautifulSoup html = """ <html> <head> <title>曾志伟</title> </head> <body> <p id="test01">软件测试</p> <p id="test02">2024年</p> <a href="/api.html">接口测试</a> <a href="/web.html">Web自动化测试</a> <a href="/app.html">APP自动化测试</a> </body> </html> """ #2、获取ba对象 告诉BeautifulSoup类,你要解析的是html格式 bs = BeautifulSoup(html,"html.parser") #3、调用方法 重点: # 1、查找所有标签 bs.find_all("标签名") == 元素的集合 == ["元素1","元素2"] # 2、查找属性 元素.get("属性名") for a in bs.find_all("a"): print(a.get("href"))
重点:
1、查找所有标签 bs.find_all("标签名") == 元素的集合 == ["元素1","元素2"]
2、查找属性 元素.get("属性名")
扩展其他方法:
#4、扩展其他方法 #获取单个元素 bs.标签名 print(bs.a) #获取文本 print(bs.a.string) #获取属性 print(bs.a.get("href")) #获取标签名 print(bs.a.name)