在接口测试时(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}
不读取第一行,第一行是参数对应的字段行,所以循环时候给循环次数 -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的第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传参了
完结=========================================================================================================