mock接口就是模拟接口的意思。在接口测试中,一个接口可能依赖另一个接口的功能。模拟第三方数据交互的接口,当第三方的接口没有提供之前,我们自己写mock接口和自己的系统数据对接测试,如果不想让别人连接数据库,可以mock接口,让别人调这个接口看数据。例:测试支付功能接口,而它需要调用第三方服务的接口,如微信支付或支付宝支付接口,因此,可以开发mock接口进行模拟支付时调用第三方接口。
一、安装第三方模块flask
安装命令为:
pip install flask
注:flask是一个轻量级的web开发框架
二、开发接口
1.实例化一个服务server:flask.Flask(__name__)
2.函数前加装饰器@server.route(), 将函数变为一个接口
3.启动服务server:server.run()
1 import flask
2 import json
3 import pymysql
4 server = flask.Flask(__name__) # __name__代表当前python文件, 把当前python文件当成一个服务
5
6 # 连接数据库
7 def op_mysql(sql):
8 connect=pymysql.connect(host='127.0.0.1',
9 user='xxx',
10 password='123456',
11 db='xxx',
12 port=3306,
13 charset='utf8',
14 autocommit=True
15 )
16 cursor = connect.cursor(pymysql.cursors.DictCursor)
17 try:
18 cursor.execute(sql)
19 except Exception as e:
20 result = {'error':'sql错误'}
21 else:
22 result = cursor.fetchall()
23 finally:
24 cursor.close()
25 connect.close()
26 return result
27
28 # 第一种:get请求
29 @server.route('/api/login') #装饰器,函数就不是普通的函数,变成接口
30 # route里面第一个参数是路径名,第二个参数是请求类型,必须用list这种方式,methods默认不写就是get请求
31 def login():
32 data ={"code":0,"msg":"登录成功"}
33 return json.dumps(data,ensure_ascii=False)
34
35 # 第二种:获取请求参数
36 @server.route('/api/payment')
37 def payment():
38 status = flask.request.values.get('status') #获取请求参数
39 if status == 'success':
40 data ={"code":0,"msg":"支付成功","amount":30000}
41 elif status == 'process':
42 data = {"code": 305, "msg": "支付处理中", "amount": 30000}
43 elif status == 'fail':
44 data = {"code": -1, "msg": "失败", "amount": 30000}
45 else:
46 data = {"code": 400, "msg": "支付状态错误"}
47 return json.dumps(data,ensure_ascii=False)
48
49 # 第三种:数据库操作
50 @server.route('/account_data',methods=['post'])
51 def account_data():
52 account_name = flask.request.values.get('account_name') #获取json
53 result = op_mysql('select * from gtm_account where account="%s";'%account_name)
54 data = {"code":0,"msg":"success","data":result}
55 return json.dumps(data,ensure_ascii=False)
56
57 #启动服务: 必须在所有接口定义完后再定义,否则检测不到之后定义的接口, 接口是无法被运行的
58 server.run(host='0.0.0.0',port=9999,debug=True)
59 # host=0.0.0.0同一局域网内写上你真实的IP就可以访问
60 # debug=True是自动重启的意思,修改代码后服务会重启
61
62 # server.run(port=9999,debug=True) #这种启动方式只能本地IP访问:127.0.0.1
三、小练习
1 import flask,json,pymysql,hashlib,redis,time
2 server = flask.Flask(__name__)
3
4 def op_mysql(sql,one_tag):
5 connect=pymysql.connect(host='127.0.0.1',
6 user='xxx',
7 password='123456',
8 db='xxx',
9 port=3306,
10 charset='utf8',
11 autocommit=True
12 )
13 cursor = connect.cursor(pymysql.cursors.DictCursor)
14 cursor.execute(sql)
15 if one_tag:
16 result = cursor.fetchone()
17 else:
18 result = cursor.fetchall()
19 cursor.close()
20 connect.close()
21 return result
22
23 def md5(s,salt='zx_session'):
24 s = str(s)+salt #加盐
25 m = hashlib.md5(s.encode()) #加密
26 return m.hexdigest()
27
28 def op_redis(key,value=None,expire=60*60*2):
29 r = redis.Redis(host='127.0.0.1',password='123456',decode_responses=True)
30 if value:
31 r.set(key,value,expire)
32 else:
33 return r.get(key)
34
35 # 注册接口
36 @server.route('/register',methods=['post'])
37 def register(): #app_myuser
38 username = flask.request.values.get('username')
39 password = flask.request.values.get('password')
40 cpwd = flask.request.values.get('cpwd')
41 sql = 'select * from app_myuser where username ="%s";'%username
42 if username and password and cpwd:
43 if password !=cpwd:
44 data = {'code': 400, 'msg': '两次输入密码不一致'}
45 elif op_mysql(sql):
46 data = {'code':401,'msg':'用户已经存在'}
47 else:
48 password = md5(password)
49 insert_sql = 'insert into app_myuser (username,passwd) values ("%s","%s");'%(username,password)
50 op_mysql(insert_sql)
51 data = {'code':0,'msg':'注册成功'}
52 else:
53 data = {'code':400,'msg':'必填参数不能为空'}
54 return json.dumps(data,ensure_ascii=False)
55
56 # 登录接口
57 @server.route('/login',methods=['post'])
58 def login():
59 username = flask.request.values.get('username')
60 password = flask.request.values.get('password')
61 if username and password:
62 sql = 'select * from app_myuser where username ="%s";' % username
63 result = op_mysql(sql,True)
64 if result:
65 if md5(password) == result.get('passwd'):
66 token = md5(username + str(time.time())) #获取token:用户名+时间戳
67 info = {'username':username,'id':result.get('id')}
68 op_redis(token,json.dumps(info)) #token存到redis里
69 data = {'code':0,'msg':'登录成功','token':token}
70 else:
71 data = {'code':403,'msg':'账号/密码错误'}
72 else:
73 data = {'code': 401, 'msg': '用户不存在'}
74 else:
75 data = {'code': 400, 'msg': '必填参数不能为空'}
76 return json.dumps(data,ensure_ascii=False)
77
78 # 支付接口
79 @server.route('/api/payment',methods=['get'])
80 def payment():
81 token = flask.request.values.get('token')
82 amount = flask.request.values.get('amount')
83 if token:
84 result = op_redis(token)
85 if result:
86 amount = float(amount)
87 result = json.loads(result)
88 userid = result.get('id')
89 sql = 'update app_myuser set balance=balance-%s where id = %s;'%(amount,userid)
90 op_mysql(sql)
91 data = {'code':0,'msg':'支付成功'}
92 else:
93 data = {'code': 401, 'msg': '未登录'}
94 else:
95 data = {'code':401,'msg':'未登录'}
96 return json.dumps(data,ensure_ascii=False)
97
98 server.run(port=9999,debug=True)