Python接口自动化测试过程中cookies的处理

目录

前提

常用接口请求的基础概念

python的requests模块的post方法

python的requests模块的get方法

如何在接口自动化测试中处理cookies

cookies、 session的区别联系

接口测试中涉及cookies的示例描述


前提

具体问题具体分析,有些接口可以不带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后续详细介绍。
    • 举例入参类型为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的响应。
  • 相关模块。

猜你喜欢

转载自blog.csdn.net/chang_jinling/article/details/114012248
今日推荐