python读取数据库准备性能测试账号数据

来源:互联网 发布:交通数据百度百科 编辑:程序博客网 时间:2024/03/29 09:35

       做一个系统的测试,需要根据总测试人数按比例准备各个部门的测试的账号,其中的账号数据都从SQL Server中读取。为了简化工作,制作了一个python脚本。可以生成LoadRunner参数化中使用的dat数据文件。


1、由于SQL Server语句十分长,可以使用三个双引号的方式将多行文本括起来,其中如where id='0102'中'0102'这样的运算符后面的数可以参数化,用“?”表示,然后列出参数表,如:
cursor.execute("""
               select user_id, user_name
                 from users
                where last_logon < ?
                  and bill_overdue = ?
               """, '2001-01-01', 'y')

2、python从数据库中读出的数据最终是要写入.dat文件中的,文件操作函数与txt函数的操作一样,只不过open处改了后缀。(写入方式的不同:‘w’会覆盖之前的内容,‘a’不覆盖之前写好的内容,继续在后面添加)
由于LoadRunner会将数据的第一行看做是名称,因此在读取数据库中数据前,应当先写入一行名字行。
LoadRunner能读的逗号是英文的半角
f=open(r'd://550.dat','w')
f.write('StuffCode'+','+'loginID'+','+'NickName'+'\n')

3、要注意,写入时需要使用gbk编码,LoadRunner读入dat后缀文件时,只能正确读入gbk编码方式的文本,如果不加干涉直接输出,那么生成的dat文件在loadrunner中看,就会发现中文都被显示为乱码了,解决方法就是在输出中文时在后面再用函数encode进行gbk编码
在python中写入SQL语言由于每个部门的人数不同,因此希望select top x,x希望是一个变量,遗憾的是,python无法将这样的值用参数代替,因此我只能曲折的使用了fetchmany(x),同样成功取出结果中的前x个数

results=cur.fetchmany(num)

for r in results:
f.write(r[0]+','+r[1]+','+r[2].encode('gbk')+'\n')

4、如果不在最开始对python的数据编码方式进行转换,那么会报以下错误
UnicodeEncodeError: 'ascii' codec can't encode characters in position 47-48: ordinal not in range(128)
在读入文件前要加入
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
print sys.getdefaultencoding()


5、按比例分配就存在“总数*百分比”这样的计算,结果是一个浮点数,但我需要取出的是一个含义为“人的个数”的值,因此需要强制转换为整数值,表达式前加入int即可:“int(总数*百分比)”
因为在求取部门人数比例的时候会遇到计算部门人数/总人数,这个结果是一个小于1的数,所以python对两个整数的“/”计算结果为0。解决方法就是在定义部门人数的数组时,直接定义为浮点数,即129.00,python自带的sum()函数就可以对浮点数求和了。将各部门人数装在一个数组中,p=[123.00,124.00,12.00],sum(p)即可
讲一个插曲:平时用LoadRunner是用的C编程,看到求和直觉反应就在python里面敲如
for i in range(0,3):
    sum+=p[i]
这样写python会提示只有整数相加才能这么用的。实际在python中,语法的使用更加灵活,平时在C编程环境中习惯了,有时反而会误导自己,当然,深究起来,还是python学得不扎实,所以会想不到去用自带函数。



附完整代码:
import  pyodbc
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
print sys.getdefaultencoding()

PEOPLE=550 ##总人数,每次测试时不同
f=open(r'd://test.dat','w')
f.write('StuffCode'+','+'loginID'+','+'NickName'+'\n') ##LoadRunner默认标题行
q=['020','030','040','130','140','901','902','903','104'] ##部门编号
p=[133.00,29.00,49.00,17.00,14.00,179.00,170.00,168.00,68.00] ##部门人数
test=PEOPLE*1.2 ##账号留出20%的余量
print test

cnxn=pyodbc.connect("DRIVER={SQL SERVER};SERVER=[IP];DATABASE=[数据库名];UID=[账号];PWD=[密码]")
cur=cnxn.cursor()

for i in range(0,9):
num=int(test*(p[i]/sum(p)))
cur.execute("""select B.AccountId,A.LoginId,A.NickName , C.deptcode from Account as A
left join AccountOfDepartment as B on A.Id=B.AccountId
left join Departments as C on B.DepartId=C.Id
where Password like '0000'
and A.RecordState = 2
and C.DeptCode like ?
order by DeptCode,LoginId""",
q[i])
print (num)
print q[i]

results=cur.fetchmany(num)
for r in results:
f.write(r[0]+','+r[1]+','+r[2].encode('gbk')+'\n')

f.close()
cur.close()
cnxn.close()

这样每次修改一下PEOPLE总人数,运行一下就可以做出一个用LoadRunner测试时用的账号数据了。
0 0
原创粉丝点击