Python+requests+pytest+allure封装接口自动化1-项目结构目录创建,requests库封装

一、项目结构解析与展示

  1. 项目结构

api: 这是一个package,用来各个接口的类封装,按照你的业务可以将其分为多个package

common: 这是一个package,用来封装底层公共方法,比如requests库封装、文件操作封

装、加解密封装、redis封装、数据库封装、随机数据封装、日志封装

testcases: 这是一个package,用来编写封装我们的测试用例

confifig: 这是一个目录,用来存放基本的配置信息,比如数据库、redis、各个服务域名、各个

环境的配置

data:这是一个目录,用来存放测试用例数据

logs: 这是一个目录,用来存放收集到的日志文件

report: 这是一个目录,用来存放测试结果数据以及生成的测试报告

conftest.py: 用来重写pytest自带的一些钩子函数以及自定义的fifixture

pytest.ini: pytest的基本配置文件

run.py: 框架整体的统一执行入口

2.项目结构展示

Python+requests+pytest+allure封装接口自动化1-项目结构目录创建,requests库封装_第1张图片

二、Requests库,调用多种接口学习

# 导包
import requests

token = None


# get
def getRequest():
    # GET请求方式
    resq = requests.get(
        'https://www.qidian.com/ajax/Free/getSysTime?_csrfToken=gug6vyoHkNrG2oYkn0z2F7VDf7o2UCCPrDFrpDIT')
    # 返回响应的内容
    print('get接口返回值:', resq.text)
    # 打印返回的状态码
    print('Get打印返回的状态码', resq.status_code)
    # 返回JSON格式的内容
    print('get返回JSON格式的内容', resq.json())
    print('------------------------------------------------------------------------------------')


# json
# json 表示使用application/json方式提交请求。接收方request.body的内容为’{“a”: 1, “b”: 2}'的这种形式; 
def postJsonReqest():
    # Post方式请求json格式,使用Json请求参数
    json = {
        "userName": "admin",
        "password": "123456"
    }
    # 请求JSON类型的接口
    resq = requests.post('http://localhost:8888/community/flogin', json=json)
    print(f'登录接口返回的Json{resq.json()}')
    # 定义全局变量
    global token
    # 提取登录接口返回的token为全局变量,后面接口使用
    token = resq.json()['data']['token']
    print(f'提取登录接口的token值:{token}')
    print('------------------------------------------------------------------------------------')


# files
# 文件上传
def postFilesRequest():
    # 请求上传文件类型的接口,使用files
    # 以二进制的形式,打开读取文件
    f = open('../data/test.jpg', 'rb')
    # 读取文件
    f.read()
    # 定义一个files的字典,便于把读取到的二进制文件传入请求体中
    files = {'file': f}
    # 由于这个接口需要登录的token才能登录,将token放到headers中
    headers = {'token': token}
    # 发起文件请求接口,传入文件参数和请求头中的token参数
    resq = requests.post('http://localhost:8888/community/ImageController', files=files, headers=headers)
    print('文件类型接口返回值', resq.text)
    print('------------------------------------------------------------------------------------')
    f.close()


# form-data 表单类型接口
# 表示使用application/form-urlencode方式提交请求,接收方request.body的内容为a=1&b=2的这种形式;
def postFormDataRequest():
    # Post方式请求json格式,使用Json请求参数
    data = {
        "title": "自动化"
    }
    # 请求JSON类型的接口
    headers = {'token':token}
    resq = requests.post('http://localhost:8666/api/article/queryAllArticle2', data=data,headers=headers)
    print(f'form-data接口返回的值{resq.json()}')
    print('------------------------------------------------------------------------------------')



if __name__ == '__main__':
    # get请求
    getRequest()
    # post josn
    postJsonReqest()
    # post Files
    postFilesRequest()
    # post data
    postFormDataRequest()

打印结果展示

Python+requests+pytest+allure封装接口自动化1-项目结构目录创建,requests库封装_第2张图片

三、【python】*args和*kwargs用法

  • args :是 arguments 的缩写,表示位置参数;

  • kwargs: 是 keyword arguments 的缩写,表示关键字参数。

  • *和**:是python中两种可变参数的形式,且*args 必须放在 **kwargs 的前面,因为位置参数在关键字参数的前面。

1、*args的用法

*args就是就是传递一个可变参数列表给函数实参,这个参数列表的数目未知;

例如:我们要开发个加法计算器,我们可以输入多个数值进行相加,由于我们不知道会输入多少个,这个时候可以使用*args

# 常规加法计算器
def add_test1(args=None):
    sum = 0
    if args is not None:
        for i in args:
            sum = sum + i
    return sum


# *args加法计算器
def add_test(*args):
    # 打印下args
    print(args)
    # 由此可以见args为元组类型
    print(type(args))
    # 循环便利args,求和
    sum = 0
    for i in args:
        sum = i + sum
    return sum



if __name__ == '__main__':
    sum = add_test(1,2,3,4,5,6,7,8)
    print(f'常规加法计算:{sum}')
    #可传元组或者列表
    sum = add_test1((1, 2, 3, 4, 5, 6, 7, 8))
    print(f'*args加法计算:{sum}')
    # print(sum)

打印结果如图:

Python+requests+pytest+allure封装接口自动化1-项目结构目录创建,requests库封装_第3张图片

2、**kwargs的用法

**kwargs则是将一个可变的关键字参数的字典传给函数实参,同样参数列表长度可以为0或为其他值。

例如:一个函数,传一个字典,字典的KEY的个数最多是三个,但是字典的KET可以不完全都传,如果某个KEY没传,就把他的Value处理为空;

# 定义一个字典用来存储学生的信息
students = [
    dict(userName="小明", age=18, sex="男"),
    dict(userName="小红", age=17)
]




def selectUserInfo(**kwargs):
    # 解包后的是字典的KEY值
    print('解包后的是字典的KEY值:', *kwargs)
    print('前端传入的kwargs:', kwargs)
    print('kwargs的类型:', type(kwargs))
    # 判断kwargs中的传入的参数是否传入,如果未传入,将未传入的值置空
    if 'userName' not in kwargs.keys():
        kwargs['userName'] = ''
    if 'age' not in kwargs.keys():
        kwargs['age'] = ''
    if 'sex' not in kwargs.keys():
        kwargs['sex'] = ''
    print('处理后的kwargs:', kwargs)
    print('-----------------------------------')


if __name__ == '__main__':
    Json1 = {
        "userName": "小明",
        "age": 18
    }
    Json2 = {
        "userName": "小红",
        "age": 17,
        "sex": "男"
    }
    # *作为从传参的时候相当于解包的作用
    selectUserInfo(**Json1)
    # 等价于,传键值对
    selectUserInfo(userName='小明',age = 18)
    selectUserInfo(**Json2)

Python+requests+pytest+allure封装接口自动化1-项目结构目录创建,requests库封装_第4张图片

四、Requests库封装

import requests


class RequestsClient:
    # 使用类属性来定一个session,他将作为所有接口发起的全局对象
    session = requests.session()

    # 初始化数据,如果参数没传的情况下将参数置为None
    def __init__(self):
        self.session = RequestsClient.session
        self.method = None
        self.url = None
        self.data = None
        self.headers = None
        self.files = None
        self.json = None
        self.params = None
        self.resp = None

    #封装requests请求
    def sendRequest(self, **kwargs):
        # 如果调用方,没有传任何的参数,那么就使用该对象的默认属性参数
        if 'url' not in kwargs.keys():
            kwargs['url'] = self.url
        if 'method' not in kwargs.keys():
            kwargs['method'] = self.method
        if 'headers' not in kwargs.keys():
            kwargs['headers'] = self.headers
        if 'data' not in kwargs.keys():
            kwargs['data'] = self.data
        if 'json' not in kwargs.keys():
            kwargs['json'] = self.json
        if 'files' not in kwargs.keys():
            kwargs['files'] = self.files
        if 'params' not in kwargs.keys():
            kwargs['params'] = self.params
        self.resp = self.session.request(**kwargs)
        #等价于
        # self.resp = self.session.request(url=kwargs['url'],method=kwargs['method'],headers=kwargs['headers'],data=kwargs['data'],json=kwargs['json'],params=kwargs['params'],files=kwargs['files'])
        return self.resp


if __name__ == '__main__':
    json = {
        "userName": "admin",
        "password": "123456"
    }
    request = RequestsClient()
    resp = request.sendRequest(method='post',url='http://localhost:8888/community/flogin', json=json)
    print(resp.json())

你可能感兴趣的:(自动化测试,python,pytest,自动化,测试工具)