Python接口测试之对MySQL/unittest框架/Requests 的操作
单元测试支持测试自动化、 共享的安装程序和关闭代码测试、
聚合成集合,测试和报告框架从测试的独立性。单元测试模块提供可以很容易地支持这些素质的一组测试的类。关于unittest
测试框架建议可以到官方查看详细的说明以及演示的实例。unittest各个模块的关系为:
#!/usr/bin/env python
#coding:utf-8 import unittest class TestDiv(unittest.TestCase):
def setUp(self):
pass def tearDown(self):
pass def test_001(self):
self.assertEqual(div(1,1),1) def test_002(self):
self.assertRaises(ZeroDivisionError,div,1,0) if __name__=='__main__':
unittest.main(verbosity=2)
最常使用的分别有GET,PUT,DELETE,POST,通过request库也是可以实现
的,见如下的代码:
在python的命令行环境下
看是否可以导入MySQLdb,如果可以导入并且无任何的错误提示,表示已经安装成功了,见截图:
已经很成功的安装了python操作mysql的数据库,在这里,我们详细的介绍对python对mysql的增加,删除,修改
和查询的基本操作,这里使用的数据库名称是“day2017”,我们对数据库的操作,首先是创建数据库,然后是在数据库中
创建表,在这里,表的名称为:userInfo,见创建好的表字段信息:
OK,创建好数据库以及创建好了数据库中的表以后,下来开始操作数据库,操作数据库的第一步当然是连接数据库,然后是
创建游标,接下来是对数据库的各种操作,这里我们先来操作Insert数据的操作,见实现的代码:
#!/usr/bin/env python
#coding:utf-8 import MySQLdb def insert_One():
'''插入一条数据'''
try:
conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='server',db='day2017')
except:
print u'连接mysql数据库失败'
else:
cur = conn.cursor()
sql = 'INSERT INTO userInfo VALUES (%s,%s,%s,%s)'
params = (1, 'admin', 'admin', 'wuya@outlook.com',)
cur.execute(sql, params)
conn.commit()
finally:
cur.close()
conn.close() if __name__=='__main__':
insert_One()
查看数据库,可以看到,数据已经插入到数据库中,见查询的结果:
在上面的案例中,只是插入了单条数据,实际上,某些时候,会插入多条数据,也就是批量插入,批量插入实现的代码为:
def insert_Many():
'''批量插入数据'''
try:
conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='server',db='day2017')
except:
print u'连接mysql数据库失败'
else:
cur = conn.cursor()
sql = 'INSERT INTO userInfo VALUES (%s,%s,%s,%s)'
params = [
(2,'wuya','admin','wuya@outlook.com'),
(3,'weke','admin','weke@outlook.com')
]
cur.executemany(sql, params)
conn.commit()
finally:
cur.close()
conn.close() if __name__=='__main__':
insert_Many()
接下来,我们来查看数据库的查询,数据查询分为二种,一种是查询的结果是一条语句,使用的是fetchone()方法,另外一种是查询的数据
结果是多条,使用的方法是fetchmany(),我们分别来看这二个方法的使用,我们先来看单条数据的查询,见实现的代码:
import MySQLdb def select_one():
'''单条数据的查询'''
try:
conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='server',db='day2017')
except:
print u'连接mysql数据库失败'
else:
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
sql = 'select * from userInfo where id=%s'
params = (1,)
data=cur.execute(sql, params)
print cur.fetchone()
conn.commit()
finally:
cur.close()
conn.close() if __name__=='__main__':
select_one()
多条数据的查询,见实现的代码:
import MySQLdb def select_Many():
'''多条数据的查询'''
try:
conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='server',db='day2017')
except:
print u'连接mysql数据库失败'
else:
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
sql = 'select * from userInfo'
ret=cur.execute(sql)
data=cur.fetchall()
for item in data:
print item
finally:
cur.close()
conn.close() if __name__=='__main__':
select_Many()
下面我们来看更新语句的测试,见实现的代码:
import MySQLdb def update_Test():
'''更新语句测试'''
try:
conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='server',db='day2017')
except:
print u'连接mysql数据库失败'
else:
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
sql = 'update userInfo set username=%s where id=%s'
params=('system',1,)
ret=cur.execute(sql,params)
conn.commit()
finally:
cur.close()
conn.close() if __name__=='__main__':
update_Test()
最后一步,也就是删除数据了,直接看如下的实现代码:
import MySQLdb def delete_Test():
'''删除语句测试'''
try:
conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='server',db='day2017')
except:
print u'连接mysql数据库失败'
else:
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
sql = 'delete from userInfo where id=%s'
params=(3,)
ret=cur.execute(sql,params)
conn.commit()
finally:
cur.close()
conn.close() if __name__=='__main__':
delete_Test()
事实上,对于如上操作数据库的方式,有很多的代码是可以重够的,比如连接数据库的方式,另外,我们可以把操作数据库的
方式写在一个类里面,在业务调用的时候直接调用我们的数据库方法进行操作,见下面操作mysql数据库的方法,见源码:
#!/usr/bin/env python
#coding:utf-8 import MySQLdb class MySQLHelper(object):
def __init__(self):
pass def get_one(self,sql,params):
conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='server',db='day2017')
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
retCount = cur.execute(sql,params)
data = cur.fetchone()
cur.close()
conn.close()
return data def get_many(self,sql,params):
conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='server',db='day2017')
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
retCount = cur.execute(sql,params)
data = cur.fetchall()
cur.close()
conn.close()
return data def insert_one(self,sql,params):
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='server', db='day2017')
cur = conn.cursor()
cur.execute(sql, params)
conn.commit()
cur.close()
return u'插入数据库成功' def insert_many(self,sql,params):
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='server', db='day2017')
cur = conn.cursor()
cur.executemany(sql, params)
conn.commit()
cur.close()
return u'批量插入数据库成功' def update_one(self,sql,params):
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='server', db='day2017')
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
ret = cur.execute(sql, params)
conn.commit()
cur.close()
conn.close()
return u'更新数据库成功' def delete_one(self,sql,params):
conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='server', db='day2017')
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
ret = cur.execute(sql, params)
conn.commit()
cur.close()
conn.close()
return u'删除数据库成功'
把连接数据库部分进行重构,放到一个config.py的文件中,这样我们连接数据库的方法就只需要在config.py文件维护了,而不
需要在如上代码中每个都得看的修改,这实在是很糟糕,见重构后的config.py文件源码:
#!/usr/bin/env python
#coding:utf-8 conn_dict=dict(host='127.0.0.1', user='root', passwd='server', db='day2017')
见重构后操作mysql的数据库方法,见源码:
#!/usr/bin/env python
#coding:utf-8 import MySQLdb
import config class MySQLHelper(object):
def __init__(self):
self.conn=config.conn_dict def get_one(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
retCount = cur.execute(sql,params)
data = cur.fetchone()
cur.close()
conn.close()
return data def get_many(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
retCount = cur.execute(sql,params)
data = cur.fetchall()
cur.close()
conn.close()
return data def insert_one(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor()
cur.execute(sql, params)
conn.commit()
cur.close()
return u'插入数据库成功' def insert_many(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor()
cur.executemany(sql, params)
conn.commit()
cur.close()
return u'批量插入数据库成功' def update_one(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
ret = cur.execute(sql, params)
conn.commit()
cur.close()
conn.close()
return u'更新数据库成功' def delete_one(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
ret = cur.execute(sql, params)
conn.commit()
cur.close()
conn.close()
return u'删除数据库成功'
写数据库的操作方法,是为了进行对业务的操作,要不仅仅写这些没什么实际的意义,如我们实现输入用户名和密码,在
在数据库中验证,如果用户名和密码都是admin,那么通过,如果有其中一个不是admin,就提示用户,请提示用户用户名
或者密码错误,下面来实现这样的一个过程,见实现的源码:
#!/usr/bin/env python
#coding:utf-8 import MySQLdb
import config class MySQLHelper(object):
def __init__(self):
self.conn=config.conn_dict def get_one(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
retCount = cur.execute(sql,params)
data = cur.fetchone()
cur.close()
conn.close()
return data def get_many(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
retCount = cur.execute(sql,params)
data = cur.fetchall()
cur.close()
conn.close()
return data def insert_one(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor()
cur.execute(sql, params)
conn.commit()
cur.close()
return u'插入数据库成功' def insert_many(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor()
cur.executemany(sql, params)
conn.commit()
cur.close()
return u'批量插入数据库成功' def update_one(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
ret = cur.execute(sql, params)
conn.commit()
cur.close()
conn.close()
return u'更新数据库成功' def delete_one(self,sql,params):
conn = MySQLdb.connect(**self.conn)
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
ret = cur.execute(sql, params)
conn.commit()
cur.close()
conn.close()
return u'删除数据库成功' class CheckUserInfo(object):
def __init__(self):
self.__helper=MySQLHelper() def checkValid(self,username,password):
sql='select * from userInfo where username=%s and password=%s'
params=(username,password)
return self.__helper.get_one(sql,params) def info():
username=raw_input(u'请输入你的用户名:\n')
password=raw_input(u'请输入你的密码:\n')
userInfo=CheckUserInfo()
result=userInfo.checkValid(username,password)
if not result:
print u'用户名或者密码错误,请联系管理员'
else:
print u'恭喜您,输入正确!' if __name__=='__main__':
info()
Python接口测试之对MySQL/unittest框架/Requests 的操作的更多相关文章
- 【python接口自动化】初识unittest框架
本文将介绍单元测试的基础版及使用unittest框架的单元测试. 完成以下需求的代码编写,并实现单元测试 账号正确,密码正确,返回{"msg":"账号密码正确,登录成功& ...
- Python接口测试之对MySQL的操作(六)
本文章主要来说python对mysql数据库的基本操作,当然,前提是已经搭建了python环境和搭建了Mysql 数据库的环境,python操作mysql数据库提供了MySQLdb库,下载的地址为: ...
- python接口测试之mock(二)
上一篇对mock-server已经做了初步的介绍,今天这里继续接着之前的介绍进行,我们先看之前的mock-server部分,之前编写了一个登录的mock,具体json文件见如下的内容: 小王子1110 ...
- Python接口测试之unittest框架(五)
Test-driven development(TDD)开发模式在今天已经不是什么新奇的事了,它的开发思维是在开发一个产品功能的时候,先 编写好该功能的测试代码,在编写开发比如,比如要写二个数相除的函 ...
- Python接口测试之moco
在现在的软件开发过程中,特别是app的部分,需要的很多数据以及内容,都是来自server端的API,但是不能保证 在客户端开发的时候,api在server端已经开发完成,专门等着前端来调用,理想的情况 ...
- python接口测试之requests库(一)
一.requests库的安装 requests库作为第三方库,需要安装 cmd模式下,运行pip install requests 二.在学习如何发送请求之前,我们先来了解一下requests库,查看 ...
- Python接口测试之封装requests
首先安装requests库: pip install requests test_requests.py 首先在TestRequest类中封装get与post方法, import requests i ...
- python接口测试之新手篇
嗨,大家好,我是小白,好久没写博客了,最近公司搞什么python的接口测试,心里一阵狂喜,在公司上百个接口里拿出一个主要接口一顿乱搞,好在搞通了 但是在这过程中也碰到了好多的问题,决定将问题分享出来能 ...
- python接口测试之mock(三)
前面介绍了moco的详细的使用,它主要是基于moco-runner-0.11.0-standalone.jar,通过编写json的文件来实现,mock翻译过来就是模拟的意思,也就是说,它是将测试对象所 ...
随机推荐
- 网站开发进阶(二十六)js刷新页面方法大全
js刷新页面方法大全 在项目开发过程中,需要实现刷新页面.经过学习,发现下面这条语句就可以轻松实现. location.reload(); // 刷新页面 有关刷新页面的其它方法,具体学习内容如下,有 ...
- LeetCode之“排序”:Largest Number
题目链接 题目要求: Given a list of non negative integers, arrange them such that they form the largest numbe ...
- GCC/gcc/g++/CC/cc区别
平常在Linux上经常会用到gcc或者g++来编译程序,但对这两者的理解也就停留在一个是用来编译C程序,另一个是用来编译C++程序的(请注意:这种说法是有问题的,待会改进). 1. GCC GCC,是 ...
- windows的服务中的登录身份本地系统账户、本地服务账户和网络服务账户修改
以一个redis服务为例: 一个redis注册服务后一般是网络服务账户,但是当系统不存在网络服务账户时,就会导致redis服务无法正常启动.接下来修改redis服务的登录身份. cmd下输入如下命令: ...
- XMPP系列(五)---文件传输
xmpp中发送文件和接收文件的处理有些不太一样,接收文件处理比较简单,发送稍微复杂一些. 首先需要在XMPPFramework.h中添加文件传输类 //文件传输 //接收文件 #import &quo ...
- iOS AFNetworking使用技巧与问题
1.很多初学者,在每处用到网络请求的地方会直接拿afn实例去请求,从而带来了后续难以维护代码的问题 [[AFHTTPSessionManager manager] POST:nil parameter ...
- JAVA_Lock
今天是毕业入职的第一个周末,一直对多线程并发方面的知识比较感兴趣,因为目前我手里的项目并没有涉及到并发方面的知识,所以怕以后遗忘,也便于以后复习和使用,所以总结了一下Lock里面的一些类的方法.具体的 ...
- OpenShift实战(七):OpenShift定制镜像S2I
1.基础镜像制作 由于公司的程序是Java开发,上线发布使用的是maven,如果使用openshift自带的S2I,每次都会全量拉取代码(代码比较多,每次全量拉太慢),然后每次打包都会再一次下载mav ...
- 鹅厂优文|打通小程序音视频和webRTC
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯视频云终端技术总监常青, 2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ.手机QQ.QQ物联 等产品 ...
- GitHub Desktop 如何创建本地仓库,上传代码,删除仓库
1.创建本地仓库 2.打开本地仓库,将要上传的文件放到本地仓库. 3.ctrl+p push仓库或者菜单栏Repository下push也可以用右上角的publish respository 4.左边 ...