commit jenkins use
This commit is contained in:
parent
636dde853b
commit
52aef26038
|
@ -10,4 +10,5 @@ downloadFiles.py -- 关于请求内容获取和文件下载
|
||||||
|
|
||||||
安装:pip install jsonpath
|
安装:pip install jsonpath
|
||||||
jsonpathPractice.py ---请求返回数据的提取:jsonpath模块
|
jsonpathPractice.py ---请求返回数据的提取:jsonpath模块
|
||||||
login_recharge.py ---登录充值案例演示
|
login_recharge.py ---登录充值案例演示
|
||||||
|
requestsRequest.py ---直接使用request方法定义请求的类型
|
|
@ -11,30 +11,29 @@ Time: 2020/3/21 9:58
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
# ----------------------------------post------------------------------------------------------
|
# ----------------------------------post------------------------------------------------------
|
||||||
# url = 'http://httpbin.org/post'
|
url = 'http://httpbin.org/post'
|
||||||
#
|
|
||||||
# data = {
|
|
||||||
# 'mobile_phone': '18774970056',
|
|
||||||
# 'pwd': '12345678'
|
|
||||||
# }
|
|
||||||
|
|
||||||
# 参数类型为 "Content-Type": "application/json", 发送请求的时候使用json来传递参数
|
data = {
|
||||||
# response = requests.post(url=url, json=data)
|
'mobile_phone': '18774970056',
|
||||||
|
'pwd': '12345678'
|
||||||
|
}
|
||||||
|
|
||||||
# 参数类型为"Content-Type": "application/x-www-form-urlencoded", 发送请求时使用data来传递参数
|
#参数类型为 "Content-Type": "application/json", 发送请求的时候使用json来传递参数
|
||||||
# response = requests.post(url=url, data=data)
|
response1 = requests.post(url=url, json=data)
|
||||||
|
|
||||||
|
#参数类型为"Content-Type": "application/x-www-form-urlencoded", 发送请求时使用data来传递参数
|
||||||
|
response2 = requests.post(url=url, data=data)
|
||||||
|
|
||||||
|
#参数类型为 "Content-Type": "multipart/form-data", 发送请求的时候使用files来传递参数
|
||||||
|
# 文件上传传递参数
|
||||||
|
file = { # 文件名(后台接收到的服务器看到的名字,可以自定义), 打开的文件句柄,文件类型
|
||||||
|
# pic需要具体看接口里面上传文件需要的参数名是什么
|
||||||
|
'pic': ('picture.jpg', open('picture.jpg', 'rb'), 'image/jpg')
|
||||||
|
}
|
||||||
|
#注意:如果文件上传中还有其他参数,其他参数是不能放在file里面
|
||||||
|
response3 = requests.post(url=url, files=file)
|
||||||
|
response4 = requests.post(url=url, files=file, data=data)
|
||||||
|
|
||||||
# 参数类型为 "Content-Type": "multipart/form-data", 发送请求的时候使用files来传递参数
|
|
||||||
# # 文件上传传递参数
|
|
||||||
# file = { # 文件名(后台接收到的服务器看到的名字,可以自定义), 打开的文件句柄,文件类型
|
|
||||||
# # pic需要具体看接口里面上传文件需要的参数名是什么
|
|
||||||
# 'pic': ('picture.jpg', open('picture.jpg', 'rb'), 'image/jpg')
|
|
||||||
# }
|
|
||||||
# 注意:如果文件上传中还有其他参数,其他参数是不能放在file里面
|
|
||||||
# response = requests.post(url=url, files=file)
|
|
||||||
# response = requests.post(url=url, files=file, data=data)
|
|
||||||
#
|
|
||||||
# print(response.text)
|
|
||||||
|
|
||||||
# ----------------------------------get------------------------------------------------------
|
# ----------------------------------get------------------------------------------------------
|
||||||
url = 'http://httpbin.org/get'
|
url = 'http://httpbin.org/get'
|
||||||
|
@ -43,11 +42,11 @@ response = requests.get(url=url)
|
||||||
|
|
||||||
print(response.text)
|
print(response.text)
|
||||||
|
|
||||||
# get请求参数,方式一:放到URL地址后面
|
#get请求参数,方式一:放到URL地址后面
|
||||||
# url1 = 'http://httpbin.org/get?name=musen&age=18'
|
url1 = 'http://httpbin.org/get?name=musen&age=18'
|
||||||
# response1 = requests.get(url=url1)
|
response5 = requests.get(url=url1)
|
||||||
# # 打印返回内容
|
# 打印返回内容
|
||||||
# print(response1.text)
|
print(response5.text)
|
||||||
|
|
||||||
|
|
||||||
# get请求参数,方式二:使用params来进行传递
|
# get请求参数,方式二:使用params来进行传递
|
||||||
|
@ -56,5 +55,5 @@ data2 = {
|
||||||
'name': 'flora',
|
'name': 'flora',
|
||||||
'age': 19
|
'age': 19
|
||||||
}
|
}
|
||||||
response2 = requests.get(url=url, params=data2)
|
response6 = requests.get(url=url, params=data2)
|
||||||
print(response2.text)
|
print(response6.text)
|
|
@ -0,0 +1,24 @@
|
||||||
|
"""
|
||||||
|
=================================
|
||||||
|
Author: Flora Chen
|
||||||
|
Time: 2020/4/13 9:38
|
||||||
|
-_- -_- -_- -_- -_- -_- -_- -_-
|
||||||
|
=================================
|
||||||
|
"""
|
||||||
|
|
||||||
|
from requests import request
|
||||||
|
|
||||||
|
# 请求参数
|
||||||
|
method = 'post'
|
||||||
|
url = 'http://api.lemonban.com/futureloan/member/login'
|
||||||
|
headers = {
|
||||||
|
'X-lemonban-Media-Type': 'lemonban.v2'
|
||||||
|
}
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'mobile_phone': '18774970056',
|
||||||
|
'pwd': '12345678'
|
||||||
|
}
|
||||||
|
|
||||||
|
# 直接使用request方法定义请求的类型
|
||||||
|
request(method=method, url=url, json=data, headers=headers)
|
|
@ -11,16 +11,24 @@ import pymysql
|
||||||
"""
|
"""
|
||||||
接口base_url: http://api.lemonban.com/futureloan
|
接口base_url: http://api.lemonban.com/futureloan
|
||||||
MySQL数据库连接信息:
|
MySQL数据库连接信息:
|
||||||
主机:120.78.128.25
|
主机:120.78.128.******
|
||||||
port:3306
|
port:3306
|
||||||
用户:future
|
用户:futu******
|
||||||
密码:123456
|
密码:123******
|
||||||
"""
|
"""
|
||||||
# 第一步:连接数据库
|
# 第一步:连接数据库
|
||||||
conn = pymysql.connect(host='120.78.128.25',
|
conn1 = pymysql.connect(host='120.78.128.******',
|
||||||
port=3306,
|
port=3306,
|
||||||
user='future',
|
user='futu******',
|
||||||
password='123456',
|
password='123******',
|
||||||
|
charset='utf8',
|
||||||
|
cursorclass=pymysql.cursors)
|
||||||
|
|
||||||
|
|
||||||
|
conn = pymysql.connect(host='120.78.128.******',
|
||||||
|
port=3306,
|
||||||
|
user='futu******',
|
||||||
|
password='123******',
|
||||||
charset='utf8',
|
charset='utf8',
|
||||||
cursorclass=pymysql.cursors.DictCursor)# 加上这个返回的就是字典
|
cursorclass=pymysql.cursors.DictCursor)# 加上这个返回的就是字典
|
||||||
|
|
||||||
|
@ -62,13 +70,4 @@ pymysql操作数据库, 默认是开启了事务
|
||||||
所以在执行增删改的相关操作之后一定要提交事务才会生效
|
所以在执行增删改的相关操作之后一定要提交事务才会生效
|
||||||
连接对象.commit()
|
连接对象.commit()
|
||||||
|
|
||||||
|
|
||||||
2052976,2053131,2053207,2053209,2053220,2053130,2038001,2038000,2037999,2037620,2037619,2053284,2053301,2048577,2053317,2053323,2052877,2052857,2052846,2052844,2053045,2053357,2048575,2048576
|
|
||||||
|
|
||||||
|
|
||||||
7,6,9,14,9,7,20,2,6,4,32,7,3,13,7,7,19,26,7,6,2,3,10,8
|
|
||||||
|
|
||||||
|
|
||||||
810500,809502,810623,914941,914947,914936
|
|
||||||
|
|
||||||
"""
|
"""
|
|
@ -11,43 +11,40 @@ import re
|
||||||
from python27Class.unitTest.class04022020.handle_config import conf
|
from python27Class.unitTest.class04022020.handle_config import conf
|
||||||
|
|
||||||
|
|
||||||
user = 'python'
|
|
||||||
pwd = 'lemonban'
|
|
||||||
name = 'flora'
|
|
||||||
age = 18
|
|
||||||
|
|
||||||
data = "{'user': '#user#', 'pwd': '#pwd#', 'name': '#name#', 'age': #age#}"
|
|
||||||
# 用replace方法需要多次替换 (缺点:每次只能替换一个数据,效率太低)
|
|
||||||
data = data.replace('#user#', user)
|
|
||||||
data = data.replace('#pwd#', pwd)
|
|
||||||
data = data.replace('#name#', name)
|
|
||||||
data = data.replace('#age#', str(age))
|
|
||||||
print(data)
|
|
||||||
|
|
||||||
# 使用正则替换
|
|
||||||
data = "{'user': '#user#', 'pwd': '#pwd#', 'name': '#name#', 'age': #age#}"
|
|
||||||
# rule = re.search('#(.*?)#', data)
|
|
||||||
# print(rule) # 输出结果:<re.Match object; span=(10, 16), match='#user#'>
|
|
||||||
#
|
|
||||||
# # 获取匹配到的数据
|
|
||||||
# key = rule.group()
|
|
||||||
# print(key) # 输出结果:#user#
|
|
||||||
#
|
|
||||||
# # 获取匹配规则中()里面的内容, 1表示第一个()里的内容
|
|
||||||
# item = rule.group(1)
|
|
||||||
# print(item) # 输出结果:user
|
|
||||||
#
|
|
||||||
# value = conf.get('REG', item)
|
|
||||||
# data = data.replace(key, value)
|
|
||||||
# print(data)
|
|
||||||
|
|
||||||
test = {
|
test = {
|
||||||
'user': 'python',
|
'user': 'python',
|
||||||
'name' : 'flora',
|
'name' : 'flora',
|
||||||
'pwd' : 'lemonban',
|
'pwd' : 'lemonban',
|
||||||
'age' : 18
|
'age' : 18
|
||||||
}
|
}
|
||||||
|
data = "{'user': '#user#', 'pwd': '#pwd#', 'name': '#name#', 'age': #age#}"
|
||||||
|
|
||||||
|
# 使用replace方法替换 (缺点:需要每一个单独进行替换,代码太多)
|
||||||
|
|
||||||
|
# 用replace方法需要多次替换 (缺点:每次只能替换一个数据,效率太低)
|
||||||
|
data = data.replace('#user#', test['user'])
|
||||||
|
data = data.replace('#pwd#', test['pwd'])
|
||||||
|
data = data.replace('#name#', test['name'])
|
||||||
|
data = data.replace('#age#', str(test['age']))
|
||||||
|
print(data)
|
||||||
|
|
||||||
|
# 使用正则替换
|
||||||
|
rule = re.search('#(.*?)#', data)
|
||||||
|
print(rule) # 输出结果:<re.Match object; span=(10, 16), match='#user#'>
|
||||||
|
|
||||||
|
# 获取匹配到的数据
|
||||||
|
key = rule.group()
|
||||||
|
print(key) # 输出结果:#user#
|
||||||
|
|
||||||
|
# 获取匹配规则中()里面的内容, 1表示第一个()里的内容
|
||||||
|
item = rule.group(1)
|
||||||
|
print(item) # 输出结果:user
|
||||||
|
|
||||||
|
value = conf.get('REG', item)
|
||||||
|
data = data.replace(key, value)
|
||||||
|
print(data)
|
||||||
|
|
||||||
|
# 封装成方法
|
||||||
def replace_data(data):
|
def replace_data(data):
|
||||||
while re.search('#(.*?)#', data):
|
while re.search('#(.*?)#', data):
|
||||||
rule = re.search('#(.*?)#', data)
|
rule = re.search('#(.*?)#', data)
|
||||||
|
|
|
@ -5,13 +5,42 @@ Time: 2020/4/8 9:42
|
||||||
-_- -_- -_- -_- -_- -_- -_- -_-
|
-_- -_- -_- -_- -_- -_- -_- -_-
|
||||||
=================================
|
=================================
|
||||||
"""
|
"""
|
||||||
|
import re
|
||||||
|
|
||||||
class EnvData:
|
class EnvData:
|
||||||
"""
|
"""
|
||||||
定义一个类,用来保存用例执行过程中,提取出来的数据
|
定义一个类,用来保存用例执行过程中,提取出来的数据。
|
||||||
(当成环境变量的容器)。
|
(当成环境变量的容器)
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def replace_data(data):
|
||||||
|
while re.search('#(.*?)#', data):
|
||||||
|
rule = re.search('#(.*?)#', data)
|
||||||
|
# 获取匹配到的数据
|
||||||
|
key = rule.group()
|
||||||
|
|
||||||
|
# 获取匹配规则中()里面的内容, 1表示第一个()里的内容
|
||||||
|
item = rule.group(1)
|
||||||
|
|
||||||
|
# 用字典中的值来替换
|
||||||
|
# value = str(test[item])
|
||||||
|
|
||||||
|
# 用配置文件中的值来替换(获取配置文件中对应的值)
|
||||||
|
# value = conf.get('REG', item)
|
||||||
|
try:
|
||||||
|
# 获取配置文件中对应的值
|
||||||
|
value = conf.get('TEST', item)
|
||||||
|
except:
|
||||||
|
# 去EnvData这个类里面获取
|
||||||
|
value = getattr(EnvData, item)
|
||||||
|
|
||||||
|
data = data.replace(key, value)
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
data = {"member_id": 188, "mobile_phone": "13567895555"}
|
data = {"member_id": 188, "mobile_phone": "13567895555"}
|
||||||
|
|
||||||
token = "dfgfdgfdgdf dfgfdg dfgfdg dyjyui"
|
token = "dfgfdgfdgdf dfgfdg dfgfdg dyjyui"
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
"""
|
||||||
|
=================================
|
||||||
|
Author: Flora Chen
|
||||||
|
Time: 2020/4/20 16:30
|
||||||
|
-_- -_- -_- -_- -_- -_- -_- -_-
|
||||||
|
=================================
|
||||||
|
"""
|
||||||
|
import unittest
|
||||||
|
from requests import request
|
||||||
|
from unittest.mock import Mock
|
||||||
|
|
||||||
|
"""
|
||||||
|
get_sign("musen)
|
||||||
|
使用用户忙和时间进行加密得到一个加密的签名数据
|
||||||
|
"""
|
||||||
|
get_sign = Mock(return_value="sdfsSDGDF234dfg4353fdg45645fghfg435")
|
||||||
|
|
||||||
|
class TestLogin(unittest.TestCase):
|
||||||
|
def test_login(self):
|
||||||
|
data = {
|
||||||
|
"user": "flora",
|
||||||
|
"pwd": "sdfgdgfdg",
|
||||||
|
"sign": get_sign("musen", 100) # 这里可以传任意参数
|
||||||
|
}
|
||||||
|
|
||||||
|
url = "http://127.0.0.1:8080/login"
|
||||||
|
print(data)
|
||||||
|
|
||||||
|
response = request(method="post", url=url, json=data)
|
|
@ -0,0 +1,7 @@
|
||||||
|
"""
|
||||||
|
=================================
|
||||||
|
Author: Flora Chen
|
||||||
|
Time: 2020/4/20 16:41
|
||||||
|
-_- -_- -_- -_- -_- -_- -_- -_-
|
||||||
|
=================================
|
||||||
|
"""
|
|
@ -0,0 +1,35 @@
|
||||||
|
"""
|
||||||
|
============================
|
||||||
|
Author:柠檬班-木森
|
||||||
|
Time:2020/4/14 20:33
|
||||||
|
E-mail:3247119728@qq.com
|
||||||
|
Company:湖南零檬信息技术有限公司
|
||||||
|
============================
|
||||||
|
"""
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
from requests import request
|
||||||
|
from unittest.mock import Mock
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
gen_sign("musen")
|
||||||
|
使用用户名,和时间进行加密得到一个加密的签名数据
|
||||||
|
|
||||||
|
"""
|
||||||
|
gen_sign = Mock(return_value="yJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJf")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class TestLogin(unittest.TestCase):
|
||||||
|
|
||||||
|
def test_login(self):
|
||||||
|
data = {
|
||||||
|
"user": "musne",
|
||||||
|
"pwd": "ldjfss",
|
||||||
|
"sign": gen_sign("musen")
|
||||||
|
}
|
||||||
|
url = "http://127.0.0.1:8000/login"
|
||||||
|
|
||||||
|
reponse = request(url=url,json=data,method="post")
|
|
@ -0,0 +1,168 @@
|
||||||
|
"""
|
||||||
|
============================
|
||||||
|
Author:柠檬班-木森
|
||||||
|
Time:2020/4/14 20:45
|
||||||
|
E-mail:3247119728@qq.com
|
||||||
|
Company:湖南零檬信息技术有限公司
|
||||||
|
============================
|
||||||
|
"""
|
||||||
|
import unittest
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
|
url = "https://docs.open.alipay.com/api_1/alipay.trade.pay"
|
||||||
|
# 账号密码都正确,正常
|
||||||
|
data = {'user': 'python01', 'pay_pwd': 123456,'money':88.88}
|
||||||
|
|
||||||
|
res_data = {
|
||||||
|
"alipay_trade_pay_response": {
|
||||||
|
"code": "10000",
|
||||||
|
"msg": "Success",
|
||||||
|
"trade_no": "2013112011001004330000121536",
|
||||||
|
"out_trade_no": "6823789339978248",
|
||||||
|
"buyer_logon_id": "159****5620",
|
||||||
|
"settle_amount": "88.88",
|
||||||
|
"pay_currency": "CNY",
|
||||||
|
"pay_amount": "580.04",
|
||||||
|
"settle_trans_rate": "1",
|
||||||
|
"trans_pay_rate": "6.5261",
|
||||||
|
"total_amount": 120.88,
|
||||||
|
"trans_currency": "USD",
|
||||||
|
"settle_currency": "USD",
|
||||||
|
"receipt_amount": "88.88",
|
||||||
|
"buyer_pay_amount": 8.88,
|
||||||
|
"point_amount": 8.12,
|
||||||
|
"invoice_amount": 12.5,
|
||||||
|
"gmt_payment": "2014-11-27 15:45:57",
|
||||||
|
"fund_bill_list": [
|
||||||
|
{
|
||||||
|
"fund_channel": "ALIPAYACCOUNT",
|
||||||
|
"bank_code": "CEB",
|
||||||
|
"amount": 10,
|
||||||
|
"real_amount": 11.21
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"card_balance": 98.23,
|
||||||
|
"store_name": "证大五道口店",
|
||||||
|
"buyer_user_id": "2088101117955611",
|
||||||
|
"discount_goods_detail": "[{\"goods_id\":\"STANDARD1026181538\",\"goods_name\":\"雪碧\",\"discount_amount\":\"100.00\",\"voucher_id\":\"2015102600073002039000002D5O\"}]",
|
||||||
|
"voucher_detail_list": [
|
||||||
|
{
|
||||||
|
"id": "2015102600073002039000002D5O",
|
||||||
|
"name": "XX超市5折优惠",
|
||||||
|
"type": "ALIPAY_FIX_VOUCHER",
|
||||||
|
"amount": 10,
|
||||||
|
"merchant_contribute": 9,
|
||||||
|
"other_contribute": 1,
|
||||||
|
"memo": "学生专用优惠",
|
||||||
|
"template_id": "20171030000730015359000EMZP0",
|
||||||
|
"purchase_buyer_contribute": 2.01,
|
||||||
|
"purchase_merchant_contribute": 1.03,
|
||||||
|
"purchase_ant_contribute": 0.82
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"advance_amount": "88.8",
|
||||||
|
"auth_trade_pay_mode": "CREDIT_PREAUTH_PAY",
|
||||||
|
"charge_amount": "8.88",
|
||||||
|
"charge_flags": "bluesea_1",
|
||||||
|
"settlement_id": "2018101610032004620239146945",
|
||||||
|
"business_params": "{\"data\":\"123\"}",
|
||||||
|
"buyer_user_type": "PRIVATE",
|
||||||
|
"mdiscount_amount": "88.88",
|
||||||
|
"discount_amount": "88.88",
|
||||||
|
"buyer_user_name": "菜鸟网络有限公司"
|
||||||
|
},
|
||||||
|
"sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
|
||||||
|
}
|
||||||
|
# 创建一个mock对象
|
||||||
|
request = mock.Mock(return_value=res_data)
|
||||||
|
|
||||||
|
# 调用mock对象
|
||||||
|
response = request(url=url,data=data)
|
||||||
|
print(response)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class TestPay(unittest.TestCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
"""请求支付结果获取支付接口返回的数据"""
|
||||||
|
url = "https://docs.open.alipay.com/api_1/alipay.trade.pay"
|
||||||
|
# 账号密码都正确,正常
|
||||||
|
data = {'user': 'python01', 'pay_pwd': 123456, 'money': 88.88}
|
||||||
|
|
||||||
|
res_data = {
|
||||||
|
"alipay_trade_pay_response": {
|
||||||
|
"code": "10000",
|
||||||
|
"msg": "Success",
|
||||||
|
"trade_no": "2013112011001004330000121536",
|
||||||
|
"out_trade_no": "6823789339978248",
|
||||||
|
"buyer_logon_id": "159****5620",
|
||||||
|
"settle_amount": "88.88",
|
||||||
|
"pay_currency": "CNY",
|
||||||
|
"pay_amount": "580.04",
|
||||||
|
"settle_trans_rate": "1",
|
||||||
|
"trans_pay_rate": "6.5261",
|
||||||
|
"total_amount": 120.88,
|
||||||
|
"trans_currency": "USD",
|
||||||
|
"settle_currency": "USD",
|
||||||
|
"receipt_amount": "88.88",
|
||||||
|
"buyer_pay_amount": 8.88,
|
||||||
|
"point_amount": 8.12,
|
||||||
|
"invoice_amount": 12.5,
|
||||||
|
"gmt_payment": "2014-11-27 15:45:57",
|
||||||
|
"fund_bill_list": [
|
||||||
|
{
|
||||||
|
"fund_channel": "ALIPAYACCOUNT",
|
||||||
|
"bank_code": "CEB",
|
||||||
|
"amount": 10,
|
||||||
|
"real_amount": 11.21
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"card_balance": 98.23,
|
||||||
|
"store_name": "证大五道口店",
|
||||||
|
"buyer_user_id": "2088101117955611",
|
||||||
|
"discount_goods_detail": "[{\"goods_id\":\"STANDARD1026181538\",\"goods_name\":\"雪碧\",\"discount_amount\":\"100.00\",\"voucher_id\":\"2015102600073002039000002D5O\"}]",
|
||||||
|
"voucher_detail_list": [
|
||||||
|
{
|
||||||
|
"id": "2015102600073002039000002D5O",
|
||||||
|
"name": "XX超市5折优惠",
|
||||||
|
"type": "ALIPAY_FIX_VOUCHER",
|
||||||
|
"amount": 10,
|
||||||
|
"merchant_contribute": 9,
|
||||||
|
"other_contribute": 1,
|
||||||
|
"memo": "学生专用优惠",
|
||||||
|
"template_id": "20171030000730015359000EMZP0",
|
||||||
|
"purchase_buyer_contribute": 2.01,
|
||||||
|
"purchase_merchant_contribute": 1.03,
|
||||||
|
"purchase_ant_contribute": 0.82
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"advance_amount": "88.8",
|
||||||
|
"auth_trade_pay_mode": "CREDIT_PREAUTH_PAY",
|
||||||
|
"charge_amount": "8.88",
|
||||||
|
"charge_flags": "bluesea_1",
|
||||||
|
"settlement_id": "2018101610032004620239146945",
|
||||||
|
"business_params": "{\"data\":\"123\"}",
|
||||||
|
"buyer_user_type": "PRIVATE",
|
||||||
|
"mdiscount_amount": "88.88",
|
||||||
|
"discount_amount": "88.88",
|
||||||
|
"buyer_user_name": "菜鸟网络有限公司"
|
||||||
|
},
|
||||||
|
"sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
|
||||||
|
}
|
||||||
|
# 创建一个mock对象
|
||||||
|
request= mock.Mock(return_value=res_data)
|
||||||
|
|
||||||
|
# 调用mock对象
|
||||||
|
cls.response = request(url=url, data=data)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def test_case01(self):
|
||||||
|
"""测试用例中需要用到前置条件支付接口返回的数据"""
|
||||||
|
|
||||||
|
# 获取前置条件中支付返回的数据
|
||||||
|
pay_res_data = self.response
|
|
@ -0,0 +1,37 @@
|
||||||
|
"""
|
||||||
|
============================
|
||||||
|
Author:柠檬班-木森
|
||||||
|
Time:2020/4/14 21:10
|
||||||
|
E-mail:3247119728@qq.com
|
||||||
|
Company:湖南零檬信息技术有限公司
|
||||||
|
============================
|
||||||
|
"""
|
||||||
|
import requests
|
||||||
|
from requests import request
|
||||||
|
|
||||||
|
# 登录
|
||||||
|
login_url = "http://test.lemonban.com/futureloan/mvc/api/member/login"
|
||||||
|
login_data = {
|
||||||
|
"mobilephone": "13367899876",
|
||||||
|
"pwd": "lemonban"
|
||||||
|
}
|
||||||
|
response = requests.post(url=login_url, data=login_data)
|
||||||
|
|
||||||
|
# print(response.text)
|
||||||
|
print(response.headers)
|
||||||
|
# print(response.json())
|
||||||
|
# # 获取http请求的状态码
|
||||||
|
# # print(response.status_code)
|
||||||
|
# # print(response.text)
|
||||||
|
# # print(response.json())
|
||||||
|
print("-*"*50)
|
||||||
|
|
||||||
|
# 调用充值的接口
|
||||||
|
|
||||||
|
recharge_url = "http://test.lemonban.com/futureloan/mvc/api/member/recharge"
|
||||||
|
recharge_data = {
|
||||||
|
"mobilephone": "13367899876",
|
||||||
|
"amount": 2000
|
||||||
|
}
|
||||||
|
response2 = requests.post(url=recharge_url,data=recharge_data)
|
||||||
|
print(response2.text)
|
|
@ -0,0 +1,35 @@
|
||||||
|
"""
|
||||||
|
============================
|
||||||
|
Author:柠檬班-木森
|
||||||
|
Time:2020/4/14 21:10
|
||||||
|
E-mail:3247119728@qq.com
|
||||||
|
Company:湖南零檬信息技术有限公司
|
||||||
|
============================
|
||||||
|
"""
|
||||||
|
from requests.sessions import Session
|
||||||
|
|
||||||
|
# 创建一个会话对象
|
||||||
|
se = Session()
|
||||||
|
|
||||||
|
|
||||||
|
# 登录
|
||||||
|
login_url = "http://test.lemonban.com/futureloan/mvc/api/member/login"
|
||||||
|
login_data = {
|
||||||
|
"mobilephone": "13367899876",
|
||||||
|
"pwd": "lemonban"
|
||||||
|
}
|
||||||
|
response = se.post(url=login_url, data=login_data)
|
||||||
|
|
||||||
|
print(response.text)
|
||||||
|
print(response.headers)
|
||||||
|
|
||||||
|
print("-*"*50)
|
||||||
|
|
||||||
|
# 调用充值的接口
|
||||||
|
recharge_url = "http://test.lemonban.com/futureloan/mvc/api/member/recharge"
|
||||||
|
recharge_data = {
|
||||||
|
"mobilephone": "13367899876",
|
||||||
|
"amount": 2000
|
||||||
|
}
|
||||||
|
response2 = se.post(url=recharge_url,data=recharge_data)
|
||||||
|
print(response2.text)
|
|
@ -0,0 +1,30 @@
|
||||||
|
"""
|
||||||
|
============================
|
||||||
|
Author:柠檬班-木森
|
||||||
|
Time:2020/4/14 21:37
|
||||||
|
E-mail:3247119728@qq.com
|
||||||
|
Company:湖南零檬信息技术有限公司
|
||||||
|
============================
|
||||||
|
"""
|
||||||
|
|
||||||
|
import time
|
||||||
|
from common.handle_sign import HandleSign
|
||||||
|
|
||||||
|
token = "q2weretryfgyihfdsadsfdgfhjhgfdasfgdhgjhdsfgfgjhgf"
|
||||||
|
|
||||||
|
# # 获取当前的时间戳
|
||||||
|
# s = int(time.time())
|
||||||
|
# # token前50位和时间戳拼接
|
||||||
|
# msg = token[:50]+str(s)
|
||||||
|
#
|
||||||
|
# sign = HandleSign.to_encrypt(msg=msg)
|
||||||
|
# print(sign)
|
||||||
|
|
||||||
|
data ={"name":1111,"pwd":2222}
|
||||||
|
|
||||||
|
sign_data = HandleSign.generate_sign(token)
|
||||||
|
|
||||||
|
print(sign_data)
|
||||||
|
|
||||||
|
data.update(sign_data)
|
||||||
|
print(data)
|
|
@ -0,0 +1,5 @@
|
||||||
|
Mock测试
|
||||||
|
Mock测试是在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来模拟对象的行为。
|
||||||
|
单元测试/接口测试中猜测是对象依赖其他对象,这些对象的构造复杂,耗时或者根本无法构建(未交付)就会使用到mock测试。
|
||||||
|
from unittest.mock import Mock
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
-------------------------------------------------
|
||||||
|
@Time : 2019/11/25 15:17
|
||||||
|
@Auth : 可优
|
||||||
|
@File : handle_sign.py
|
||||||
|
@IDE : PyCharm
|
||||||
|
@Motto: ABC(Always Be Coding)
|
||||||
|
@Email: keyou100@qq.com
|
||||||
|
@Company: 湖南省零檬信息技术有限公司
|
||||||
|
@Copyright: 柠檬班
|
||||||
|
-------------------------------------------------
|
||||||
|
"""
|
||||||
|
import base64
|
||||||
|
from time import time
|
||||||
|
|
||||||
|
# 需要安装rsa模块, pip install rsa
|
||||||
|
import rsa
|
||||||
|
|
||||||
|
|
||||||
|
class HandleSign:
|
||||||
|
server_pub = """
|
||||||
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQENQujkLfZfc5Tu9Z1LprzedE
|
||||||
|
O3F7gs+7bzrgPsMl29LX8UoPYvIG8C604CprBQ4FkfnJpnhWu2lvUB0WZyLq6sBr
|
||||||
|
tuPorOc42+gLnFfyhJAwdZB6SqWfDg7bW+jNe5Ki1DtU7z8uF6Gx+blEMGo8Dg+S
|
||||||
|
kKlZFc8Br7SHtbL2tQIDAQAB
|
||||||
|
-----END PUBLIC KEY-----
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def to_encrypt(cls, msg, pub_key=None):
|
||||||
|
"""
|
||||||
|
非对称加密
|
||||||
|
:param msg: 待加密字符串或者字节
|
||||||
|
:param pub_key: 公钥
|
||||||
|
:return: 密文
|
||||||
|
"""
|
||||||
|
if isinstance(msg, str): # 如果msg为字符串, 则转化为字节类型
|
||||||
|
msg = msg.encode('utf-8')
|
||||||
|
elif isinstance(msg, bytes): # 如果msg为字节类型, 则无需处理
|
||||||
|
pass
|
||||||
|
else: # 否则抛出异常
|
||||||
|
raise TypeError('msg必须为字符串或者字节类型!')
|
||||||
|
|
||||||
|
if not pub_key: # 如果pub_key为空, 则使用全局公钥
|
||||||
|
pub_key = cls.server_pub.encode("utf-8")
|
||||||
|
elif isinstance(pub_key, str): # 如果pub_key为字符串, 则转化为字节类型
|
||||||
|
pub_key = pub_key.encode('utf-8')
|
||||||
|
elif isinstance(pub_key, bytes): # 如果msg为字节类型, 则无需处理
|
||||||
|
pass
|
||||||
|
else: # 否则抛出异常
|
||||||
|
raise TypeError('pub_key必须为None、字符串或者字节类型!')
|
||||||
|
|
||||||
|
public_key_obj = rsa.PublicKey.load_pkcs1_openssl_pem(pub_key) # 创建 PublicKey 对象
|
||||||
|
|
||||||
|
cryto_msg = rsa.encrypt(msg, public_key_obj) # 生成加密文本
|
||||||
|
cipher_base64 = base64.b64encode(cryto_msg) # 将加密文本转化为 base64 编码
|
||||||
|
|
||||||
|
return cipher_base64.decode() # 将字节类型的 base64 编码转化为字符串类型
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def generate_sign(cls, token, timestamp=None):
|
||||||
|
"""
|
||||||
|
生成sign
|
||||||
|
:param timestamp: 当前秒级时间戳, 为int类型
|
||||||
|
:param token: token, 为str类型
|
||||||
|
:return: 时间戳和sign组成的字典
|
||||||
|
"""
|
||||||
|
timestamp = timestamp or int(time()) # 获取当前的时间戳
|
||||||
|
prefix_50_token = token[:50] # 获取token前50位
|
||||||
|
message = prefix_50_token + str(timestamp) # 将token前50位与时间戳字符串进行拼接
|
||||||
|
sign = cls.to_encrypt(message) # 生成sign
|
||||||
|
|
||||||
|
return {"timestamp": timestamp, "sign": sign}
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
pass
|
||||||
|
# my_token = "eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjI2NSwiZXhwIjoxNTc0NjY3MjMzfQ.ftrNcidmk_zxwl0wzdhE5_39bsGlILoSSoTCy043fjhbjhCFG4FwCnOj4iy5svbDlSbgCJM3qRa1zsXJLJmH4A"
|
||||||
|
# cryto_info = HandleSign.generate_sign(my_token)
|
||||||
|
# print(cryto_info)
|
||||||
|
# s = "1234567"
|
||||||
|
#
|
||||||
|
# res = HandleSign.to_encrypt(s)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
"""
|
||||||
|
============================
|
||||||
|
Author:柠檬班-木森
|
||||||
|
Time:2020/4/14 20:04
|
||||||
|
E-mail:3247119728@qq.com
|
||||||
|
Company:湖南零檬信息技术有限公司
|
||||||
|
============================
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 邮箱已注册
|
||||||
|
expected = {
|
||||||
|
"email": [
|
||||||
|
"此邮箱已注册"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
res = {
|
||||||
|
"email": [
|
||||||
|
"此邮箱已注册"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# assert expected == res
|
||||||
|
|
||||||
|
# 注册成功的情况
|
||||||
|
expected1 = {
|
||||||
|
"username": "musenww01"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 实际结果
|
||||||
|
res1 = {
|
||||||
|
"id": 1659,
|
||||||
|
"username": "musenww01",
|
||||||
|
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxNjU5LCJ1c2VybmFtZSI6Im11c2Vud3cwMSIsImV4cCI6MTU4Njk1MjMzNSwiZW1haWwiOiJtdXNlbjA4ODJAcXEuY29tIn0.ACuGW5kukoQjlv1K6UE-4er3l7vL57wOvdpgiTrxGi4"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# assert expected1 in res1
|
||||||
|
|
||||||
|
|
||||||
|
def assert_dict(expected, res):
|
||||||
|
"""
|
||||||
|
自定义 用来对连个字典进行成员运算断言的方法
|
||||||
|
:param expected: 预期结果
|
||||||
|
:param res: 实际结果
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
for key in expected:
|
||||||
|
# 判断键是否存在,键对应的值也相等
|
||||||
|
if key in res.keys() and expected[key] == res[key]:
|
||||||
|
# 这个键对应的值是否一致,断言通过
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise AssertionError("断言不通过")
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# assert_dict(expected1, res1)
|
||||||
|
# assert_dict(expected, res)
|
||||||
|
|
||||||
|
li = [1, 2, 3,555]
|
||||||
|
li2 = [12, 3, 4, 521, 1, 2, 3]
|
||||||
|
# assert li in li2
|
||||||
|
|
||||||
|
def list_in(list1,list2):
|
||||||
|
"""
|
||||||
|
:param list1: 预期
|
||||||
|
:param list2: 实际
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
for li in list1:
|
||||||
|
if li in list2:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise AssertionError("{} not in{},断言不通过".format(list1,list2))
|
||||||
|
|
||||||
|
|
||||||
|
list_in(li,li2)
|
Loading…
Reference in New Issue