示例场景
假设我们有一个提交数据的函数 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 进行参数化测试,减少代码重复,提高可读性和可维护性。
这种方法可以让代码更易于管理和扩展,并保持测试的可读性。