[接口测试-实战]02 py+requests实战

来自一个把孩子丢给奶奶带,自己来写博客的宝妈。大家好,我是亭子,还是那个有态度的tester。

最近在跟“大婶”的一个关于接口测试的课程,课程中讲解的项目主要以py2+mysql+httplib方式进行,而我本机使用的是py3+requests的环境,所以,我就跟着“大婶”的思路来使用自己的环境来进行实战,才有了《接口测试-实战》的这一系列文章。下面是我这一系列文章的目录,欢迎大家指正。

文章列表
《[接口测试-实战]01 py+mysql实战》


文章目录

  • 简介
  • 代码

简介

这篇文章依旧是实战文,也是《接口测试-实战》系列的第二篇文章,记录的是关于requests的实战,实战内容主要是对requests进行二次封装,方便使用,这里主要写了三个文件“config.py”,"ophttp.py","optool.py",下面依次对每个文件进行简单说明

(1) config.py:配置文件,将项目需要的一些配置信息存放在这个文件里,方便统一管理,例如database的信息,接口的base_url的信息等
(2) optool.py:封装的需要使用的一些简单函数,比如拼接url的函数,因为不知道把这些函数放在什么位置,索性单独把他们分离出来。
(3) ophttp.py:重头戏,对requests库进行封装,封装之后只提供一个方法给外部调用,这个方法在会根据你指定的发送请求的方式(get、post)来执行代码,那么我们在访问http接口的时候,不论是get协议还是post协议,无论是否你带什么参数等,都直接调用这一个方法,简单方便,具体实现请看代码,代码中注释比较多

代码

这个文件就不解释了

# config.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

'''
@author:ht
@desc:配置文件,主要配置一些主要数据,供代码调用
'''

environ = {"base_url":"http://httpbin.org",'timeout':20} #接口基本url

这个文件我还是不解释了

#optool.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

'''
@author:ht
@desc:常用函数封装
'''
from config import environ
import json

#拼接url
def join_url( endpoint):
    '''
    拼接url
    :param endpoint:
    :return:
    '''
    return "/".join([environ.get("base_url"), endpoint])

# 格式化json,返回字符串对象
def better_show_json(json_str):
    #将json对象准换为字符串并格式化
    return json.dumps(json_str,indent=4)

if __name__ == "__main__":
    pass

下面的代码中注释好多的

#ophttp.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

'''
@author:ht
@desc:
requests库的再封装
根据入参的method发送http请求,返回结果
'''
import requests
from mylogging import mylogger
from optool import *

class OpHTTP:
    #get请求,私有方法,
    def __get(self,url,params=None,**kwargs):
        '''
        根据传入的数据进行get请求调用
        :param url:请求url地址
        :param params:get参数
        :param kwargs:其他参数
        :return:返回的是一个dict类型的数据
        (1)200:请求正常,返回json格式的数据
        格式:result = {"resultCode": 200, "message": "请求成功,返回json格式的数据", "content": responce.json()}
        (2)201:请求正常,返回string类型的数据
        格式: result = {"resultCode": 201, "message": "请求成功,返回string格式的数据","content": responce.text}
        (3)300:response的status code 不等于200,content为空字符串
        格式:result = {"resultCode": 300, "message": "接口请求的状态码错误-非200", "content": ""}
        (4)400:请求过程出现异常,content为空字符串
        格式:result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}
        '''
        try:
            responce = requests.get(url,params,timeout=environ.get("timeout"),**kwargs)
            if responce.status_code == 200:
                #判断返回的结果是否是json格式的数据:通过headers的Content-Type来获取接口返回数据格式
                #如果是json格式的数据,那么返回包含json对象的结果,否则返回content
                if "application/json" in responce.headers.get("Content-Type"):
                    result = {"resultCode":200,"message":"请求成功,返回json格式的数据","content":responce.json()}
                else:
                    result = {"resultCode":201,"message":"请求成功,返回string格式的数据",
                              "content":responce.text} #responce.text:根据接口返回的信息,会自动将原始数据转换成字符串类型的数据,格式是根据headers里面来转的
            else:
                result = {"resultCode": 300, "message": "接口请求的状态码错误-非200", "content": ""}
        except BaseException as  e:
            mylogger.info("[http_requests_get_info] - url=%s,params=%s,**kwargs=%s"%(url,params,kwargs)) #打印出get请求的参数信息
            mylogger.exception(e)
            result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}
        finally:
            return result

    #post方法,私有方法
    def __post(self,url, data=None, json=None, **kwargs):
        '''
        根据传入的数据进行post请求调用
        :param url:请求url地址
        :param data:参数
        :param json:json格式的参数
        :param kwargs:其他参数
        :return:返回的是一个dict类型的数据
        (1)200:请求正常,返回json格式的数据
        格式:result = {"resultCode": 200, "message": "请求成功,返回json格式的数据", "content": responce.json()}
        (2)201:请求正常,返回string类型的数据
        格式: result = {"resultCode": 201, "message": "请求成功,返回string格式的数据","content": responce.text}
        (3)300:response的status code 不等于200,content为空字符串
        格式:result = {"resultCode": 300, "message": "接口请求的状态码错误-非200", "content": ""}
        (4)400:请求过程出现异常,content为空字符串
        格式:result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}
        '''
        try:
            responce = requests.post(url, data=data, json=json, timeout=environ.get("timeout"), **kwargs)
            if responce.status_code == 200:
                if "application/json" in responce.headers.get("Content-Type"):
                    result = {"resultCode": 200, "message": "请求成功,返回json格式的数据", "content": responce.json()}
                else:
                    result = {"resultCode": 201, "message": "请求成功,返回string格式的数据",
                              "content": responce.text}  # responce.text:根据接口返回的信息,会自动将原始数据转换成字符串类型的数据,格式是根据headers里面来转的
            else:
                result = {"resultCode": 300, "message": "接口请求的状态码错误-非200", "content": ""}
        except BaseException as  e:
            mylogger.info("[http_requests_post_info] - url=%s,params=%s,json=%s,kwargs=%s]"%(url,data,json,kwargs)) #打印出post请求的参数信息
            mylogger.exception(e)
            result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}
        finally:
            return result

    #发送http请求,根据你传入的method参数决定执行get还是post请求
    def send_request(self,url,method="post",params=None,data=None,json=None,**kwargs):
        '''
        根据你传入的method参数决定执行get还是post请求
        :param url: 接口地址
        :param method: post(默认)或者get,小写,如果传入post,则使用post的方式发送http请求,如果传入get,则使用get的方式发送请求
        :param params: dict类型的参数(还有其他类型等),使用get(带参数)方式发送http请求的时候需要传入,默认None
        :param data: dict类型的参数,默认为None,使用post(带参数)方式发送http请求的时候传入
        :param json: json格式的参数,默认为None,使用post(带参数)方式发送http请求的时候传入
        :param kwargs:---headers:cookies:auth:timeout(本类已经在配置文件中进行读取):allow_redirects:proxies:stream
        :return:返回的是一个dict类型的数据
        (1)200:请求正常,返回json格式的数据
        格式:result = {"resultCode": 200, "message": "请求成功,返回json格式的数据", "content": responce.json()}
        (2)201:请求正常,返回string类型的数据
        格式: result = {"resultCode": 201, "message": "请求成功,返回string格式的数据","content": responce.text}
        (3)300:response的status code 不等于200,content为空字符串
        格式:result = {"resultCode": 300, "message": "接口请求的状态码错误-非200", "content": ""}
        (4) 301:调用自定义方法传入的参数有问题
        格式:{"resultCode": 301, "message": "传入参数值错误", "content": ""}
        (5)400:请求过程出现异常,content为空字符串
        格式:result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}

        '''
        try:
            if method=="post":
                result = self.__post(url=url,data=data,json=json,**kwargs)
            elif method == "get":
                result = self.__get(url=url,params=params,**kwargs)
            else:
                result = {"resultCode": 301, "message": "传入参数值错误", "content": ""} #方法的入参有错误,无法正常解析
        except BaseException as  e:
            result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}
            mylogger.info("def send_request(self,url=%s,method=%s,params=%s,data=%s,json=%s,**%s)"%(url,method,params,data,json,kwargs))
            mylogger.exception(e)
        return result

if __name__ == "__main__":
    #test
    # 实例化一个封装的requests对象
    myhttp = OpHTTP()

    #构造接口的url地址
    new_url = join_url("anything")

    # # 请求不带参数的post方法
    # result01 = myhttp.send_request("http://httpbin.org/anything")
    # print(better_show_json(result01.get("content"))) #调用better_show_json方法,格式化输出,让json格式的数据输出更漂亮
    #
    # # 请求带参数的post方法
    # data = {"name":"ht","password":"ting"}
    # result02 = myhttp.send_request(url=new_url,data=data)
    # print(better_show_json(result02.get("content")))
    #
    # # 请求带参数的post方法
    # json = {"name":"ht","password":"ting"}
    # result03 = myhttp.send_request(url=new_url,json=json)
    # print(better_show_json(result03.get("content")))
    #
    # #请求不带参数的get方法
    # result04 = myhttp.send_request(new_url,method="get")
    # print(better_show_json(result04.get("content")))

    #请求带参数的get方法
    params = {"name":"ht","password":"ting"}
    result05 = myhttp.send_request(new_url,method="get",params=params)
    print(result05)
    print(result05.get("resultCode"))
    print(result05.get("message"))
    print(better_show_json(result05.get("content")))

后记

感谢大婶的课程,感谢大婶帮我查看代码质量。


以后我们要在文章中来点心灵鸡汤可好。

你可能感兴趣的:([接口测试-实战]02 py+requests实战)