Robot Framework 按行讀Excel,並轉化為list,同時迴圈轉化為dict
在介面測試時(Post)需要傳入引數:
但引數較多時,如果每次都建立,那非常不方便,且不靈活,為了便於維護,將輸入引數在Excel中維護,靈活多變:
直入主題:
Excel引數如下(由於公司安全考慮,欄位引數都會打碼):
我們的介面傳參有12個引數,個別型別有13個引數(多出來這一個通過指令碼判斷,這裡不講)
PS:
左側第一列,是我單獨加的一列,通過讀出第一列的值,判斷走哪個迴圈,進行校驗
Excel中設定 有的非必填項為空,有的必填項為空
有人會說:你上面的資料為什麼都是重複的呢(這是因為每次新增如果成功以後,會有資料回收機制,也就是進行判斷將他刪除)
以下是讀Excel的步驟:
For迴圈註釋:read_myExcel #######讀Excel檔案,並儲存為list open_Excel ${path}\\read_Position_SSP.xls ${count_row_sheet1} get_row_count mytext_filename #get_row_count/get_column_count 獲取文字行/列數 ${Excel_Param_list} Create_list : FOR ${x} IN RANGE ${count_row_sheet1 -1} #讀取Count-1次(不讀取第一行) \ ${read_row_sheet1} Get_Row_Values mytext_filename ${x+1} #mytext_filename是Excel的sheet名,1代表Excel的第一行,讀完${read_column_sheet1_A}是一個list \ Set_suite_variable ${read_row_sheet1} \ 處理每行為一個list \ Insert_Into_List ${Excel_Param_list} ${x} ${row_list} ${count_Excel_Param_list} Evaluate len(${Excel_Param_list}) Set_Suite_Variable ${count_Excel_Param_list} Set_Suite_Variable ${Excel_Param_list} log ${Excel_Param_list}
不讀取第一行,第一行是引數對應的欄位行,所以迴圈時候給迴圈次數 -1
For的第1行:從${x+1}行開始讀取,也就初始是從第一行開始讀(Excel從第0行開始)
For的第3行:"處理每行為一個list"關鍵字,處理完後是個list:${row_list},下文會詳細講(作用:每次讀一行以後把該行轉為list)
For的第4行:將讀到的該行插入到預設的list ${Excel_Param_list}中,${row_list}是最後處理完成的list,${x}為索引index(表示插入到list中的第幾個元素)
For的第5行:統計迴圈完成後list中的元素(list)個數
下面這個就是"處理每行為一個list"關鍵字的內容
For的第1行:將讀到的Excel行的每個值取出*** Keywords *** 處理每行為一個list ${row_list} Create_list ${count_column_sheet1} get_column_count mytext_filename #獲取文字列數 @{int_values_index} Create_list ${1} ${2} ${3} ${4} ${5} ... ${7} ${9} ${10} ${11} ${12} #建立list為int型別的索引 Set_suite_variable ${count_column_sheet1} : FOR ${i} IN RANGE ${count_column_sheet1} #迴圈文字列數次 \ ${row_values} Set_variable ${read_row_sheet1[${i}][1]} \ ${if_Empty} Run_keyword_and_return_status Should_be_equal_As_Strings ${row_values} ${Empty} #判斷是否非空 \ ${NoEmpty_NoString} Run_keyword_if '${if_Empty}'=='False' and ${i} in @{int_values_index} Convert_to_Integer ${row_values} #非空,且index在@{str_values_index}中,則轉為int \ ${int_row_values} Run_keyword_if '${if_Empty}'=='False' and ${i} in @{int_values_index} Convert_to_String ${NoEmpty_NoString} #轉為int後再轉為String \ Run_keyword_if '${if_Empty}'=='False' and ${i} in @{int_values_index} Append_to_list ${row_list} ${int_row_values} #設定為一個新值並追加到list \ Run_keyword_if '${if_Empty}'=='False' and ${i} not in @{int_values_index} Append_to_list ${row_list} ${row_values} #非空,且index不在@{str_values_index}中,則直接追加到list \ Run_keyword_if '${if_Empty}'=='True' Append_to_list ${row_list} ${row_values} #如果為空,則直接追加空值到list \ Set_suite_variable ${row_list}
For的第2行:判斷該值是否為空
For的第3行:
如果該值不為空,且索引在${int_value_index}中(這是預設的非String型別的引數),
先將它轉為int最後將他轉成string(因為Excel讀出來的數字都是float型別,也就是浮點數,例如:1.0)
這裡條件 '${if_Empty}'=='False' and ${i} in @{int_values_index} ,如不位空,且索引在對應的int值中(非空非string),
For的第4行:則將他轉為string型別【為什麼要轉string呢,因為建立dict的時候,key對應的value是string型別】
For的第5行:將讀出來Excel的float引數最終轉為string後,那麼把他追加到預期讀行list :${row_list}
For的第6行:讀出來的引數非空,但不在int索引中(非空值為string),則直接追加到預期讀行list :${row_list}
For的第7行:如果是空值,則也直接追加到預期讀行list :${row_list}
所以第一行的Excel(對應的Excel的行號為2)處理完成後就是這樣的
[u'\u6210\u529f\u8fd4\u56de1', u'1', u'6', u'637', u'886', u'887', u'420*110', u'1', u'Logo\u51a0\u540d-\u9996\u9875', u'31001', u'31001', u'1', u'887']
然後呢,再看看第一個讀Excel迴圈,就好理解了,讀完以後的全部Excel list列表${Excel_Param_list}就是下面這樣:
[ [u'\u6210\u529f\u8fd4\u56de1', u'1', u'6', u'637', u'886', u'887', u'420*110', u'1', u'Logo\u51a0\u540d-\u9996\u9875', u'31001', u'31001', u'1', u'887'] , [XXXXXXX] , [YYYYYY]..... ]
==========================================分割線====================================================
上面已經轉為list了,下面開始把他迴圈轉成dict
首先建立dict的鍵值key:
#建立全域性通用的dict的鍵值,用於快速建立Dict並迴圈賦值
${dict_Keys_list} Create_list 預期結果 Key1key2key3 .....(直到建立完)
執行迴圈建立dict關鍵字:
快速建立Dict關鍵字
Connect_To_Database_Using_Custom_Params pymysql ${connect_mysql}
#快速建立請求引數dict,使用${dict_Keys_list}為key,使用讀Excel後${Excel_Param_list}引數為value
${param_part_left} Create_Dictionary
: FOR ${var} IN RANGE ${count_column_sheet1 -1} #使用‘處理每行為一個list’關鍵字中的列數值-1(不將‘預期結果’鍵迴圈)
\ Set_To_Dictionary ${param_part_left} ${dict_Keys_list[${var+1}]}=${Excel_Param_list[${x}][${var+1}]} #使用執行場景‘三大場景校驗’中的${x}
\ #因為個別廣告位型別(視訊內廣告)有‘序號’欄位sequence,需要SQL判定(通過欄位${Excel_Param_list}中第3~5 進行判斷)
\ ${equal_if_sequence} Query Select sequence from xxxxxxxx where type=${Excel_Param_list[${x}][3]} and positionType=${Excel_Param_list[${x}][4]} and positionSubType=${Excel_Param_list[${x}][5]} is not null limit 1;
\ ${sequence_if_not_null} Run_keyword_and_return_status Should_be_equal_As_Strings ${equal_if_sequence[0][0]} None #判斷查詢結果是否為空
\ Run_keyword_if '${sequence_if_not_null}'=='False' Set_To_Dictionary ${param_part_left} sequence=${equal_if_sequence[0][0]} #如不為空,則將該值設定到字典引數${param_part_left}中
\ log ${param_part_left}
Set_suite_variable ${param_part_left}
Disconnect_From_Database
For迴圈前建立空dict: ${param_part_left} Create_Dictionary
For中的第1行:
Set_To_Dictionary ${param_part_left} ${dict_Keys_list[${var+1}]}=${Excel_Param_list[${x}][${var+1}]} #使用執行場景‘三大場景校驗’中的${x}
這行可能不好理解:${dict_Keys_list[${var+1}]}=${Excel_Param_list[${x}][${var+1}]}
這意思是:用上面建立的鍵key=讀Excel並轉化為list的value
Key示例:
${dict_Keys_list} Create_list 預期結果Key1key2key3 .....(直到建立完)
Value示例:
[u'\u6210\u529f\u8fd4\u56de1', u'1', u'6', u'637', u'886', u'887', u'420*110', u'1', u'Logo\u51a0\u540d-\u9996\u9875', u'31001', u'31001', u'1', u'887']
${dict_Keys_list[${var+1}]}
可以看出第一個key是漢字"預期結果",則他不參與轉化為dict,所以迴圈是從${var+1}開始的(key1開始)
${Excel_Param_list[${x}][${var+1}]}
這個是把讀Excel的值value也是從第一個值開始取(例如:${var+1} 它取第一個就是值 1 ),
這裡這個${x}是另外一個迴圈裡的index,是從0開始的,意思是取${Excel_Param_list[0]}開始,直到取到結束
For中的第3行:判斷查詢這個特殊欄位sequence是否是有值的
For中的第4行:如果查詢結果${equal_if_sequence}有值,和空值進行比對,如不為空,則把這個值設定一個鍵值對到 ${param_part_left}中【如為空值,則不處理】
後面的就好理解了。。。。。
轉化完成後就是這樣:
{'key1' : '1' , ' key2' : '6' , ' key3' : '637' .......... }
迴圈轉完之後就可以進行post傳參了
完結=========================================================================================================