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 预期结果 Key1key2 key3     .....(直到创建完)


运行循环创建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 预期结果Key1 key2key3     .....(直到创建完)


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传参了


完结=========================================================================================================




  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值