《一》加密算法
(1)为什么要用加密算法
加密:加密针对重要的数据进行传输很重要,预防窃取数据,以明文的方式加密成密文的数据
解密:加密的数据还原成明文数据
(2)常见加密算法三大类
非对称加密算法:rsa
对称加密算法:aes
常见的hash算法:md5 加盐
《二》非对称加密算法
(1)rsa(应用比较广泛),顾名思义:不对称,有两把钥匙(双钥),一把公开公匙,一把保密私钥,公钥和私钥可以互相加密解密
(2)应用场景和优缺点
应用场景
两个用户(A用户和B用户)进行传递数据,B用户会生成:公钥给A,私钥给B
A用户和B用户传递消息的时候,A用户公钥对消息进行加密,再把消息传给B用户,B用户针对消息用私钥解密数据
优点:数据被他人获取了没有关系,没有私钥没有办法对消息进行解密
缺点:C用冒充了B用户,不确认这个消息到底是不是A用户发的,解决方案:用到签名
(3)加密签名
加密:传输数据时对数据的保护
签名:用来确认身份的
签名的流程
A用户为了区分自己的身份,自己发送消息的时候标记一下自己身份,如何标记身份?A用户也可以生成公钥和私钥,A用户通过私钥生成签名,B用户用公钥确认是不是本人。A用户将加密数据和签名一起发给B用户,B用户用私钥进行解密数据。(若数据被别人窃取了,没有关系,没有B的私钥无法对消息进行解密,就算获取了A用户的公钥,想要伪造信息,没有A的私钥,也无法进行签名)
过程的执行
测试物流
签名:加密的方式(根据需求和场景),测试针对数据进行加密数据,并不是对所有数据进行加密,而是开发规定了哪些数据需要加密?测试根据这些数据进行加密。加密方式也是根据开发提供的加密规则进行加密。
加密:不是一个固定的流程,根据实际情况来
(4)demo01.py
'''
测试物流的接口
1.若在pytest或unittest框架中,前置条件写data参数信息
2.获得加密的数据,放在showapi_sign里面
'''
from hashlib import md5
import requests
url='http://route.showapi.com/64-34'
data={
'com': 'yuantong',
'nu': 'YT6493188734653',
'showapi_appid': '1033673',
'showapi_sign': '66bde00e7f8ebd9a934e0817dde15f66',
}
s = requests.post(url, data)
print(s.json())
# 键值对的方式进行拼接(不限于这种写法)
# 但是规则最好需要遵循:灵活的写,即换一个名字也能进行拼接
# 策略:封装在一个函数里面,要用的时候,直接调用函数(reduce逻辑比较麻烦)
a = 'com'+data['com']+'nu'+data['nu']+'showapi_appid'+data['showapi_appid']
# com+nu+showapi_appid+showapi_sign:进行拼接
# print(a+'66bde00e7f8ebd9a934e0817dde15f66')
print(a)
# 进行MD5加密,不可逆,不能进行解密。加密加盐的方式比MD5加密安全
ret = md5(a.encode(encoding='UTF-8')).hexdigest()
print(ret)
(5)postman
Params
'com': 'yuantong',
'nu': 'YT6493188734653',
'showapi_appid': '1033673',
'showapi_sign':'66bde00e7f8ebd9a934e0817dde15f66',
Pre-request Script
// 前置条件 发送请求之前要做的事情 就写在前置条件里面
// 通过代码表述规则 安装规则去写加密方式
var url = request.url
// 获取接口地址
// console.log('aaaaa',url)
// 以?进行分割字符
param = url.split("?")[1]
// console.log('bbbbb',para)
// 以& 进行分割字符
params = param.split('&')
// console.log('ccccc',paras)
// 等于也是需要去掉 循环列表的键、循环列表的值
var keys = new Array(params.length);
var values = new Array(params.length);
for(var i=0; i<params.length; i++)
{
keys[i] = params[i].split('=')[0];
values[i] = params[i].split('=')[1];
}
// 取出来就行拼接,键值需要进行拼接,如果碰到sing则跳过,再进行拼接
temp_arr = []
for(var p=0;p<keys.length;p++)
{
if(keys[p]=='showapi_sign')
{
continue;
}
temp_arr.push(keys[p]+values[p])
}
// console.log('wwwww',temp_arr)
// 列表值也要拼接在一起
var sign = temp_arr.join("")
// console.log('bbbbb',sign)
sign=sign+'6d4a4cd45d63490cad71d4afde685242'
// console.log('vvvvv',sign)
// md5加密 加密后的数据放在环境变量中去
pm.environment.set("sign", CryptoJS.MD5(sign).toString());
// 加密方法 通过代码 按照规则生成你最终加密的字符 要用的时候 才去调用
《三》对称加密算法
(1)加密和解密都是用的同一个密钥
(2)A用户和B用户 想要传输数据:用户A发送文本密钥给用户B,用户B拿到密钥文本,用商定好的密钥去进行解密
(3)缺点:若密码暴露了,就不安全了
《四》常见的hash算法
(1)常见的hash算法:md5、sha-1、sha-224
《五》加密解密总结
加密和解密:根据需求场景、开发文档的加密规则和解密规则分别进行加密和解密
《六》接口关联+yaml+excel
base
httpclient.py
# 专门封装getpost请求方式
import requests
class HttpClient:
# 只要用post,get请求方式 就创建会话
def __init__(self):
self.session=requests.Session()
# 发送请求 请求方式,接口地址 ,接口参数类型,接口数据,头部信息,q其他的信息
# 判断 你要发送的是请求方式 如果get post
# post请求参数类型 json data
def send_request(self,method,url,param_type=None,data=None,headers=None,**kwargs):
# 请求方式转成大写
method=method.upper()
# print(method)
param_type=param_type.upper()
if method=='GET':
response=self.session.request(method=method,url=url,params=data,**kwargs)
elif method=='POST':
if param_type=='FORM':
response=self.session.request(method=method,url=url,data=data,**kwargs)
else:
response=self.session.request(method=method,url=url,json=data,**kwargs)
elif method=='DELETE':
if param_type == 'FORM':
response = self.session.request(method=method, url=url, data=data, **kwargs)
else:
response = self.session.request(method=method, url=url, json=data, **kwargs)
elif method=='PUT':
if param_type == 'FORM':
response = self.session.request(method=method, url=url, data=data, **kwargs)
else:
response = self.session.request(method=method, url=url, json=data, **kwargs)
else:
raise ValueError
return response
# 魔法方法 send_request 实例化类.方法
# 实例化类 HttpClient().send_request()
# a=HttpClient()
def __call__(self, method,url,param_type,data=None,headers=None,**kwargs):
return self.send_request(method,url,param_type,data,headers=None,**kwargs)
def close_session(self):
self.session.close()
yamlload.py
import yaml
class YamlUtil:
def __init__(self,yaml_file):
self.yaml_file=yaml_file
def read_yaml(self):
with open(self.yaml_file,encoding='utf-8') as f:
value = yaml.load(f,Loader=yaml.FullLoader)
print(value)
return value
if __name__ == '__main__':
YamlUtil('../data/login.yaml').read_yaml()
data
login.yaml
-
title: 登录接口
request:
method: post
url: http://39.98.138.157:5000/api/login
param_type: json
data:
"password": "123456"
"username": "admin"
exmsg: "success"
getUserInfo.yaml
-
title: 获取个人信息
request:
method: get
url: http://39.98.138.157:5000/api/getuserinfo
param_type: json
exmsg: "风清扬"
shopping.yaml
-
title: 选择商品
request:
method: get
url: http://39.98.138.157:5000/api/getproductinfo?productid=8888
param_type: json
exmsg: 8888
cart.yaml
-
title: 添加购物车
request:
method: post
url: http://39.98.138.157:5000/api/addcart
param_type: json
data:
openid:
productid:
userid:
exmsg: 45233
order.yaml
-
title: 下单
request:
method: post
url: http://39.98.138.157:5000/api/createorder
param_type: json
data:
cartid:
openid:
productid:
userid:
exmsg: 17890
test_py4.py
'''
结合httpclient.py的应用:
1.TestCase类:
注释: session = requests.session()
加此行: httpclient = HttpClient()
2.test_login测试方法中:
注释: res=TestCase.session.post(url,json=data)
加此行: res=TestCase.httpclient(method='post',url=url,param_type='json',data=data)
注释: TestCase.session.headers.update({'token':token})
加此行: TestCase.httpclient.session.headers.update({'token':token})
3.test_getUserinfo测试方法中:
注释: res = TestCase.session.get(url)
加此行: res = TestCase.httpclient(method='get', url=url, param_type='json')
4.test_shopping测试方法中:
注释: res=requests.get(url)
加此行: res=TestCase.httpclient(method='get', url=url, param_type='json')
5.test_cart测试方法中:
注释: url = 'http://39.98.138.157:5000/api/addcart'
加此行: data = {"openid": TestCase.openid,"productid": TestCase.productid,"userid": TestCase.userid}
6.test_order测试方法中:
注释: res=TestCase.session.post(url,json=data)
加此行: res = TestCase.httpclient(method='post', url=url, param_type='json', data=data)
'''
import allure
import jsonpath
import pytest
import requests
from test013.httpclient import HttpClient
# 数据都是放在业务代码里面,数据提取出来
from test015.base.yamlload import YamlUtil
@allure.feature('接口自动化测试')
class TestCase:
# 定义类的变量
# session = requests.session()
httpclient = HttpClient()
openid=None
productid=None
userid=None
cartid=None
# 从yaml文件中获取数据传到代码里面 数据从yaml文件中取出来
# @allure.story('登录流程')
# @allure.title('登录')
@pytest.mark.parametrize('userdata', YamlUtil('./data/login.yaml').read_yaml())
def test_login(self,userdata):
# url='http://39.98.138.157:5000/api/login'
url = userdata['request']['url']
# data={"password": "123456","username": "admin"}
data = userdata['data']
method = userdata['request']['method']
param_type = userdata['request']['param_type']
exmsg = userdata['exmsg']
# res=requests.post(url,json=data)
# res=TestCase.session.post(url,json=data)
res=TestCase.httpclient(method=method,url=url,param_type=param_type,data=data)
print(res.json())
# 提取token 保存在变量中了
token=jsonpath.jsonpath(res.json(), '$..token')[0]
# 把这个token放在session中的headers里面,给头部里面设置属性,用update
# TestCase.session.headers.update({'token':token})
TestCase.httpclient.session.headers.update({'token':token})
sjmsg=jsonpath.jsonpath(res.json(),'$..msg')[0]
assert exmsg==sjmsg
# 获取个人信息
# @allure.story('获得个人信息流程')
# @allure.title('个人信息')
@pytest.mark.parametrize('userdata', YamlUtil('./data/getUserInfo.yaml').read_yaml())
def test_getUserinfo(self,userdata):
# url = 'http://39.98.138.157:5000/api/getuserinfo'
url = userdata['request']['url']
method = userdata['request']['method']
param_type = userdata['request']['param_type']
exmsg = userdata['exmsg']
# 这个token不能写死 获得登录时的token
# header={"token":TestCase.token}
# res=requests.get(url,headers=header)
# res = TestCase.session.get(url)
res = TestCase.httpclient(method=method, url=url, param_type=param_type)
# 获取所有的结果
print(res.json())
TestCase.openid = jsonpath.jsonpath(res.json(), '$..openid')[0]
TestCase.userid = jsonpath.jsonpath(res.json(), '$..userid')[0]
print('openid:',TestCase.openid)
print('userid:',TestCase.userid)
sjname=jsonpath.jsonpath(res.json(),'$..nikename')[0]
assert exmsg==sjname
# 选择商品
# @allure.story('选择商品流程')
# @allure.title('商品')
@pytest.mark.parametrize('userdata', YamlUtil('./data/shopping.yaml').read_yaml())
def test_shopping(self,userdata):
# url ='http://39.98.138.157:5000/api/getproductinfo?productid=8888'
url = userdata['request']['url']
method = userdata['request']['method']
param_type = userdata['request']['param_type']
exmsg = userdata['exmsg']
# res=requests.get(url)
res=TestCase.httpclient(method=method, url=url, param_type=param_type)
print(res.json())
# 取 productid 的值
TestCase.productid = jsonpath.jsonpath(res.json(), '$..productid')[0]
sjproductid=jsonpath.jsonpath(res.json(),'$..productid')[0]
assert exmsg==sjproductid
# 商品添加到购物车
# @allure.story('添加购物车流程')
# @allure.title('购物车')
@pytest.mark.parametrize('userdata', YamlUtil('./data/cart.yaml').read_yaml())
def test_cart(self,userdata):
# url = 'http://39.98.138.157:5000/api/addcart'
url = userdata['request']['url']
method = userdata['request']['method']
param_type = userdata['request']['param_type']
exmsg = userdata['exmsg']
userdata['data']['openid'] =TestCase.openid
userdata['data']['productid'] =TestCase.productid
userdata['data']['userid'] =TestCase.userid
data = userdata['data']
# data = {"openid": TestCase.openid,"productid": TestCase.productid,"userid": TestCase.userid}
# res=TestCase.session.post(url,json=data)
res=TestCase.httpclient(method=method, url=url, param_type=param_type, data=data)
print(res.json())
# 取 cartid 的值
TestCase.cartid = jsonpath.jsonpath(res.json(), '$..cartid')[0]
# 断言
# exmsg = 45233
sjmsg = jsonpath.jsonpath(res.json(),'$..cartid')[0]
assert exmsg == sjmsg
# 提交订单
# @allure.story('下单流程')
# @allure.title('下单')
@pytest.mark.parametrize('userdata', YamlUtil('./data/order.yaml').read_yaml())
def test_order(self,userdata):
# url = 'http://39.98.138.157:5000/api/createorder'
url = userdata['request']['url']
method = userdata['request']['method']
param_type = userdata['request']['param_type']
exmsg = userdata['exmsg']
userdata['data']['cartid'] = TestCase.cartid
userdata['data']['openid'] = TestCase.openid
userdata['data']['productid'] = TestCase.productid
userdata['data']['userid'] = TestCase.userid
data = userdata['data']
# data = {"cartid": TestCase.cartid, "openid": TestCase.openid, "productid": TestCase.productid, "userid": TestCase.userid}
# res=TestCase.session.post(url,json=data)
res = TestCase.httpclient(method=method, url=url, param_type=param_type, data=data)
print(res.json())
# 断言
# usermsg = 17890
sjmsg = jsonpath.jsonpath(res.json(), '$..userid')[0]
assert exmsg == sjmsg
if __name__ == '__main__':
pytest.main(['-vs','test_py4.py'])
pytest.main(['-v','test_py4.py'])
人生苦短,及时行乐
分类:
测码教育 / 课后作业
, 测码教育 / 课堂代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现