python讀取數據庫準備性能測試賬號數據

       做一個系統的測試,需要根據總測試人數按比例準備各個部門的測試的賬號,其中的賬號數據都從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測試時用的賬號數據了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章