Python接口自动化 -RESTful请求方法封装

对 Requests 库下一些常见的请求方法进行封装,调用起来更加方便。

先来看一个例子:

比如要测试登录接口

  1. 正常流测试(正确的账号、密码)
  2. 异常流测试(正确的账号,错误的密码等)
import requests

# 正常流
url = 'http://192.168.28.128:8080/recruit.students/login/in?account=admin&pwd=test123'
result = requests.get(url)
print(result.text)

# 异常流,密码错误
url = 'http://192.168.28.128:8080/recruit.students/login/in?account=admin&pwd=test'
result = requests.get(url)
print(result.text)

看上面这段代码,是不是显得比较冗余,我们每个请求里都要写一遍完整的 url。
还有就是当我们需要做一些连续调用的请求,比如“先登录再把商品加入购物车“,这样的时候,需要使用 requests 的 session 功能。

就要需要登录和登录后的请求都由同一个reqeusts session对象来发出。

# -*- coding:utf-8 -*-
import requests
import json as complexjson


class RestClient():
    def __init__(self, api_root_url):
        """
        :type api_root_url: 就是url的前缀,相当于host
        """
        self.api_root_url = api_root_url
        # 用session保持会话,相当于微型浏览器
        self.session = requests.session()

    def get(self, uri, **kwargs):
        """
        :type uri: 路径,每个接口的路径不一样,所以把路径抽离出来
        :type **kwargs: 关键字参数,它将不定长参数转换为 dict 传入函数
        """
        # 返回的时候调用这个类中的 request 方法
        return self.request(uri, "GET", **kwargs)

    def post(self, uri, data=None, json=None, **kwargs):
        return self.request(uri, "POST", data, json, **kwargs)

    def put(self, uri, data=None, **kwargs):
        return self.request(uri, "PUT", data, **kwargs)

    def delete(self, uri, **kwargs):
        return self.request(uri, "DELETE", **kwargs)

    def patch(self, uri, data=None, **kwargs):
        return self.request(uri, "PATCH", data, **kwargs)

    def request(self, uri, method, data=None, json=None, **kwargs):
        url = self.api_root_url + uri
        if method == "GET":
            return self.session.get(url, **kwargs)
        if method == "POST":
            return self.session.post(url, data, json, **kwargs)
        if method == "PUT":
            if json:
                # PUT 和 PATCH 中没有提供直接使用json参数的方法,因此需要用data来传入
                data = complexjson.dumps(json)
            return self.session.put(url, data, **kwargs)
        if method == "DELETE":
            return self.session.delete(url, **kwargs)
        if method == "PATCH":
            if json:
                data = complexjson.dumps(json)
            return self.session.patch(url, data, **kwargs)

这里,这个类里我加了一些方法,包括:

  1. init 方法:初始化这个类,初始化的时候需要输入 api_root_url,也就是URL的前缀host。另外还在初始化时创建了 self.session 用于保存 requests 的 session。

  2. get,post 等各种 http 方法,用于让用户使用。但这里并没有真正实现这些方法,因为这些方法都是在 requests 里有实现过,我们只要把参数传给 requests 就行了。这个传递我们写在 request 方法里,所以这里的 http 方法都是调用 requests 方法。

  3. request 方法:真正调用 self.session 的各种方法,这里同样是把参数传下去,只是在传之前,给所有用户输入的 url 加了一个前缀。前缀的值是用户在 init 方法里输入的。

使用封装好的方法进行登录操作:

r = RestClient("http://192.168.28.128:8080")

login = r.get(uri="/recruit.students/login/in",
              params={"account": "admin",
                       "pwd": "660B8D2D5359FF6F94F8D3345698F88C"
                       }
              )

只是要输入接口的 uri 和参数即可,不用再输入完整的 url。后续还可以对接口进行封装,接口封装完之后,测试的时候只需要输入接口入参就行。

-----分界线-------

王阳名说:知而不行,是为不知

读书、学习、看文章,总说自己知道,但不去做,其实就是不知道。说自己知道,可能只是为了好看。

学习第一个方法就是:重复

学一个知识,学 1 遍,没学会,继续学第 2 遍,第 3 遍,第 4 遍……,直到学会。

练一个技能,练 1 次,不会用,继续练 2 次,第 3 次,第 4 次……,直到会用。

书读百遍,其义自见。

posted @ 2021-03-02 18:06  西瓜_皮  阅读(892)  评论(0编辑  收藏  举报