在自动化测试领域,特别是在接口(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%免费】

​​​软件测试面试文档

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

在这里插入图片描述

在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐