Python 10个 装饰器参数化:提升你的接口自动化测试效率
·
在自动化测试领域,特别是在接口(API)自动化测试中,重复性是一个常见的问题。每次测试都需要相同的设置步骤,如登录、获取token、设置请求头等,这不仅冗余,还容易出错。幸运的是,Python的装饰器提供了强大的工具来解决这些问题,特别是当装饰器被参数化时,它们能够极大地简化代码并增强其可维护性。
🌟 实例一:登录状态装饰器
import requests
def login_required(username='admin', password='password'):
token = None
def inner_decorator(func):
def wrapper(*args, **kwargs):
nonlocal token
if not token:
response = requests.post('http://api.example.com/login', json={'username': username, 'password': password})
token = response.json()['token']
headers = kwargs.setdefault('headers', {})
headers['Authorization'] = f'Bearer {token}'
return func(*args, **kwargs)
return wrapper
return inner_decorator
@login_required()
def test_api_endpoint():
response = requests.get('http://api.example.com/data')
assert response.status_code == 200
test_api_endpoint()
🌟 实例二:重试机制
import time
def retry(max_attempts=3, delay=1):
def decorator(func):
def wrapper(*args, **kwargs):
for attempt in range(max_attempts):
try:
return func(*args, **kwargs)
except Exception as e:
if attempt < max_attempts - 1:
time.sleep(delay)
else:
raise e
return wrapper
return decorator
@retry(max_attempts=5, delay=2)
def test_unstable_api():
response = requests.get('http://api.example.com/unstable')
assert response.status_code == 200
test_unstable_api()
🌟 实例三:环境选择
def set_environment(env='prod'):
base_url = {
'prod': 'http://api.example.com',
'dev': 'http://api.dev.example.com'
}
def decorator(func):
def wrapper(*args, **kwargs):
kwargs['base_url'] = base_url[env]
return func(*args, **kwargs)
return wrapper
return decorator
@set_environment(env='dev')
def test_api_endpoint(base_url):
response = requests.get(f'{base_url}/data')
assert response.status_code == 200
test_api_endpoint()
🌟 实例四:数据驱动测试
def data_driven(data):
def decorator(func):
def wrapper(*args, **kwargs):
results = []
for item in data:
result = func(*item)
results.append(result)
return results
return wrapper
return decorator
@data_driven([(1,), (2,), (3,)])
def test_with_data(x):
return x * 2
print(test_with_data())
🌟 实例五:日志记录
import logging
def log_test(level=logging.INFO):
logger = logging.getLogger('test_logger')
def decorator(func):
def wrapper(*args, **kwargs):
logger.log(level, f"Running test: {func.__name__}")
result = func(*args, **kwargs)
logger.log(level, f"Test completed: {func.__name__}")
return result
return wrapper
return decorator
@log_test()
def test_api_endpoint():
response = requests.get('http://api.example.com/data')
assert response.status_code == 200
test_api_endpoint()
🌟 实例六:性能监控
import time
def performance_monitor(threshold=1):
def decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
elapsed_time = end_time - start_time
if elapsed_time > threshold:
print(f"Warning: {func.__name__} took {elapsed_time:.2f}s which is greater than the threshold of {threshold}s")
return result
return wrapper
return decorator
@performance_monitor(threshold=0.5)
def test_api_endpoint():
time.sleep(0.6)
return True
test_api_endpoint()
🌟 实例七:权限检查
def permission_required(permission='admin'):
def decorator(func):
def wrapper(*args, **kwargs):
user_permissions = kwargs.get('user_permissions', [])
if permission not in user_permissions:
raise PermissionError(f"User does not have required permission: {permission}")
return func(*args, **kwargs)
return wrapper
return decorator
@permission_required(permission='admin')
def test_admin_only_api(user_permissions):
return True
test_admin_only_api(user_permissions=['admin', 'user'])
🌟 实例八:模拟数据
import unittest.mock
def mock_response(status_code=200):
def decorator(func):
def wrapper(*args, **kwargs):
with unittest.mock.patch('requests.get') as mock_get:
mock_get.return_value.status_code = status_code
return func(*args, **kwargs)
return wrapper
return decorator
@mock_response(status_code=200)
def test_api_endpoint():
response = requests.get('http://api.example.com/data')
assert response.status_code == 200
test_api_endpoint()
🌟 实例九:数据清理
def clean_up(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
# 清理逻辑
return result
return wrapper
@clean_up
def test_api_endpoint():
# 测试逻辑
pass
test_api_endpoint()
🌟 实例十:测试标签
def tag(tags):
def decorator(func):
func.tags = tags
return func
return decorator
@test_case(tags=['smoke', 'regression'])
def test_api_endpoint():
# 测试逻辑
pass
print(getattr(test_api_endpoint, 'tags', []))
通过这些实例,我们可以看到装饰器参数化在接口自动化测试中的强大功能。它不仅可以减少代码量,还可以提高代码的可读性和可维护性。在你的测试项目中尝试使用这些技巧,看看它们如何帮助你更高效地工作!
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。



更多推荐


所有评论(0)