于进入主题了,前面的准备工作都已经做好了,下面就开始写逻辑的代码了,代码我已经写好了,每行都加了注释,不明白的可以留言。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#api.py
 
from flask import Flask ,jsonify,request
import sqlite3
 
#因为有些异常情况的时候需要提示异常信息,所以咱们需要事先定义一些错误信息,以及错误码
#请求方式错误
method_err = {
    "code":301,
    "msg":"请求方式不正确,只支持post请求"
}
#参数错误
param_err = {
    "code":302,
    "msg":"请求参数错误,请检查入参"
}
#余额不足
money_err = {
    "code":303,
    "msg":"账户余额不足"
}
 
#价格错误
price_err = {
    "code":304,
    "msg":"价格不合法"
}
 
#用户不存在
user_err =  {
    "code":305,
    "msg":"该用户不存在"
}
 
 
 
#成功的信息
success_msg = {
    "code":200,
    "msg":"支付成功"
}
 
#数据库异常
db_err = {
    "code":306,
    "msg":"数据库错误"
}
 
 
#导入我们需要用到的模块,Flask是用来创建我们写的这个接口的服务
#jsonify是用来序列化json的,因为http_api接口都是返回的json串
#request是用来获取调用接口的时候传入的数据,这几个模块都是falsk里面的
 
 
app = Flask(__name__)
#这个是初始化一个服务,__name__代表是咱们写的这个python文件,
#也就是咱们这个python文件就是一个服务了,然后赋值给app,app就代表这个服务了
 
app.config['JSON_AS_ASCII'] = False
#支付的时候,传入金额,金额可能有小数类型的,也可能有整数类型的
#因为python里面没有一个内置的方法去判断字符串是不是小数,所有下面自己写了
#一个方法去校验是否为正小数
def check_float(string):
    str1 = str(string)
    if str1.count('.') > 1:  # 判断小数点是不是大于1
        return False
    elif str1.count('-') > 0:  # 判断负号的个数,如果大于0就是非法的
        return False
    elif str1.isdigit():
        return False # 判断是不是整数
    else:
        new_str = str1.split('.')  # 按小数点分割字符
        frist_num = new_str[0]  # 取分割完之后这个list的第一个元素
        if frist_num.isdigit() and new_str[1].isdigit():
            # 如果小数点两边都是整数的话,那么就是一个小数
            return True
        else:
            return False
 
 
#因后面要经常操作数据,咱们就写一个函数专门来操作数据库
def op_db(sql):
    db = sqlite3.connect(r'C:\Users\admin\Desktop\my.db')  # 指定数据库
    course = db.cursor()  # 创建游标
    try:#捕捉异常,如果有sql写的不对就返回异常
        course.execute(sql)  # 执行sql
    except sqlite3.Error as e:
        #出异常了就返回错误信息
        return False
    else:
        res = course.fetchone()
        #获取查询结果
        db.commit()
        return res
        #返回数据
    finally:
        #不管出没出异常都关闭数据库
        course.close()
        db.rollback()#回滚
        db.close()
 
def check_balance(user_id, price):
    select_sql = 'select money from accounts where user_id = %s;'%user_id
    data = op_db(select_sql)  # 获取sql执行的结果
    if data:  # 如果返回的数据不是空的话
        if not data:
            #not就是取反的意思,如果返回False的话,就是真了,就说明出错了,返回数据库错误
            return db_err
        else:  # 如果select有结果的话,就获取到这个用户的账号信息
            money = data[0]#数据库获取到的结果是一个元组,就一个元素就是价格
            if money >= price:  # 如果账户余额大于等于价格的话,修改价格
                target_money = money - price
                #更新余额的sql
                update_sql = 'update accounts set money = %s where user_id = %s;'%(target_money,user_id)
                op_db(update_sql)  # 更新余额
                return success_msg  # 返回成功信息
            else:  # 如果余额不足的话,返回余额错误信息
                return money_err
    else:  # 如果数据是空,就是用户信息获取不到
        return user_err
 
#这个是给咱们刚才创建的服务加一个路由,也就是指定这个接口的访问url,
# 支持什么请求方式,get或者post请求,route方法第一个参数就是访问的路径,
# methods是支持哪种类型的请求,route方法是一个装饰器,必须写在业务逻辑的函数上面
@app.route('/pay',methods=['POST','GET'])
def pay():
    #def pay()就是定义一个函数,这个函数里面写的就是接口的业务逻辑了
    if request.method != 'POST':#如果不是post请求的话,返回请求类型错误
        return jsonify(method_err)
        #return 就返回数据了,jsonify就是把python里面的数据类型(字典、list)转成json串
    else:
        user_id = request.values.get('user_id')
        #使用request.values.get获取到传入的参数,user_id
        price = request.values.get('price')
        #获取到支付的价格
        if user_id and price:
            #判断两个入参是否都传了,user_id和price
            if price.isdigit():#如果价格是整数的话
                price = int(price)
                #接收过来的入参是字符串类型的,所以要转成int类型的,才可以加减
            elif check_float(price):
                #这里调用了一个函数,在上面定义了,是校验传入的价格是不是小数的
                price = float(price)
            else:#如果不是整数也不是小数,返回价格错误
                return jsonify(param_err)
            #上面都校验通过之后,数据就是合法的,就得扣钱了,那就是操作数据库
            #再写一个函数专门用来扣钱
            res = check_balance(user_id,price)#调用检查余额函数
 
            return jsonify(res)#返回结果
        else:#如果name或者价格获取不到的话,返回参数错误
            return jsonify(param_err)
 
if __name__=='__main__':
    app.run(debug=True)#运行程序,debug的意思是调试模式运行,可以看到请求,默认端口号是5000,可以使用port参数指定端
口号
 
#运行完之后会显示这样的
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!

ok,代码就是上面的,每个单独的功能都拆分出来做了单独的函数来工作,这样代码就不会显得比较乱了。

下面咱们来测试一下,看看有没有bug

先来个正常的通过性测试:

再来俩异常验证,一个价格错误的,一个用户不存在的。

大功告成,都验证通过了,当然还有很多没有验证,留着大家动动手吧。

测试开发系列之Python开发mock接口(三)的更多相关文章

  1. 测试开发系列之Python开发mock接口(一)

    什么是mock接口呢,举个栗子,你在一家电商公司,有查看商品.购物.支付.发 货.收获等等等一大堆功能,你是一个测试人员,测测测,测到支付功能的时候,你就要调用第三方支付接口了,真实支付,直接扣你支付 ...

  2. 测试开发系列之Python开发mock接口(二)

    上一篇咱们已经把开发前的环境准备好了,还需要再做一点准备,你的账户信息是存在哪的呢,当然是存在数据库里的,咱们在去支付,扣钱的时候,肯定是从数据库里面操作的,去更新账户表里面的数据,所以咱们先要把数据 ...

  3. 《C#微信开发系列(3)-获取接口调用凭据》

    3.0获取接口调用凭据 ①接口说明 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留 ...

  4. (一)react-native开发系列之Mac开发环境配置

    写在前面 在开始之前,先说下选择react-native的背景原因 最近一年来,公司为了节省开发成本,以及降低维护成本,指派我开始做起前端开发app的工作,我和公司的小伙伴们就开始了漫长的app开发之 ...

  5. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

  6. visual studio 2015 搭建python开发环境,python入门到精通[三]

    在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...

  7. #2020征文-开发板#使用Python开发鸿蒙应用--2021.01.07直播图文

    写在前面: 每年的过年前夕,手中的项目一定会告急...而自己又缺乏三头六臂七十二变等特技,所以只能在鸿蒙社区先消失一阵子了.今天再看社区的帖子,发现大家的进步可不一般,各种案例示例层出不穷,一片欣欣向 ...

  8. Android开发系列之搭建开发环境

    接触Android好久了,记得09年刚在中国大陆有点苗头的时候,我就知道了google有个Android,它是智能机操作系统.后来在Android出1.5版本之后,我第一时间下载了eclipse开发工 ...

  9. 测试平台系列(71) Python定时任务方案

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 定时任务 定时任务,顾名思义: ...

随机推荐

  1. Java生成固定长度的随机字符串(以大小写字母和数字)

    package org.jimmy.autosearch2019.test; import java.util.ArrayList; import java.util.Random; /** * @a ...

  2. 如何在Mac OS X中开启或关闭显示隐藏文件命令

    打开终端,输入:defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件defaults write com.app ...

  3. WINDOWS-基础:_T

    _T("")是一个宏,定义于tchar.h下. #define __T(x) L ## x #define _T(x) __T(x) 作用 他的作用是让你的程序支持Unicode编 ...

  4. [BZOJ3631]:[JLOI2014]松鼠的新家(LCA+树上差分)

    题目传送门 题目描述: 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...

  5. 用jquery操作xml文件

    一. xml文件\内容读取 1.读取xml文件 $.get( xmlfile.xml , function (xml){ //xml即为可以读取使用的内容,具体读取见第2点 }); 2.读取xml内容 ...

  6. windows 使用git上传代码至github

    1. 首先创建github账户 2. 创建github项目 3.  windows安装git工具 ·下载地址:https://git-for-windows.github.io/ ,下载直接安装即可, ...

  7. Python Importlib模块与__import__详解

    Importlib模块与__import__都可以通过过字符串来导入另外一个模块,但在用法上和本质上都有很大的不同. 以一个例子为证: 以下为我的工程目录结构: lib/test.py: name = ...

  8. (转)WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    [root@bak1 bak]# scp gwsyj.sql.gz root@192.168.21.65:/data/dbdata/ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  9. POJ 2955 区间DP Brackets

    求一个括号的最大匹配数,这个题可以和UVa 1626比较着看. 注意题目背景一样,但是所求不一样. 回到这道题上来,设d(i, j)表示子序列Si ~ Sj的字符串中最大匹配数,如果Si 与 Sj能配 ...

  10. 大数据学习——scala入门程序

    安装scala.msi https://blog.csdn.net/sinat_32867867/article/details/80305302 notepad++ object HelloScal ...