金融项目实战 06|Python实现接口自动化——日志、实名认证和开户接口
目录
一、日志封装及应用(理解)
🔴日志的作用:
- 记录程序运行的步骤和错误。
🔴日志的场景:
- 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:
@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
# 下面只是测试上面的工具能不能用的,如果运行成功,则会在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会自动记录cookie
self.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 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_code(self, random):
pass
# 5、充值接口封装
def api_recharge(self,valicode):
pass
②实现
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):
# 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目录
①结构
import unittest
import requests
from api.api_register_login import ApiRegisterLogin
class TestApproveTrust(unittest.TestCase):
# 初始化
def setUp(self) -> None:
#1、获取session对象
self.session = requests.Session()
#2、实例化ApiRegisterLogin类方法
self.approve = ApiRegisterLogin(self.session)
#3、调用登录接口
ApiRegisterLogin(self.session).api_login()
# 结束
def tearDown(self) -> None:
self.session.close()
#1、认证接口 测试
def test01_approve(self):
pass
#2、查询认证状态接口 测试
def test02_approve_status(self):
pass
#3、开户接口 测试
def test03_trust(self):
pass
#4、获取图片验证码接口 测试
def test04_img_code(self):
pass
#5、充值接口 测试
def test05_recharge(self):
pass
②实现
请求第三方开户接口 和 请求第三方充值接口 的代码需要后文的BeautifulSoup库知识。
import unittest
import requests
from api import log
from api.api_approve_trust import ApiApproveTrust
from api.api_register_login import ApiRegisterLogin
from util import parser_html
class TestApproveTrust(unittest.TestCase):
# 初始化
def setUp(self) -> None:
#1、获取session对象
self.session = requests.Session()
#2、实例化ApiRegisterLogin类方法
self.approve = ApiApproveTrust(self.session)
#3、调用登录接口
ApiRegisterLogin(self.session).api_login()
# 结束
def tearDown(self) -> None:
r = self.session.close()
#1、认证接口 测试
# 认证接口不需要参数化的原因是:只有一个可测的用例,其他两个测试用例是bug,不适合拿来做实战
def test01_approve(self,expect_test="提交成功"):
try:
r = self.approve.api_approve()
# print(r.json())
log.info("正在执行认证接口响应结果为:{}".format(r.text))
self.assertIn(expect_test,r.text)
log.info("认证接口断言成功!")
except Exception as err:
# 日志
log.error("断言失败,原因:{}".format(err))
# 抛异常
raise
#2、查询认证状态接口 测试
# 不需要参数化的原因是:只有一个可测的用例,
def test02_approve_status(self,expect_test="华"):
try:
r = self.approve.api_approve_status()
# print(r.json())
log.info("正在执行查询认证状态接口响应结果为:{}".format(r.text))
self.assertIn(expect_test, r.text)
log.info("查询认证状态接口断言成功!")
except Exception as err:
# 日志
log.error("断言失败,原因:{}".format(err))
# 抛异常
raise
#3、开户接口 测试
def test03_trust(self,expect_test="form"):
try:
# 1、请求后台开户接口
r = self.approve.api_trust()
# print(r.json())
log.info("正在执行开户接口响应结果为:{}".format(r.json()))
self.assertIn(expect_test, r.text)
log.info("认证开户断言成功!")
# 2、请求第三方开户接口
result = parser_html(r) # 结果为:(’http://xxxx‘,‘{'xxx':'xxx'},……’)
r = self.session.post(url=result[0],data=result[1])
# print(r.text) # 结果为:UserRegister OK
self.assertIn("OK",r.text)
log.info("请求第三方开户断言成功!")
except Exception as err:
# 日志
log.error("断言失败,原因:{}".format(err))
# 抛异常
raise
#4、获取图片验证码接口 测试
def test04_img_code(self,random=123):
try:
r = self.approve.api_img_code(random)
# print(r.status_code)
log.info("正在执行获取图片验证码接口响应结果为:{}".format(r.status_code))
self.assertEqual(200, r.status_code)
log.info("断言获取图片验证码接口成功!")
except Exception as err:
# 日志
log.error("断言失败,原因:{}".format(err))
# 抛异常
raise
#5、充值接口 测试
def test05_recharge(self,valicode=8888):
try:
# 1、调用图片验证码接口
self.approve.api_img_code(123)
# 2、充值接口
r = self.approve.api_recharge(valicode)
# print("充值接口响应结果:",r.text)
log.info("正在执行充值接口响应结果为:{}".format(r.json()))
# # 断言
self.assertIn("form", r.text)
log.info("断言充值接口成功!")
# 3、三方充值
result = parser_html(r) # 结果为:(’http://xxxx‘,‘{'xxx':'xxx'},……’)
r = self.session.post(url=result[0], data=result[1])
self.assertIn("OK", r.text)
log.info("请求第三方充值断言成功!")
except Exception as err:
# 日志
log.error("断言失败,原因:{}".format(err))
# 抛异常
raise
2、BeautifulSoup库
1️⃣简介及例子
说明:⼀个python解析html/xml的三方库
安装: pip install beautifulsoup4 -i https://mirrors.tuna.tsinghua.edu.cn/
基本用法:
应用步骤:
- 1、导包
- 2、实例化
- 3、调用方法
例子:
重点:
1、查找所有标签 bs.find_all("标签名") == 元素的集合 == ["元素1","元素2"]
2、查找属性 元素.get("属性名")
其他方法:
2️⃣提取html数据工具封装
①思路:
②实现
在工具类py文件末尾添加下面的封装方法
from bs4 import BeautifulSoup
def parser_html(result):
# 1、提取html
html = result.json().get("description").get("form")
# 2、获取bs对象
bs = BeautifulSoup(html,"html.parser")
# 3、提取url
url = bs.form.get("action")
data = {}
# 4、查找所有的input标签
for input in bs.find_all("input"):
data[input.get("name")]=input.get("value")
return url, data
使用BeautifulSoup库后就可以实现三方开户和三方充值了,代码已经在前文2️⃣script目录展示过。
原文地址:https://blog.csdn.net/cmgdxrz/article/details/145146901
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!