偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Python 裝飾器工廠在接口自動化中的六種高級用法

開發(fā) 前端
裝飾器工廠(Decorator Factory)在 接口自動化測試框架 中有非常廣泛的應(yīng)用。它不僅可以提升代碼的可讀性和復(fù)用性,還能幫助我們實現(xiàn)。

裝飾器工廠(Decorator Factory)在 接口自動化測試框架 中有非常廣泛的應(yīng)用。它不僅可以提升代碼的可讀性和復(fù)用性,還能幫助我們實現(xiàn):

1、接口日志記錄

2、異常重試機制

3、權(quán)限校驗

4、性能監(jiān)控

5、數(shù)據(jù)驅(qū)動

6、環(huán)境切換

前提準(zhǔn)備:定義一個通用接口函數(shù)模板

import requests

from functools import wraps

1. 日志記錄裝飾器工廠(支持不同級別)

功能說明:

根據(jù)傳入的日志級別(info/debug),記錄接口調(diào)用信息。

實現(xiàn)代碼:

def make_logger(level='info', enabled=True):
    def logger_decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if not enabled:
                return func(*args, **kwargs)
            log_method = {
                'info': logging.info,
                'debug': logging.debug
            }.get(level.lower(), logging.info)
            log_method(f"[{func.__name__}] 正在調(diào)用接口...")
            result = func(*args, **kwargs)
            log_method(f"[{func.__name__}] 接口調(diào)用完成")
            return result
        return wrapper
    return logger_decorator

使用示例:

@make_logger('debug')
def get_user_info(user_id):
    print(f"獲取用戶 {user_id} 的信息")
get_user_info(1001)

?? 輸出:

2025-06-29 14:30:00,123 [DEBUG] [get_user_info] 正在調(diào)用接口...

獲取用戶 1001 的信息

2025-06-29 14:30:00,124 [DEBUG] [get_user_info] 接口調(diào)用完成

 2. 接口異常自動重試裝飾器工廠

功能說明:

封裝一個通用的重試邏輯,失敗時自動重試 N 次,適用于網(wǎng)絡(luò)請求等不穩(wěn)定操作。

實現(xiàn)代碼:

def retry(max_retries=3, delay=1, exceptinotallow=(Exception,)):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            retries = 0
            while retries <= max_retries:
                try:
                    return func(*args, **kwargs)
                except exceptions as e:
                    retries += 1
                    logging.warning(f"[{func.__name__}] 第 {retries}/{max_retries} 次重試失敗: {e}")
                    if retries > max_retries:
                        raise
                    time.sleep(delay)
            return None
        return wrapper
    return decorator

使用示例:

@retry(max_retries=3, exceptinotallow=(requests.exceptions.RequestException,))
def fetch_data(url):
    response = requests.get(url)
    return response.json()
try:
    data = fetch_data("https://api.example.com/data")
    print(data)
except Exception as e:
    print("最終請求失敗:", e)

3. 權(quán)限驗證裝飾器工廠(支持角色控制)

功能說明:

根據(jù)不同用戶角色(如 admin、user)決定是否允許執(zhí)行某個接口。

實現(xiàn)代碼:

def permission_required(role='user'):
    def decorator(func):
        @wraps(func)
        def wrapper(context, *args, **kwargs):
            user_role = context.get('role')
            if user_role != role:
                logging.error(f"[{func.__name__}] 權(quán)限不足,需要 {role} 角色,當(dāng)前為 {user_role}")
                raise PermissionError(f"權(quán)限不足,需要 {role} 角色")
            return func(context, *args, **kwargs)
        return wrapper
    return decorator

使用示例:

@permission_required('admin')
def delete_user(context, user_id):
    print(f"管理員 {context['username']} 刪除了用戶 {user_id}")
context = {'username': '張三', 'role': 'admin'}
delete_user(context, 1002)

4. 接口性能統(tǒng)計裝飾器工廠

功能說明:

記錄接口執(zhí)行時間,用于性能分析或優(yōu)化。

實現(xiàn)代碼:

import time
def performance_monitor(enabled=True):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if not enabled:
                return func(*args, **kwargs)
            start = time.time()
            result = func(*args, **kwargs)
            duration = time.time() - start
            logging.info(f"[{func.__name__}] 執(zhí)行耗時: {duration:.4f} 秒")
            return result
        return wrapper
    return decorator

使用示例:

@performance_monitor()
def slow_api():
    time.sleep(1.2)
slow_api()

?? 輸出:

[slow_api] 執(zhí)行耗時: 1.2003 秒

5. 數(shù)據(jù)驅(qū)動裝飾器工廠(參數(shù)化測試)

功能說明:

為接口函數(shù)動態(tài)注入測試數(shù)據(jù),實現(xiàn)參數(shù)化測試。

實現(xiàn)代碼:

def data_provider(data_list):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for data in data_list:
                logging.info(f"運行測試用例: {data}")
                func(*data)
        return wrapper
    return decorator

使用示例:

@test_data([
    ("張三", "北京"),
    ("李四", "上海"),
    ("王五", "廣州")
])
def test_user_location(name, city):
    print(f"{name} 的城市是 {city}")
test_user_location()

?? 輸出:

運行測試用例: ('張三', '北京')

張三 的城市是 北京

運行測試用例: ('李四', '上海')

李四 的城市是 上海

...

6. 環(huán)境切換裝飾器工廠(開發(fā)/測試/生產(chǎn))

功能說明:

根據(jù)環(huán)境配置自動切換接口地址或行為。

實現(xiàn)代碼:

def environment_switch(env='dev'):
    base_urls = {
        'dev': 'http://dev.api.example.com',
        'test': 'http://test.api.example.com',
        'prod': 'http://api.example.com'
    }
    def decorator(func):
        @wraps(func)
        def wrapper(endpoint, *args, **kwargs):
            full_url = f"{base_urls[env]}/{endpoint}"
            logging.info(f"[{func.__name__}] 請求地址: {full_url}")
            return func(full_url, *args, **kwargs)
        return wrapper
    return decorator

使用示例:

@environment_switch('test')
def call_api(url):
    print(f"正在調(diào)用接口: {url}")
call_api("users/list")

?? 輸出:

[test_api] 請求地址: http://test.api.example.com/users/list

正在調(diào)用接口: http://test.api.example.com/users/list

?? 總結(jié)表格:6 種裝飾器工廠對比

圖片圖片


責(zé)任編輯:武曉燕 來源: 測試開發(fā)學(xué)習(xí)交流
相關(guān)推薦

2024-08-20 16:32:37

python接口自動化

2024-02-28 16:04:04

深拷貝Python

2025-01-06 15:00:00

Python裝飾器代碼

2020-12-14 10:52:44

Python裝飾器開發(fā)

2023-02-15 16:31:08

Linux自動化編排工具

2021-06-01 07:19:58

Python函數(shù)裝飾器

2023-06-01 16:45:11

React開發(fā)JavaScript

2023-08-15 15:44:55

React開發(fā)

2016-05-10 14:38:13

大數(shù)據(jù)企業(yè)

2023-04-26 08:41:16

Git撤消更改

2011-05-11 10:00:57

2011-07-29 13:17:35

HTML 5

2025-10-21 02:00:00

2024-10-12 08:18:21

Spring接口組件

2024-04-30 15:05:36

Python接口自動化

2022-10-19 16:26:48

數(shù)字化轉(zhuǎn)型技巧數(shù)據(jù)分析

2023-09-24 14:52:21

數(shù)據(jù)分析相關(guān)系數(shù)矩陣

2023-09-01 09:21:03

Python自動化測試

2021-03-02 10:55:07

云計算自動化云應(yīng)用

2021-07-29 09:00:00

Python工具機器學(xué)習(xí)
點贊
收藏

51CTO技術(shù)棧公眾號