4 接口自动化
4.1 使用python实现接口自动化
如果不了解接口测试可参考https://ke.qq.com/course/4092904
使用Python的request库实现接口测试:
import json
import requests
#使用session管理:
#1.可以自动关联set-cookie里面的内容
#2.可以加快与服务器的连接速度
session=requests.session()
#auth接口
#发包和收包
#这里一般是要放参数,使用data入参还是json入参,根据请求头中 Content-Type的参数,可以用alt+左键查看这个方法,看说明。
result=session.post(url="url")
#解码
text_result=result.content.decode("utf-8")
print(text_result)
try:
#将结果转化为字典
json_result=json.loads(text_result)
except Exception as e:
json_result={}
token=json_result.get('token')
print(token)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
4.2 Python接口自动化关键字驱动封装思路
提供一下思路:
设计思路
1.接口地址前缀都是一样的话,我们可以在post请求中传入接口后缀进行拼接
就要有一个seturl方法 也需要一个实例属性self.url 对地址进行处理
2.使用requests.session()进行请求,那么也需要一个实例属性self.session
3.在做post请求时,需要有一个dopost的方法
requests库中对于post请求有两种传参方式
request post 参数选择 data = 还是json= 取决于请求的content-type
需要对参数进行处理:
根据自己的入参习惯对参数进行处理 如果是json 就可以用json.loads转化为字典
字符串拆解成字典 有个私有方法处理参数
get请求:doget方法
参数直接拼接在url中即可
4.需要一个添加头的方法 :设置请求头 addheader 对应的就还有移除请求头removeheader
5.对接口结果进行断言,需要一个断言方法 assertmethod,我们也需要实例属性保存请求结果
使用self.json_result = {}结果保存json结果
使用self.text_result 结果保存文本结果
6.关联关系处理 需要使用一个字典保存参数 self.relations = {}
何为关联关系?上一步的请求的返回结果 用于下一次请求
那么就是需要保存动作(savaparams)保存到字典(键和值)
替换(私有方法,在入参时使用{ 保存的参数名} 处理) 在下一次请求时带上这个参数
使用字符串的替换的方法: 遍历字典的键。如果能匹配到则说明这个参数需要替换成该键的值
- 1
- 2
- 3
- 4
- 5
- 6
还有一些增加的可以 比如说日志、集成excel、allure我这里不介绍,自行添加
4.3 接口关键字代码
import json
import traceback
import requests
class Inter:
def __init__(self):
self.url=None
self.session=requests.session()
self.json_result = {}
self.text_result:str=''
self.relation={}
def seturl(self,url:str=''):
"""
设置接口地址前缀
:param url:
:return:
"""
self.url=url
return self.url
def addheader(self,key='',value=''):
"""
添加请求头
"""
value=self.__get_ralation(value)
self.session.headers[key]=value
def removeheader(self, key):
"""
删除请求头
"""
try:
self.session.headers.pop(key)
except Exception as e:
pass
return self.session.headers
def dopost(self,url:str="",params: str = ''):
"""
post请求
"""
if url.startswith('http'):
name=url
else:
name=self.url+url
params=self.__get_ralation(params)
params=self.__get_data(params)
try:
result=self.session.post(url=name,data=params)
self.text_result=result.content.decode("utf8")
self.text_result = result.text
try:
self.json_result=json.loads(self.text_result)
except Exception as e:
print("json处理异常")
self.json_result = {"error":"json处理异常"}
except Exception as e:
print("请求异常")
self.text_result= str(traceback.format_exc())
def doget(self,url,params:str=""):
"""
get请求
"""
if url.startswith('http'):
name=url
else:
name=self.url+url
params=self.__get_ralation(params)
try:
result=self.session.get(url=name+'?'+params)
self.text_result=result.content.decode("utf8")
self.text_result = result.text
try:
self.json_result=json.loads(self.text_result)
except Exception as e:
print("json处理异常")
self.json_result = {"error":"json处理异常"}
except Exception as e:
print("请求异常")
self.text_result= str(traceback.format_exc())
def assertresult(self,result_key: str = '', expect_result: str = ''):
"""
断言结果
"""
try:
actual_result = str(self.json_result.get(result_key))
except Exception as e:
actual_result = 'None'
if actual_result == expect_result:
print("PASS")
print(actual_result)
else:
print("FAIL")
def savaparams(self,param_name: str, json_key: str):
"""
把上一次请求的结果保存
"""
json_value=str(self.json_result.get(json_key))
self.relation[param_name]=json_value
def __get_ralation(self,params:str):
"""
获取参数值
"""
if params:
for key in self.relation:
params=params.replace('{'+key+'}',self.relation.get(key))
# for key in self.json_result.keys():
# params = params.replace('{' + key + '}', str(self.json_result.get(key)))
return params
else:
return params
def __get_data(self,params:str=""):
"""
处理参数
"""
params_dict = {}
if params:
params=params.split('&')
for key_value in params:
key = key_value[:key_value.find('=')]
value = key_value[key_value.find('=') + 1:]
params_dict[key] = value
return params_dict
else:
return params_dict
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136