尾大不掉,前阵子做检索测试时,总是因为需要业务端操作db和一些其他服务,这就使得检索测试对环境和数据依赖性特别高,极大提高了测试成本。
Mock服务和mysql可以很好的解决这个问题,所以那阵子做了两个工作:
1 使用公司的service框架Mock服务;
2 使用python语言Mock mysql数据。
部分1只需要了解公司框架即可进行编写,本文主要记录下python操作mysql的部分。
一 安装环境
安装python即需要的MySQLdb模块(yum install MySQL-python.x86_64),如下,安装成功。
[root@bjdhj-118-69 ~]# python Python 2.6.6 (r266:84292, Feb 22 2013, 00:00:18) [GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import MySQLdb >>>
二 实现python操作数据库
1 我第一次实现的是读取文件操作数据库(注释掉的为自增键处理)如下:
#-*- coding:utf-8 -*- import MySQLdb from itertools import islice try: conn = MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306,charset='utf8')#连接mysqldb cur = conn.cursor() conn.select_db('test') # cur.execute('select max(id) from student')#获取mysql中该表的自增键最大值,向后添加。 # maxid = cur.fetchall()[0] # print 'maxid%id'%maxid # start = count+1 f = file('data2.txt') list = [] line_num = 1 for line in islice(f,1,None):#读取txt文件,跳过标题行 strs = line.split(",") #文件各字段逗号分隔 line_num = line_num+1 print len(strs) if len(strs)!=25: #缺少字段时,跳过该行 print '%d 行缺少字段,请检查文件'%line_num continue data = (strs[0],strs[1],strs[2],strs[3],strs[4],strs[5],strs[6],strs[7],strs[8],strs[9],strs[10],strs[11],strs[12],strs[13],strs[14],strs[15],strs[16],strs[17],strs[18],strs[19],strs[20],strs[21],strs[22],strs[23],strs[24].replace(" ","")) #对strs[24]空格进行处理 print data # start = start+1 list.append(data) #将data记录到list中,对list执行插入操作 f.close cur.executemany('insert into creative_info_test values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',list) conn.commit() #提交 cur.close() conn.close() print 'OK' except MySQLdb.Error,e: print "MySQL Error %d:%s"%(e.args[0],e.args[1])
2 领导说每条记录字段太多了(多表多字段),让我固定到脚本里,再单独更改,于是对第一版进行了修改,使用了字典dict:
#-*- coding:utf-8 -*- import MySQLdb conn = MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306,charset='utf8')#连接mysqldb cur = conn.cursor() conn.select_db('test')
#逻辑:一次操作只为一次测试使用,所以第一步清除记录;第二步根据条数插入数据;第三个对插入数据进行个性化设置(部分字段的更新)。
try:
Delete()#数据清除 Producer()#将默认数据插入mysql,注意自增主键 Update()#个性化数据更新 conn.commit()#提交 cur.close() conn.close() except MySQLdb.Error,e: print 'MySQL Error %d,%s'%(e.args[0],e.args[1])
#具体实现:插入数据,由于多表插入,切表与表之间有相同字段,所以根据条数做统一设置。 def Producer(): print 'input numbers :' num = input()#请多写一条 for i in range(1,num): table1['user_id']=i table2['user_id']=i... #insert table1 user_info = [user['user_id']...] cur.execute('insert into user_test values(%s,...)',table1) #insert table2 ...以下类似处理 def Update(): print 'input your sql语句 file name:' filename = raw_input() f=file(filename) for line in f.readlines(): operator your sql update #写update语句即可 def Delete(): cur.execute('delete from table1') cur.execute('delete from table2')
... #每个表对应一个dict,其字段为字典元素,为各字段设置默认值 table1={ 'user_id':'5185173207809', 'user_name':
..., } table2={ ... }
三 附excel文件的读取,嗯,顺便感慨,python真棒:
import csv f = open('creative_info_test.csv','rb') reader = csv.reader(f) for row in reader: print row f.close