Simplify API Testing with a Python @extract_value Decorator

Learn how to create and use a Python @extract_value decorator that automatically pulls specific fields from API responses, stores them in a global context, and lets subsequent test steps access these values without manual extraction, complete with step-by-step code examples and common pitfalls.

Test Development Learning Exchange
Test Development Learning Exchange
Test Development Learning Exchange
Simplify API Testing with a Python @extract_value Decorator

When testing APIs, developers often need to extract values such as tokens from JSON responses and reuse them across multiple calls. Manually accessing nested fields (e.g., response.json()['data']['token']) is error‑prone and repetitive.

Traditional approach vs. decorator

Without a helper, each request requires explicit extraction and variable assignment, leading to duplicated code and a higher chance of typos. The @extract_value decorator abstracts this pattern: it runs the original function, extracts a value based on a dotted key path, stores the result in a shared dictionary, and optionally injects a global variable for convenient use.

Step‑by‑step implementation

Create a global storage dictionary TEST_DATA = {} Write the decorator

from functools import wraps

def extract_value(key: str, context_var: str):
    """Extract a value from a JSON response and store it.
    - key: dotted path like "data.access_token"
    - context_var: name to store in TEST_DATA (and optionally as a global)"""
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            response = func(*args, **kwargs)
            json_data = response.json()
            value = json_data
            for part in key.split('.'):
                value = value[part]
            # store in shared dict and as a global variable
            TEST_DATA[context_var] = value
            globals()[context_var] = value
            print(f"✅ Extracted {key} → {context_var} = {value}")
            return response
        return wrapper
    return decorator

Apply the decorator to API calls

@extract_value(key="data.access_token", context_var="my_token")
def login():
    return requests.post("https://api.example.com/login", json={"user": "alice", "pwd": "123"})

def get_user():
    headers = {"Authorization": f"Bearer {my_token}"}
    return requests.get("https://api.example.com/user", headers=headers)

login()
get_user()

Full runnable example

The article provides a self‑contained script that uses httpbin.org to simulate a login and subsequent request. Running the script prints the extracted username and demonstrates that the variable can be used directly in later functions.

import requests
from functools import wraps

# ----- 1. Decorator definition (same as above) -----

def extract_value(key: str, context_var: str):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            response = func(*args, **kwargs)
            json_data = response.json()
            value = json_data
            for part in key.split('.'):
                value = value[part]
            globals()[context_var] = value
            print(f"✅ 提取成功:{key} → {context_var} = {value}")
            return response
        return wrapper
    return decorator

# ----- 2. Test cases -----
@extract_value(key='json.username', context_var='current_user')
def fake_login():
    """Simulate login via httpbin"""
    return requests.post('https://httpbin.org/post', json={'username': '小明', 'password': '123456'})

def get_profile():
    print(f"正在查询用户:{current_user} 的资料...")

if __name__ == '__main__':
    print('🚀 开始测试流程...')
    fake_login()
    get_profile()
    print('🎉 测试完成!')

Common questions & tips

Missing field : A KeyError is raised; wrap extraction in try/except or use .get() for safety.

Extracting multiple values : Apply multiple decorators, one per field, remembering that decorators execute from bottom to top.

Variable name collisions : Choose distinct context_var names (e.g., login_token, order_id) to avoid overwriting.

Conclusion

The @extract_value decorator turns repetitive JSON extraction into a single, reusable step, reduces boilerplate, and makes automated API tests cleaner and less error‑prone. By injecting the extracted value as a global variable, subsequent test functions can reference it directly without additional parsing.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

AutomationCode ExampleDecoratorAPI testingJSON extraction
Test Development Learning Exchange
Written by

Test Development Learning Exchange

Test Development Learning Exchange

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.