1. 程式人生 > >Robot Framework 按行讀Excel,並轉化為list,同時迴圈轉化為dict

Robot Framework 按行讀Excel,並轉化為list,同時迴圈轉化為dict

在介面測試時(Post)需要傳入引數:

但引數較多時,如果每次都建立,那非常不方便,且不靈活,為了便於維護,將輸入引數在Excel中維護,靈活多變:

直入主題:

Excel引數如下(由於公司安全考慮,欄位引數都會打碼):

我們的介面傳參有12個引數,個別型別有13個引數(多出來這一個通過指令碼判斷,這裡不講)

PS:

左側第一列,是我單獨加的一列,通過讀出第一列的值,判斷走哪個迴圈,進行校驗

Excel中設定 有的非必填項為空,有的必填項為空

有人會說:你上面的資料為什麼都是重複的呢(這是因為每次新增如果成功以後,會有資料回收機制,也就是進行判斷將他刪除)

以下是讀Excel的步驟:

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}
For迴圈註釋:

不讀取第一行,第一行是引數對應的欄位行,所以迴圈時候給迴圈次數 -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"關鍵字的內容

*** 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的第1行:將讀到的Excel行的每個值取出

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傳參了

完結=========================================================================================================