使用Requests库实现api接口测试(Python)

1 目的

  构建HTTP请求消息,并且解析收到的HTTP响应消息,根据业务场景来判断是否符合预期。

2 Requests库

  用来做收发http请求。

  Requests中文官网:https://2.python-requests.org/zh_CN/latest/

2.1 构建请求

2.2.1 构建请求头

headers = { 'user-agent': 'my-app/0.0.1', 'auth-type': 'jwt-token' }
r = requests.post("http://httpbin.org/post", headers=headers)

2.2.2 构建请求消息体

1)指定代理+get请求

paras={
    'key1':'value1',
    'key2':'value2'
}    
proxies={
    'http':'http://127.0.0.1:8888',
    'https':'http://127.0.0.1:8888'
}
r=requests.get('url',proxies=proxies,params=paras)

2)post请求,消息体格式可以是xml、json、urlencoded、自定义

A. urlencoded格式

payload = {'key1': 'value1', 'key2': 'value2'}  
r = requests.post("http://httpbin.org/post", data=payload)

B. json格式

payload = '''{
  "form": {
    "key1": [
      "value1",
      "value2"
    ]
  }
}'''
#json格式里一定是双引号
r = requests.post("http://httpbin.org/post", data=payload.encode('utf8'))  
import json   #使用python中的数据对象,单、双引号都可以
payload = {  ...
  "form": {
    "key1": [
      "value1",
      "value2"
    ]
  },
  ...
}
r = requests.post("http://httpbin.org/post",json=payload)   #使用json,底层使用jsondump将python对象变成字符串 

2.2 HTTP响应检查

1)检查http响应状态码:r.status_code

2)检查响应消息头:r.headers、r.headers['Content-Type']

3)检查响应消息体:r.text

2.3 其他

1)pprint采用分行打印输出(import pprint)

2)r=requests.get("https://www.baidu.com")

   r.content  #获取字节串的内容

   r.content.decode('utf8')   #将获取的字节串内容,以utf8编码,解码成字符串

3)若服务端没有在headers里指定编码格式,需要自己指定编码格式

   r.encoding='utf8'

   r.text

4)json.dumps()  #将python中的对象序列为json格式的字符串

   json.loads()  #将json格式的字符串反序列化为python中的对象

5)obi=r.json()   ==   obi=json.loads(r.content.decode('utf8'))

3. session机制

3.1 区别用户的机制

  用户使用客户端登录,服务端进行验证;验证通过后,服务端系统生成此时登录的一个seesion;session是一个数据结果,保存客户端用户登录的相关信息;同时创建一个唯一sessionid,标志这个session;服务端通过http响应headers的Set-Cookie下发sessionid;客户端在后续请求headers的Cookie中带上这个seesionid,服务端通过sessionid找到对应的session。

3.2 requests处理session-cookie

  requests库提供了Session类。会自动存储sessionid,并且在后续的请求中带上sessionid。

# 创建Session对象
session = requests.Session()
# 通过Session对象发送请求
response = session.post('url',datd={
    'username':'xx',
    'password':'xxxx'
})
print(response)
response = session.get('url',params={
    '':'',
    '':''
})

3.3 json任意key的value值获取方法:

需要安装jsonpath,封装函数如下:
import jsonpath as jsonpath

def get_json_value(json_data, key_name):
    '''获取到json中任意key的值,结果为list格式'''
    key_value = jsonpath.jsonpath(json_data, '$..{key_name}'.format(key_name=key_name))
    # key的值不为空字符串或者为empty(用例中空固定写为empty)返回对应值,否则返回empty

    return key_value  

调用函数如下:
def get_iphone():
    url = url_web + '/phone/65ou4oadi7o7fuo'
    headers = {"Content-Type": "application/json", "key": "2dbe655e88c80"}
    tel = RequestHandler()
    response = tel.visit(method='get', url=url, headers=headers)
    assert response.status_code == 200
    logging.info('get iphone接口调用成功成功,status_code == 200 ')
    r = response.json()  # 返回json数据
    mobile = get_json_value(r, "mobile")
    return mobile

  

posted @ 2020-06-25 22:58  拂晓lu  阅读(587)  评论(0编辑  收藏  举报