1测试前置与后置操作 (setup 和 teardown)

虽然这不是直接的装饰器应用,但在pytest等框架中,使用@pytest.fixture定义的固定件(fixtures)可以作为测试函数的前置和后置操作。

  1. import pytest

  2. @pytest.fixture

  3. def setup_teardown():

  4. # 前置操作:如登录、初始化环境

  5. print("测试开始前的准备工作")

  6. yield

  7. # 后置操作:如登出、清理环境

  8. print("测试结束后的清理工作")

  9. def test_example(setup_teardown):

  10. print("执行测试用例")‍

条件跳过测试 (skip 和 skipif)

@pytest.mark.skip(reason):无条件跳过测试。

@pytest.mark.skipif(condition, reason):根据条件跳过测试


  1. import pytest

  2. @pytest.mark.skip(reason="暂时不执行此测试")

  3. def test_skip_example():

  4. pass

  5. @pytest.mark.skipif(sys.version_info < (3, 7), reason="仅适用于Python 3.7及以上版本")

  6. def test_skipif_example():

  7. pass‍

测试失败重试 (retry)

对于不稳定的服务,可能会希望在测试失败时自动重试。


  1. import pytest

  2. from pytest import Retry

  3. @pytest.mark.flaky(reruns=2, reruns_delay=2)

  4. def test_retry_example():

  5. # 假设这是一个有时会失败的测试

  6. assert False

注意:pytest-rerunfailures插件需要安装并使用才能支持reruns。

参数化测试 (parametrize)

允许一个测试用例以不同的参数多次运行。


  1. import pytest

  2. @pytest.mark.parametrize("input_value, expected", [

  3. (3, 6),

  4. (4, 8),

  5. (5, 10)

  6. ])

  7. def test_parametrize_example(input_value, expected):

  8. assert input_value * 2 == expected‍

计时测试 (timer)

监控测试用例的执行时间。


  1. import time

  2. import pytest

  3. def timer(func):

  4. def wrapper(*args, **kwargs):

  5. start_time = time.time()

  6. result = func(*args, **kwargs)

  7. end_time = time.time()

  8. print(f"{func.__name__} 用时: {end_time - start_time}秒")

  9. return result

  10. return wrapper

  11. @pytest.mark.usefixtures("timer")

  12. def test_timer_example():

  13. time.sleep(1) # 模拟耗时操作

错误处理装饰器

自动捕获并处理测试中的异常,可能用于发送错误报告或进行特定的错误处理逻辑。


  1. def error_handler(func):

  2. def wrapper(*args, **kwargs):

  3. try:

  4. return func(*args, **kwargs)

  5. except Exception as e:

  6. print(f"测试中发生错误: {e}")

  7. # 这里可以添加错误上报逻辑

  8. return False

  9. return wrapper

  10. @error_handler

  11. def test_with_error_handling():

  12. raise ValueError("模拟错误")‍

日志增强装饰器

增强测试函数的日志记录能力,记录更多的上下文信息。


  1. import logging

  2. def log_decorator(logger=logging.getLogger(__name__)):

  3. def decorator(func):

  4. def wrapper(*args, **kwargs):

  5. logger.info(f"开始执行: {func.__name__}")

  6. result = func(*args, **kwargs)

  7. logger.info(f"{func.__name__} 执行完成")

  8. return result

  9. return wrapper

  10. return decorator

  11. @log_decorator()

  12. def test_with_logging():

  13. print("这是一个测试函数")‍

事务管理装饰器

确保数据库操作的原子性,用于自动回滚事务。


  1. from contextlib import contextmanager

  2. @contextmanager

  3. def db_transaction(session):

  4. try:

  5. yield session

  6. session.commit()

  7. except Exception:

  8. session.rollback()

  9. raise

  10. def transactional_test(session):

  11. @db_transaction(session)

  12. def inner_test(session):

  13. # 执行数据库操作

  14. pass

  15. inner_test(session)‍

API认证装饰器

自动处理API请求的认证信息,如Token注入。


  1. def auth_required(token):

  2. def decorator(func):

  3. def wrapper(*args, **kwargs):

  4. headers = kwargs.get('headers', {})

  5. headers['Authorization'] = f"Bearer {token}"

  6. kwargs['headers'] = headers

  7. return func(*args, **kwargs)

  8. return wrapper

  9. return decorator

  10. @auth_required("your_token_here")

  11. def test_api_endpoint(headers=None):

  12. # 使用headers发起API请求

  13. pass‍

响应验证装饰器

自动验证API响应的状态码或内容。


  1. def response_validator(status_code=200, content_checker=None):

  2. def decorator(func):

  3. def wrapper(*args, **kwargs):

  4. response = func(*args, **kwargs)

  5. assert response.status_code == status_code, f"状态码不匹配,期望:{status_code} 实际:{response.status_code}"

  6. if content_checker:

  7. assert content_checker(response.json()), "响应内容验证失败"

  8. return response

  9. return wrapper

  10. return decorator

  11. @response_validator(status_code=200, content_checker=lambda json: json.get('success'))

  12. def test_api_response():

  13. # 发起API请求并返回响应

  14. pass‍

并发测试装饰器

用于模拟多线程或多进程环境下接口的并发测试。


  1. import threading

  2. from functools import wraps

  3. def concurrent_test(num_threads=5):

  4. def decorator(func):

  5. @wraps(func)

  6. def wrapper(*args, **kwargs):

  7. threads = []

  8. for _ in range(num_threads):

  9. thread = threading.Thread(target=func, args=args, kwargs=kwargs)

  10. threads.append(thread)

  11. thread.start()

  12. for thread in threads:

  13. thread.join()

  14. return wrapper

  15. return decorator

  16. @concurrent_test(10)

  17. def test_concurrent_api_call():

  18. # 发起API请求

  19. pass‍

数据清理装饰器

确保每次测试后数据状态的一致性,用于清理测试产生的数据。


  1. def cleanup_after_test(cleanup_func):

  2. def decorator(func):

  3. def wrapper(*args, **kwargs):

  4. try:

  5. return func(*args, **kwargs)

  6. finally:

  7. cleanup_func()

  8. return wrapper

  9. return decorator

  10. def clean_database():

  11. # 清理数据库操作

  12. pass

  13. @cleanup_after_test(clean_database)

  14. def test_that_makes_changes():

  15. # 执行可能产生需要清理的数据的操作

  16. pass‍

性能监控装饰器

记录函数执行的时间,并在达到阈值时报警或记录日志。


  1. def performance_monitor(threshold_seconds=1):

  2. def decorator(func):

  3. def wrapper(*args, **kwargs):

  4. start_time = time.time()

  5. result = func(*args, **kwargs)

  6. elapsed_time = time.time() - start_time

  7. if elapsed_time > threshold_seconds:

  8. print(f"警告:{func.__name__} 执行超过{threshold_seconds}秒,实际耗时{elapsed_time}秒")

  9. return result

  10. return wrapper

  11. return decorator

  12. @performance_monitor(2)

  13. def slow_function():

  14. time.sleep(3)‍

状态验证装饰器

在执行测试前检查前置条件是否满足。


  1. def require_state(check_state_func):

  2. def decorator(func):

  3. def wrapper(*args, **kwargs):

  4. if not check_state_func():

  5. print(f"前置条件不满足,跳过测试: {func.__name__}")

  6. return

  7. return func(*args, **kwargs)

  8. return wrapper

  9. return decorator

  10. def is_service_ready():

  11. # 检查服务是否就绪

  12. pass

  13. @require_state(is_service_ready)

  14. def test_dependent_on_service():

  15. # 执行依赖于服务状态的测试

  16. pass‍

测试标记装饰器

为测试用例添加特定的标签,便于分类和过滤。


  1. import pytest

  2. @pytest.mark.smoke

  3. def test_smoke_example():

  4. # 用于快速验证核心功能的烟雾测试

  5. pass

  6. @pytest.mark.performance

  7. def test_performance_example():

  8. # 性能测试

  9. pass‍

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

Logo

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

更多推荐