pytest中用装饰器控制新增接口请求时间

示例场景

假设我们有一个提交数据的函数 submit_data,我们希望在每次调用后等待一定的时间,以避免重复提交的问题。

1.自动化提交接口的时候可以使用 time.sleep() 的方式

这是最直接的方式,在函数调用后直接使用 time.sleep() 控制等待时间。

import time

def submit_data(data):
    # 模拟提交数据的操作
    print(f"提交数据: {data}")
    return {"status": "success"}

def test_submit_data_with_sleep():
    # 模拟测试提交数据,每次提交后等待2秒
    result = submit_data({"key": "value1"})
    time.sleep(2)  # 等待2秒
    result = submit_data({"key": "value2"})
    time.sleep(2)  # 再次等待2秒
    result = submit_data({"key": "value3"})
    # ...继续测试逻辑

2.使用自定义 pytest 装饰器的方式

这里使用一个自定义的装饰器 rate_limit,通过 pytest 管理测试流程,更加优雅和可扩展。

import time
import pytest
from functools import wraps

# 自定义装饰器,用于控制接口调用频率
def rate_limit(wait_time=2):  # 外层函数,接收一个参数 wait_time,用于指定等待时间(默认为2秒)
    def decorator(func):  # 内层函数,接收一个函数作为参数,这个函数就是要被装饰的目标函数
        @wraps(func)  # 使用 functools.wraps 保持原函数的元数据,例如函数名和文档字符串
        def wrapper(*args, **kwargs):  # 包装函数,用于包裹目标函数
            result = func(*args, **kwargs)  # 执行目标函数,并获取其返回值
            time.sleep(wait_time)  # 在目标函数执行后等待指定的时间(wait_time 秒)
            return result  # 返回目标函数的执行结果
        return wrapper  # 返回包装后的函数
    return decorator  # 返回装饰器


@rate_limit(wait_time=2)  # 应用自定义的频率控制装饰器
def submit_data(data):
    # 模拟提交数据的操作
    print(f"提交数据: {data}")
    return {"status": "success"}

@pytest.mark.parametrize("data", [{"key": "value1"}, {"key": "value2"}, {"key": "value3"}])
def test_submit_data_with_decorator(data):
    # 使用装饰器的方式来控制提交频率
    result = submit_data(data)
    assert result["status"] == "success"

解释

1)time.sleep() 方式:

直接在函数调用后使用 time.sleep() 暂停执行。
简单直接,但每次都需要手动调用 sleep,不易管理,且代码重复。

2)pytest 装饰器方式:

通过自定义装饰器 rate_limit,将等待逻辑封装起来,使代码更整洁。
使用 @rate_limit(wait_time=2) 装饰目标函数,自动控制每次调用后的等待时间。
结合 pytest.mark.parametrize 进行参数化测试,减少代码重复,提高可读性和可维护性。
这种方法可以让代码更易于管理和扩展,并保持测试的可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值