目录
前提
具体问题具体分析,有些接口可以不带cookies直接请求,有些接口需要用户在登录的前提下才能运行,这就需要拿着cookies才能正常发送请求。
常用接口请求的基础概念
一般在接口测试过程中会通过post或者get的方式发送请求来得到需要的响应报文。
python的requests模块的post方法
def post(url, data=None, json=None, **kwargs):
r"""Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('post', url, data=data, json=json, **kwargs)
- 在实际测试过程中可以根据需要准备post方法中的参数,也可以自己实现post方法。
- url请求地址。
- data和json为可选参数,根据入参的类型来选择是用data还是json。入参的类型可以参考产品人员或开发人员提供的接口文档,一般都是json类型入参。
- 如果请求入参的类似是form表单类型,则data为请求入参。如果请求入参的类型是json串类型,则json为请求入参。
- 接口测试时拼接好的入参都是python类型,所以需要通过json.dumps将Python对象编码为form类型或json类型。
- **kwargs为不定长键值对参数,一般为key=value形式,这里可以添加比如请求头headers、请求cookies。
- headers获取方式:
- 可以通过Fiddler、Charles等抓包工具抽取。
- 可以通过postman去尝试抽取,因为该工具是自动生成headers比较方便。
- 也可以通过网页上控制台查看接口请求头。
- 上述方式获取到的内容中选择必要的信息,并需更改User-Agent,不能直接用PostmanRuntime/7.26.8或者是Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0之类。
- cookies后续详细介绍。
- headers获取方式:
- 举例入参类型为json串的post代码如下:
# User-Agent简称UA是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。 headers = {"Accept": "*/*", "Content-Type": "application/json", "Accept-Encoding": "gzip, deflate, br","User-Agent": "python-requests/2.9.1"} r = requests.post(base_url, data=json.dumps(payload), headers=headers, cookies=cookies)
python的requests模块的get方法
def get(url, params=None, **kwargs):
r"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
- 必要参数就是请求地址,params是可选参数,**kwargs为不定长键值对参数,一般为key=value形式,这里可以添加比如请求头headers、请求cookies。
- get请求入参,可以分为以下几种:
- 直接只有请求地址,如
r = requests.get(url="https://www.douban.com/")
- 有入参,入参是拼接在地址后面,如
r = requests.get("https://movie.douban.com/subject_search?search_text=%E5%B0%8F%E8%B6%85&cat=1002")
- 有入参,入参是以params的方式传入,如
pydata = {"search_text":"QQQ","cat":"1002"} r = requests.get("https://movie.douban.com/subject_search",params=pydata)
- 包含headers和cookies时的代码,如
r = requests.get(base_url, params=json.dumps(payload), headers=headers, cookies=cookies)
- 直接只有请求地址,如
如何在接口自动化测试中处理cookies
cookies、 session的区别联系
简洁描述起来就是cookies是存储在客户端的,能表明用户身份的一组信息。session是存储在服务器端的,一般为比较敏感的信息会以session的形式存储。
在Client-Server的交互中,为了服务器能准确的知道是谁在访问服务器,会为每个用户分配一个cookies,后续用户拿着cookies来发起各种请求服务器就能准确返回对应的内容。
接口测试中涉及cookies的示例描述
联系本次接口框架中遇到的问题详述以下:
- 获取方式:
- 通过正常的登录接口登录成功后存储cookies信息,在下一个接口使用的时候再传入。实例代码同下方跨域时获取cookies操作类似,这里不例举代码了。
- 有的时候即使正常登录成功了,但是如果涉及到跨域的情况,真正要测试的接口就用不了登录后取得到的cookies,因为跨域的话cookies会被重置,这个时候如果没有开发的协助就需要细致观察是哪个接口做了重置cookies的操作,通过python代码来请求得到cookies并存储供下一个接口使用。具体如下,获取新cookies的文件login2.py:
# -*- coding:utf-8 -*- # author:Chang JinLing # datetime:2021/2/24 18:11 import requests import json def login2(): headers = {"Accept": "*/*", "Content-Type": "application/json", "Accept-Encoding": "gzip, deflate, br","User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36",} data = {"url": "settle-vue/bankInfoMainten/index.html"} url = "http://xxxxxx/index.html" r = requests.get(url=url, params=json.dumps(data), headers=headers) print("r.headers:::", r.headers) # 通过该语句可以查看响应头中的所有信息 print("r.cookies:::", r.cookies) # 获取返回的cookies信息 print(r.cookies.get_dict()) # 获取返回的cookies信息,以字典类型输出 new_cookies = r.cookies.get_dict() return new_cookies if __name__ == "__main__": login2() # 执行该方法后可以看到能从该接口取到新生成的cookies,那么后续接口就可以调用该方法得到最新的cookies值。
# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ # 执行结果: E:\Private_Chang\project\python\Python3\installcontent\python.exe E:/Private_Chang/project/python/Pycharme/20201223new/20210225.py r.headers::: {'Server': 'Apache-Coyote/1.1', 'Pragma': 'no-cache', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache, no-store', 'Set-Cookie': 'JSESSIONID=CB82C793BC5D9CBD54943D325507F966; Path=/casserver; HttpOnly', 'Content-Type': 'text/html;charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Date': 'Fri, 26 Feb 2021 11:48:42 GMT'} r.cookies::: <RequestsCookieJar[<Cookie JSESSIONID=CB82C793BC5D9CBD54943D325507F966 for casserverd.local/casserver>]> {'JSESSIONID': 'CB82C793BC5D9CBD54943D325507F966'} type r.cookies.get_dict(): <class 'dict'> Process finished with exit code 0
# -*- coding:utf-8 -*- # author:Chang JinLing # datetime:2021/2/24 11:54 import requests import json # 引入方法login2 from login2 import login2 class test_cookies(): def test_cookies_method(self): headers = xxxxx base_url = xxxxx payload = xxxxx cookies = login2() r = requests.post(url=base_url, data=json.dumps(payload), headers=headers, cookies=cookies) if __name__ == "__main__": testcookies = test_cookies() testcookies.test_cookies_method()
- cookies都有一定的时效性,如果实在不方便通过编写代码的方式得到,可以让开发将cookies的到期时间设置很长,然后手动通过登录页面在控制台获得cookies,然后加入到自动化代码中。
- 在cookies的获取过程中如果遇到了网页重定向,即请求网页的过程中会发现请求结果是302,有可能会经过多次重定向才会有请求结果是200的响应。
- 相关模块。