項目中,api的請求參數基本都是json格式
請求參數 類型 基本 string,int,bool,datetime,decimal,泛型,集合
假定一個api的請求參數為以下json格式的字符串,基本包含了常用的類型
dic1 = """{
"a": [{"aa": "string"}],
"b": ["string"],
"c": "string",
"d": "bool",
"e": "int",
"f": {"ff": "string", "gg": "int"}
}"""
需要對每一個參數做基礎驗證,比如說string類型的參數傳"",NULL,特殊字符,超長字符等等
需要對每個參數依次替換,生成對應的測試用例
先指定每個類型的需要測試的范圍
def get_type_base_value(_type):
"""根據類型獲取基礎測試的值"""
if _type == 'string':
# string類型測試,空,NULL,特殊字符,腳本,正常字符,超長字符
return ["", None, "!@#$%^&*()_+<>?:{}|~`", "<JavaScript>alert(0)</JavaScript>", "test_string","qwertyuiooasdfghjklzxcvbnmazxwsedrtfrrfugyyyfyhjjjkgughsdjgagfjdbdbsddkakdfhakjnnnnnnnnnnnnnkjguyy234567iujwertyuiosdfghjkxcvbmsdfghjkqwertyuizxcvbnasdfghjwertyui234tydfgcvdfrc c1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik9ol0pqwertyuiopdfghjklzxcvbnm"]
elif _type == 'time':
# 時間類型測試 錯誤的年,月,日,非時間類值, 當前時間
return ["0000-01-01", "1600-01-01", "2010-13-30", "2010-02-30", "not_time", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())]
elif _type == 'int':
# 整型測試 非數字類型,溢出, 0
return ["not_int", 12567890123456781234567123451234567, -12345678912345678912345678901234567, 0]
elif _type == 'decimal':
# 浮點測試 非數字類型,溢出, 0
return ["not_decimal", 12567890123456781234567123451234567.88, -12345678912345678912345678901234567.50, 0.00]
elif _type == 'bool':
# 布爾類型 非布爾類型, True, False
return ["not_bool", True, False]
else:
# 遞歸方法
return recursive_case(_type)
然后開始替換參數值
def create_base_case(_source):
return_list = []
for k, v in _source.items():
for _value in get_type_base_value(v):
dic_cp2 = copy.deepcopy(_source)
dic_cp2[k] = _value
return_list.append(dic_cp2) # 改成 return_list.append(replace_default(dic_cp2)) 非測試參數替換成替換默認值
return return_list
簡單類型都被替換了,復雜類型則需要遞歸替換里面的參數
def recursive_case(_type):
"""遞歸,返回特殊類型的取值范圍"""
if isinstance(_type, list):
new_list = []
if isinstance(_type[0], dict):
t_value_list = create_base_case(_type[0]) # 基礎測試用例設計
for t_value in t_value_list:
new_list.append([t_value])
else:
for _value in get_type_base_value(_type[0]):
new_list.append([_value])
return new_list
elif isinstance(_type, dict):
return create_base_case(_type)
else:
return [None]
除卻需要測試的值,其他類型全部替換成默認值
def replace_default(dic):
"""替換成默認值"""
for k, v in dic.items():
if isinstance(v, list):
if isinstance(v[0], dict):
dic[k] = [replace_default(v[0])]
else:
dic[k] = [default_value(v[0])]
elif isinstance(v, dict):
dic[k] = replace_default(v)
else:
dic[k] = default_value(v)
return dic
def default_value(_type):
if _type == 'string':
return "default_string"
elif _type == 'time':
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
elif _type == 'int':
return 0
elif _type == 'decimal':
return 0.00
elif _type == 'bool':
return True
else:
return _type
測試一下
case_list2 = create_base_case(dic1)
print(len(case_list2))
for case in case_list2:
print(case)
實際應用