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.项目结构展示

二、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】*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)

打印结果如图:

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)

四、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())

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python是一种广泛使用的编程语言,因其易学易用、灵活性和可扩展性而备受欢迎。requestsPython的一个,它提供了一种简单且易于使用的方式来发送HTTP请求。pytestPython的另一个,它提供了一种用于编写和运行测试的框架。allure是一个测试报告生成工具,可以为测试结果提供美观和易读的报告。 在接口自动化测试中,可以使用Pythonrequests来发送HTTP请求,并使用pytest框架来编写和运行测试。可以使用Excel来存储测试数据、预期结果和实际结果。使用allure工具可以生成美观的测试报告。 以下是使用Python requestspytestallure进行接口自动化测试的一般步骤: 1. 安装Pythonrequestspytestallure 2. 创建一个Excel文件,输入测试数据、预期结果和实际结果 3. 创建一个pytest测试文件,并使用requests发送HTTP请求,比较预期结果和实际结果 4. 在pytest测试文件中添加allure装饰器,以便生成测试报告 5. 运行pytest测试文件并生成allure测试报告 例如,以下是一个使用Python requestspytestallure进行接口自动化测试的示例代码: ```python import requests import pytest import allure import openpyxl @allure.title("测试接口") @pytest.mark.parametrize("test_input, expected", [(1, "success"), (2, "fail")]) def test_api(test_input, expected): # 从Excel文件中获取测试数据和预期结果 wb = openpyxl.load_workbook("testdata.xlsx") sheet = wb.active test_data = sheet.cell(row=test_input, column=1).value expected_result = sheet.cell(row=test_input, column=2).value # 发送HTTP请求 response = requests.get("http://example.com/api", params=test_data) actual_result = response.text # 比较预期结果和实际结果 assert actual_result == expected_result, f"预期结果:{expected_result},实际结果:{actual_result}" # 添加allure描述 allure.attach("请求参数", str(test_data)) allure.attach("预期结果", str(expected_result)) allure.attach("实际结果", str(actual_result)) ``` 在上面的代码中,使用了pytest的parametrize装饰器来传递测试数据和预期结果。使用openpyxl从Excel文件中获取测试数据和预期结果。使用requests发送HTTP请求并比较预期结果和实际结果。使用allure的装饰器来添加测试描述。最后,运行pytest测试文件并生成allure测试报告。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值