1.Postman演示加密算法
url = request.url;
// console.log('aaaa',url)
param = url.split("?")[1]
params = param.split("&")
// console.log('bbbb',param)
// console.log('ccc',params)
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];
}
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('dddd',temp_arr)
var sign = temp_arr.join("")
// console.log('eeee',sign);
sign = sign+'3643fe11f2b8484aa1424db0c18364ef'
// console.log('ffff',sign)
pm.environment.set("sign",CryptoJS.MD5(sign).toString())
# 测物流的接口
# pytest unittest 前置条件 获得加密的数据 放在 showapi_sign
from hashlib import md5
import requests
url = 'http://route.showapi.com/64-19'
data = {
'com':'yuantong',
'nu':'YT6493188734653',
'showapi_appid':'1115430',
'showapi_sign': '3643fe11f2b8484aa1424db0c18364ef'
}
s = requests.post(url,data)
print(s.json())
# 键值对 不限于这种写法 加密 规则 项目中 规则 灵活的写 换一个名字也能拼接
# 封装在一个函数里面 要用的时候 直接调用函数
a = 'com'+data['com']+'nu'+data['nu']+'showapi_appid'+data['showapi_appid']
print(a+'3643fe11f2b8484aa1424db0c18364ef')
# 进行md5加密 不可逆 不能进行解密 加盐加密方式 比md5更安全
ret = md5(a.encode(encoding='UTF-8')).hexdigest()
print(ret)
2.接口关联yaml驱动
# httpclient.py
# 专门封装getpost请求方式
import requests
class HttpClient:
# 只要用post,get请求方式 就创建会话
def __init__(self):
self.session = requests.Session()
# 发送请求 请求方式, 接口地址,接口参数类型,接口数据,头部,其他信息
# 判断 你要发送的是请求方式 如果get post
# post请求参数类型 json data
def send_request(self,method,url,param_type=None,data=None,headers = None,**kwargs):
# 请求方式转成大写
method = method.upper()
param_type = param_type.upper()
print(method)
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)
pass
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()
# 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"
#-
# 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:
# test_demo4.py
# 3.把token放在session中
# session:英文 开会 会议
# 编程:一次会话
# 登录--下单--支付 session
# 登录开始 会话开始建立 系统任何操作 session存放了会话过程中任何对象
# 浏览器关闭 session会话就结束了
# 登录进去了 token放在session里面 记录到我了 我在里面做的操作 都会知道是谁做的
# 你在session去访问 访问 登录 session
import allure
import jsonpath
import pytest
import requests
# 1.创建session对象
# 2.设置session的headers属性 token放进去
from class40.httpclient import HttpClient
# 数据都是放在业务代码里面,要提取出来
from class42.base.yamlload import YamlUtil
@allure.feature('接口自动化测试')
class TestCase:
# token = None
httpclient = HttpClient()
openid = None
sjproductid = None
userid = None
sjcartid = None
# 从yaml文件中获取数据传到代码里面 数据从yaml文件中取出来
# 响应 token号会变 响应回来的token号要提取出来 保存在变量中。放在一个地方,都能拿到token
# @allure.story('登录流程')
# @allure.title('登录')
@pytest.mark.parametrize('userdata',YamlUtil('./data/login.yaml').read_yaml())
def test_login(self,userdata):
url = userdata['request']['url']
data = userdata['data']
method = userdata['request']['method']
param_type = userdata['request']['param_type']
exmsg = userdata['exmsg']
# 张三 token 2h
# res = requests.post(url,json=data)
res=TestCase.httpclient(method = method,url = url,param_type=param_type,data=data )
print(res.json())
# 提取token 保存在变量中 类变量 其他方式 2.session中去取 3.返回值 接口关联 要用的数据 提取出来 保存在变量中 类变量中 下个接口要用
sjmsg = jsonpath.jsonpath(res.json(),'$.msg')[0]
token = jsonpath.jsonpath(res.json(),'$.token')[0]
# 把这个token放在session的headers里面 给头部里面设置属性 用update
TestCase.httpclient.session.headers.update({'token':token})
assert exmsg == sjmsg
# 获得个人信息,获得谁的个人信息 拿到token
# 注意添加购物车下单的时候需要用到这里的userid和openid 这个怎么弄
# @allure.story('获得个人信息的流程')
# @allure.title('个人信息')
# 代码是调通 没有返回结果 你有没有取到数据 打印有没有数据
@pytest.mark.parametrize('userdata',YamlUtil('./data/getUserInfo.yaml').read_yaml())
def test_getUserinfo(self,userdata):
url = userdata['request']['url']
# 这个token不能写死 获得登录时的token号
# header = {"token":TestCase.token}
# res = requests.get(url,headers = header)
# session头部里面已经有了token
# res = TestCase.session.get(url)
method = userdata['request']['method']
param_type = userdata['request']['param_type']
exmsg = userdata['exmsg']
res = TestCase.httpclient(url = url,method = method,param_type= param_type)
# 获取所有的结果 userid和openid jsonpath 字典取值 jsonpath(数据,表达式)
TestCase.openid = jsonpath.jsonpath(res.json(),'$..openid')[0]
TestCase.userid = jsonpath.jsonpath(res.json(),'$..userid')[0]
# 出现问题 分析问题 没有取到值 直接报错 刚开始的代码都是调通的 新加的代码 排查问题
print('userid',TestCase.userid)
print('openid',TestCase.openid)
print(res.json())
sjname = jsonpath.jsonpath(res.json(),'$..nikename')[0]
assert exmsg == sjname
# 断言 取得数据 yaml里面的预期结果 可不可以和数据库里面的数据去进行对比
# 发请求之前 写好了链接数据库 调用数据库 查询sql 返回的结果
# # 选择商品 data=str 写法str 表单和json
# @allure.story('购物流程')
# @allure.title('购物')
@pytest.mark.parametrize('userdata',YamlUtil('./data/shopping.yaml').read_yaml())
def test_shopping(self,userdata):
url = userdata['request']['url']
# res = requests.get(url)
method = userdata['request']['method']
param_type = userdata['request']['param_type']
exmsg = userdata['exmsg']
res = TestCase.httpclient(url = url,method = method,param_type= param_type)
print(res.json())
TestCase.sjproductid = jsonpath.jsonpath(res.json(),'$..productid')[0]
assert exmsg == TestCase.sjproductid
# #
# # # 添加购物车 为什么会失败 写法看着没有问题
# # # 信息传入不正确, 值 有问题 请求头 没有问题 没有测试 参数有没有问题 传的值有没有问题
# # # 确定一下 这个值是不是你想要 影响到你的判断 没有关联的代码注释掉
# # # 更好的解决代码 理解这一块步骤 你写的代码是什么意思
# #
# @allure.story('添加购物车流程')
# @allure.title('添加购物车')
# 可不可以把读取userid和openid写入到yaml中,再读取出来
@pytest.mark.parametrize('userdata', YamlUtil('./data/cart.yaml').read_yaml())
def test_cart(self,userdata):
url = userdata['request']['url']
# res = requests.get(url)
method = userdata['request']['method']
param_type = userdata['request']['param_type']
exmsg = userdata['exmsg']
# header = {'token':TestCase.token}
# 参数不能直接写死 userid openid 取userid的值 取openid的值 拿 哪里响应就去哪里拿
# userid和openid拿到值了,还是报错
userdata['data']['openid']=TestCase.openid
userdata['data']['productid']=TestCase.sjproductid
userdata['data']['userid']=TestCase.userid
data = userdata['data']
# res = requests.post(url,json = data,headers = header)
# res = TestCase.session.post(url,json=data)
res = TestCase.httpclient(method = method,url = url,param_type= param_type,data=data)
print(res.json())
#断言 debug用在跳页面的时候 习惯
excartid = userdata['exmsg']
TestCase.sjcartid = jsonpath.jsonpath(res.json(),'$..cartid')[0]
print(TestCase.sjcartid)
assert excartid == TestCase.sjcartid
# #
# #
# @allure.story('下单流程')
# @allure.title('下单')
@pytest.mark.parametrize('userdata', YamlUtil('./data/order.yaml').read_yaml())
def test_order(self,userdata):
url = userdata['request']['url']
# res = requests.get(url)
method = userdata['request']['method']
param_type = userdata['request']['param_type']
# header = {'token':TestCase.token}
# 参数不能直接写死 userid openid 取userid的值 取openid的值 拿 哪里响应就去哪里拿
# userid和openid拿到值了,还是报错
userdata['data']['cartid'] = TestCase.sjcartid
userdata['data']['openid'] = TestCase.openid
userdata['data']['productid'] = TestCase.sjproductid
userdata['data']['userid'] = TestCase.userid
data = userdata['data']
# res = requests.post(url,json=data,headers = header)
# res = TestCase.session.post(url,json=data)
res = TestCase.httpclient(method = method,url = url,param_type=param_type,data=data)
print(res.json())
if __name__ == '__main__':
pytest.main(['-sv','test_demo4.py'])
# 流程 改变的地方
# get post 一种方式 又能接受get又能接受post请求 封装请求方式