1. 对于接口自动化测试, 一般接口以 JSON 形式发送返回, 往往我们就需要遍历 JSON 文件中所有 key,value 以及修改替换 key 对于的 value.
例如 JSON 发送 / 接收的文件:
SendRegisterVerificationCodejson_txt = """{"header":{"funcNo":"IF010002","opStation":"11.11.1.1","appId":"aaaaaa","deviceId":"kk","ver":"wx-1.0","channel":"4"},"payload": {"mobileTel":"13817120001"
}
}
"""
需要查找所有的报文中的 key,value, 这个 JSON 是字典包含字典的形式, 如遍历字典后, 依旧含有 key 对应的 value 值是字典, 需要继续遍历, 此时需要用递归进行处理
代码如下:
- import JSON
- #JSON 文件发送形式
- SendRegisterVerificationCodejson_txt = """
- {
- "header":{
- "funcNo": "IF010002",
- "opStation": "11.11.1.1",
- "appId": "aaaaaa",
- "deviceId": "kk",
- "ver":"wx-1.0",
- "channel": "4"
- },
- "payload": {
- "mobileTel": "13817120001"
- }
- }
- """
- date_json = JSON.loads(SendRegisterVerificationCodejson_txt)
- print(date_json)
- print("*"*10)
- # 发送时, 每次需要注册新的手机号码, 就需要 JSON 每次提示 mobileTel 的 value 进行发送
- #遍历 JSON 文件所有的 key 对应的 value
- dic ={}
- def json_txt(dic_json):
- if isinstance(dic_json,dict): #判断是否是字典类型 isinstance 返回 True false
- for key in dic_json:
- if isinstance(dic_json[key],dict):# 如果 dic_json[key] 依旧是字典类型
- print("****key--:%s value--: %s"%(key,dic_json[key]))
- json_txt(dic_json[key])
- dic[key] = dic_json[key]
- else:
- print("****key--:%s value--: %s"%(key,dic_json[key]))
- dic[key] = dic_json[key]
- json_txt(date_json)
- print("dic ---:"+str(dic))
输出结果:
- data_json: {
- 'header': {
- 'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'
- }, 'payload': {
- 'mobileTel': '13817120001'
- }
- }
- data_json: {
- 'header': {
- 'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'
- }, 'payload': {
- 'mobileTel': '13817120001'
- }
- }
- **********
- ****key--:header ,value--: {
- 'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'
- }
- ****key--:funcNo ,value--: IF010002
- ****key--:opStation ,value--: 11.11.1.1
- ****key--:appId ,value--: aaaaaa
- ****key--:deviceId ,value--: kk
- ****key--:ver ,value--: wx-1.0
- ****key--:channel ,value--: 4
- ****key--:payload ,value--: {
- 'mobileTel': '13817120001'
- }
- ****key--:mobileTel ,value--: 13817120001
- dic ---: {
- 'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4', 'header': {
- 'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'
- }, 'mobileTel': '13817120001', 'payload': {
- 'mobileTel': '13817120001'
- }
- }
2. 对于接口测试, JSON 主体内容不变, 一般我们都是修改 JSON 内 key 对于的 value 值进行测试, 这个接口是手机号注册的接口, 正常情况我们都是修改手机号进行测试;
如将 key --'mobileTel'对于的 value-- '13817120001'修改, 假如修改为 13333333333;
那我们需要在遍历 JSON 字典 key 值后, 比对如果遍历到对于的 key 则修改其 value.
- def check_json_value(dic_json,k,v):
- if isinstance(dic_json,dict):
- for key in dic_json:
- if key == k:
- dic_json[key] = v
- elif isinstance(dic_json[key],dict):
- check_json_value(dic_json[key],k,v)
- print("date_json 变更前 :")
- print(date_json)
- check_json_value(date_json,'mobileTel','13333333333')
- print("date_json 变更后 :")
- print(date_json)
完整代码:
- import JSON
- """
- 实现:
- 1.json_txt(dic_json):json 格式, 遍历 key,value, 存储到字典中
- 2.heck_json_value(dic_json,k,v)json 格式, 遍历后, 替换 key 的 value 值
- 3.data_Json(Sendjson_txt), 将 json 字符串转化为 json 格式
- """
- #JSON 序列化 JSON 格式
- def data_Json(Sendjson_txt):
- data_json = JSON.loads(Sendjson_txt)
- print('data_json:',data_json)
- return data_json
- #遍历 JSON 文件所有的 key 对应的 value, 存储到一个字典中
- dic ={}
- def json_txt(dic_json):
- if isinstance(dic_json,dict): #判断是否是字典类型 isinstance 返回 True,false
- for key in dic_json:
- if isinstance(dic_json[key],dict):# 如果 dic_json[key] 依旧是字典类型
- print("****key--:%s ,value--: %s"%(key,dic_json[key]))
- #递归调用
- json_txt(dic_json[key])
- dic[key] = dic_json[key]
- else:
- print("****key--:%s ,value--: %s"%(key,dic_json[key]))
- dic[key] = dic_json[key]
- #遍历 JSON 字典 key 值后, 查到 ke 则修改值 value
- def check_json_value(dic_json,k,v):
- if isinstance(dic_json,dict):
- for key in dic_json:
- if key == k:
- dic_json[key] = v
- elif isinstance(dic_json[key],dict):
- check_json_value(dic_json[key],k,v)
- if __name__=="__main__":
- #JSON 文件发送形式
- Sendjson_txt = """
- {
- "header":{
- "funcNo": "IF010002",
- "opStation": "11.11.1.1",
- "appId": "aaaaaa",
- "deviceId": "kk",
- "ver":"wx-1.0",
- "channel": "4"
- },
- "payload": {
- "mobileTel": "13817120001"
- }
- }
- """
- #格式化
- data_json = data_Json(Sendjson_txt)
- print('data_json:',data_json)
- print("*"*10)
- #
- json_txt(data_json)
- print("dic ---:"+str(dic))
- #
- print("data_json 变更前 :")
- print(data_json)
- check_json_value(data_json,'mobileTel','13333333333')
- print("data_json 变更后 :")
- print(data_json)
执行结果:
- data_json: {
- 'header': {
- 'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'
- }, 'payload': {
- 'mobileTel': '13817120001'
- }
- }
- data_json: {
- 'header': {
- 'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'
- }, 'payload': {
- 'mobileTel': '13817120001'
- }
- }
- **********
- ****key--:header ,value--: {
- 'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'
- }
- ****key--:funcNo ,value--: IF010002
- ****key--:opStation ,value--: 11.11.1.1
- ****key--:appId ,value--: aaaaaa
- ****key--:deviceId ,value--: kk
- ****key--:ver ,value--: wx-1.0
- ****key--:channel ,value--: 4
- ****key--:payload ,value--: {
- 'mobileTel': '13817120001'
- }
- ****key--:mobileTel ,value--: 13817120001
- dic ---: {
- 'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4', 'header': {
- 'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'
- }, 'mobileTel': '13817120001', 'payload': {
- 'mobileTel': '13817120001'
- }
- }
data_json 变更前 :
{'header': {'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'}, 'payload': {'mobileTel': '13817120001'}}
data_json 变更后 :
- {
- 'header': {
- 'funcNo': 'IF010002', 'opStation': '11.11.1.1', 'appId': 'aaaaaa', 'deviceId': 'kk', 'ver': 'wx-1.0', 'channel': '4'
- }, 'payload': {
- 'mobileTel': '13333333333'
- }
- }
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------
来源: http://www.bubuko.com/infodetail-3274628.html