在B/S架構的系統測試中,有時需要通過導入excel文件來生成一些數據記錄,當數據量小的時候,一般不會出現什么問題,而當導入的數據量巨大時,對系統的性能就是一個考驗了。為了驗證系統的性能,有時需要導入海量的數據,如30萬條數據記錄,而手頭並沒有這么多數據時該怎么辦呢?一條一條復制粘貼,或者通過excel的下拉拖動來生成記錄?這樣會把測試人員累死,而且單調重復的工作,非常無趣。這時,我們只需借助python,便可以輕松生成大量數據,把人從單調重復的工作中解放出來,去做更有意義的事。
例如,我們需要生成如下的數據。
這是一條用戶信息的示例數據,其中包含幾種編號、姓名、性別、愛好、最喜歡的電影、音樂等信息,而其中只需校驗A、I、L這三列的不同編號。其他數據在性能測試中不是很關心,那么我們可以利用規則生成一些數據,其中僅A、I、L三列不同,其他信息保持不變。
思路:先將表頭和示例數據保存在一個示例文件中,通過xlrd來讀取示例內容,通過xlsxwriter來按規則寫入表頭和不同的信息。
話不多說,我們直接上代碼:
1 import xlrd 2 import xlsxwriter 3 #文件名以及路徑,前面加一個r防止生成不必要的轉義。 4 filename=r'D:\001\example.xlsx' 5 data = xlrd.open_workbook(filename) 6 # 獲取第1個sheet頁 7 table = data.sheets()[0] 8 # 獲取第2行(第1條)數據 9 content=table.row(1) 10 print('第1條示例數據為:',content) 11 # 通過上面print內容可以看到,直接讀出的內容,雖然是list,但每條數據前加了 12 # text:字樣,不能直接強轉成tuple為我們所用,於是自定義一個轉換方法將其轉換為可以用的list以便后面強轉成tuple 13 def convertRowToTuple(rowNum): 14 data=[] 15 # len(content)是上面獲取到的該行的數據列數 16 for i in range(len(content)): 17 data.append(table.cell_value(rowNum,i)) 18 # 將每個單元格中的數據讀取出來加到data這個list中並強轉成元組返回 19 return tuple(data) 20 # 將第0行(即excel中的第1行表頭)數據讀取並轉成元組賦給header 21 header=convertRowToTuple(0) 22 # 將第1行(即excel中的第2行)示例數據讀取並轉成元組賦給data1 23 data1=convertRowToTuple(1) 24 # print(header) 25 # print(data1) 26 # 即將寫入數據的文件名 27 filename2=r'D:\001\TestDatas2.xlsx' 28 # 如果數據量非常大,可以啟用constant_memory,這是一種順序寫入模式,得到一行數據就立刻寫入一行,而不會把所有的數據都保持在內存中。 29 # 如果不啟用此模式,當數據量巨大時,程序很大概率地卡死 30 workbook = xlsxwriter.Workbook(filename2, {'constant_memory': True}) 31 # 創建新的sheet頁 32 worksheet = workbook.add_worksheet() 33 # startNum表示從第幾行開始寫,這里的數字是從1開始,因為后面要和字母組合對應在excel中,如A1代表第1行第A列 34 startNum=1 35 # 初始值,后面的數字在它們的基礎上依次增加 36 startValues=['000001','245353','24289796'] 37 # 初始值對應的列 38 col=['A','I','L'] 39 #先將表頭寫入文件 40 worksheet.write_row('A'+str(startNum), header) 41 # 正式開始寫入數據 42 for i in range(300000): 43 # 為了不讓生成過程無聊,加此打印信息以便查看進度 44 print('正創建第',i+1,'條數據') 45 # 表頭占據了第1行,所以首條數據從第2行開始,當i=0時,寫入的數據從A2開始 46 # 將data1中的數據依次寫入A2、B2、C2…… 47 worksheet.write_row('A'+str(startNum+i+1), data1) 48 # 前面相當於復制了第一條數據的所有內容,但是A、I、L三列內容需要依次往下排,因此我們將重寫每行中A I L單元格中的值 49 for m in col: 50 length=len(startValues[col.index(m)]) 51 # 數字用初始值加上i 52 content=str(int(startValues[col.index(m)])+i) 53 # 因為像000001這樣的數字在計算中會丟失前面的0,為了保持位數,將失去的0再給它補回來 54 if(len(content)<length): 55 content='0'*(length-len(content))+content 56 # 將計算好的值寫入到對應的單元格中 57 worksheet.write(m+str(startNum+i+1), content) 58 # 寫完之后關閉workbook,否則會報錯 59 workbook.close()
接下來,生成數據的活交給計算機,讓我們去泡杯茶,靜待數據生成成功吧!
經測試,生成30萬條數據僅需大約4min!