自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python深拷貝在接口自動(dòng)化里的用法

開發(fā)
深拷貝(deep copy)常用于復(fù)制請(qǐng)求參數(shù)、配置對(duì)象或其他復(fù)雜數(shù)據(jù)結(jié)構(gòu),以確保每次發(fā)送請(qǐng)求時(shí)使用的是獨(dú)立的數(shù)據(jù)副本,避免不同請(qǐng)求之間的數(shù)據(jù)互相影響。

深拷貝(deep copy)常用于復(fù)制請(qǐng)求參數(shù)、配置對(duì)象或其他復(fù)雜數(shù)據(jù)結(jié)構(gòu),以確保每次發(fā)送請(qǐng)求時(shí)使用的是獨(dú)立的數(shù)據(jù)副本,避免不同請(qǐng)求之間的數(shù)據(jù)互相影響。例如,當(dāng)你需要多次調(diào)用同一個(gè)接口,但每次調(diào)用的參數(shù)略有不同的時(shí)候,深拷貝可以幫助你創(chuàng)建參數(shù)對(duì)象的新實(shí)例。

基礎(chǔ)示例

import requests
import copy
# 假設(shè)有一個(gè)包含接口請(qǐng)求參數(shù)的字典
base_params = {
    'user_id': 123,
    'data': {
        'name': 'Alice',
        'address': {
            'street': '123 Main St'
        }
    }
}
# 在接口自動(dòng)化測(cè)試中,我們可能需要對(duì)某些參數(shù)進(jìn)行修改后發(fā)起請(qǐng)求
def send_request(modified_params):
    # 使用深拷貝來創(chuàng)建原始參數(shù)的一個(gè)完整副本
    params = copy.deepcopy(base_params)
    # 現(xiàn)在可以安全地修改副本而不影響原始參數(shù)
    params['user_id'] = modified_params['user_id']
    params['data']['name'] = modified_params.get('new_name', params['data']['name'])
    # 發(fā)送HTTP請(qǐng)求
    response = requests.post('http://api.example.com/endpoint', jsnotallow=params)
    # 處理響應(yīng)并驗(yàn)證結(jié)果...
# 調(diào)用函數(shù),傳入要修改的參數(shù)
test_case_1_params = {'user_id': 456, 'new_name': 'Bob'}
send_request(test_case_1_params)
# 下一個(gè)測(cè)試案例,使用不同的參數(shù)
test_case_2_params = {'user_id': 789, 'new_name': 'Charlie'}
send_request(test_case_2_params)

在這個(gè)例子中,copy.deepcopy() 方法被用來創(chuàng)建 base_params 的深拷貝,這樣每個(gè)測(cè)試用例都可以根據(jù)需要獨(dú)立修改參數(shù),并且不會(huì)干擾其他測(cè)試用例或后續(xù)的請(qǐng)求。這對(duì)于維護(hù)數(shù)據(jù)一致性以及避免由于數(shù)據(jù)共享導(dǎo)致的問題非常有用。

深拷貝處理列表、字典嵌套的數(shù)據(jù)結(jié)構(gòu)

包含多個(gè)請(qǐng)求參數(shù)集合的列表,每個(gè)集合代表一次獨(dú)立的接口調(diào)用:

import copy
import requests
# 假設(shè)我們有一系列需要以不同參數(shù)發(fā)送的請(qǐng)求
base_requests = [
    {
        'method': 'POST',
        'url': 'http://api.example.com/user',
        'data': {
            'user_id': 1,
            'name': 'Alice'
        }
    },
    {
        'method': 'POST',
        'url': 'http://api.example.com/user',
        'data': {
            'user_id': 2,
            'name': 'Bob'
        }
    }
]
def send_requests(modified_requests):
    # 對(duì)原始請(qǐng)求列表進(jìn)行深拷貝
    requests_to_send = copy.deepcopy(base_requests)
    for request in requests_to_send:
        # 根據(jù)測(cè)試需求修改每個(gè)請(qǐng)求的參數(shù)
        request['data']['name'] = modified_requests[request['data']['user_id']]['new_name']
        # 發(fā)送HTTP請(qǐng)求
        response = requests.request(request['method'], request['url'], jsnotallow=request['data'])
        # 處理響應(yīng)并驗(yàn)證結(jié)果...
# 定義要修改的用戶名稱
modified_user_names = {
    1: 'Charlie',
    2: 'Dave'
}
# 調(diào)用函數(shù),傳入要修改的參數(shù)
send_requests(modified_user_names)

在這個(gè)例子中,通過深拷貝base_requests列表,我們可以對(duì)每個(gè)請(qǐng)求中的數(shù)據(jù)進(jìn)行獨(dú)立修改,而不會(huì)影響到其他請(qǐng)求或后續(xù)的測(cè)試。這樣就能確保在并發(fā)或批量執(zhí)行接口測(cè)試時(shí),每次請(qǐng)求使用的都是獨(dú)立的數(shù)據(jù)副本。

深拷貝管理復(fù)雜的會(huì)話狀態(tài)或全局配置

全局配置對(duì)象,包含了所有請(qǐng)求的通用頭信息或其他默認(rèn)設(shè)置:

import requests
import copy
# 全局配置對(duì)象
global_config = {
    'headers': {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer some_token'
    },
    'timeout': 30,
    'proxies': {...}
}
# 定義一個(gè)發(fā)送請(qǐng)求的函數(shù),利用深拷貝來創(chuàng)建全局配置的副本
def send_request(url, data, custom_cnotallow={}):
    # 創(chuàng)建全局配置的深拷貝
    config = copy.deepcopy(global_config)
    # 更新或添加自定義配置
    config.update(custom_config)
    # 發(fā)送HTTP請(qǐng)求
    response = requests.post(url, jsnotallow=data, **config)
    # 處理響應(yīng)并驗(yàn)證結(jié)果...
# 使用默認(rèn)配置發(fā)送請(qǐng)求
send_request('http://api.example.com/user', {'user_id': 1})
# 發(fā)送具有部分自定義配置的請(qǐng)求(如:更新令牌)
custom_config = {'headers': {'Authorization': 'Bearer new_token'}}
send_request('http://api.example.com/user', {'user_id': 2}, custom_config)

在這個(gè)例子中,通過深拷貝 global_config,我們可以在不改變?cè)既峙渲玫那疤嵯?,為每個(gè)單獨(dú)的請(qǐng)求定制不同的配置項(xiàng)。這樣在處理多用戶、多環(huán)境或者需要臨時(shí)修改某些配置參數(shù)的情況時(shí),可以確保每次請(qǐng)求都基于獨(dú)立且完整的配置對(duì)象,從而避免數(shù)據(jù)污染和錯(cuò)誤發(fā)生。

深拷貝在持續(xù)集成(CI)或持續(xù)部署(CD)的場(chǎng)景使用

在并行執(zhí)行多個(gè)接口測(cè)試用例時(shí),每個(gè)測(cè)試任務(wù)可能會(huì)加載一套共享的基礎(chǔ)數(shù)據(jù),但需要獨(dú)立操作這些數(shù)據(jù)以模擬不同的業(yè)務(wù)場(chǎng)景:

import threading
import copy
import requests
# 基礎(chǔ)數(shù)據(jù)集
base_data = {
    'users': [
        {'id': 1, 'name': 'Alice'},
        {'id': 2, 'name': 'Bob'}
    ],
    'products': [...]
}
def run_test_case(test_case, copied_data):
    # 在線程內(nèi)部對(duì)復(fù)制的數(shù)據(jù)進(jìn)行修改和使用
    for user in copied_data['users']:
        if user['id'] == test_case['user_id']:
            user['name'] = test_case.get('new_name', user['name'])
    # 根據(jù)測(cè)試用例發(fā)送請(qǐng)求
    response = requests.put(f'http://api.example.com/user/{test_case["user_id"]}', jsnotallow=user)
    # 處理響應(yīng)并驗(yàn)證結(jié)果...
# 定義測(cè)試用例列表
test_cases = [
    {'user_id': 1, 'new_name': 'Charlie'},
    {'user_id': 2, 'new_name': 'Dave'}
]
# 使用多線程并發(fā)執(zhí)行測(cè)試用例,并為每個(gè)線程提供基礎(chǔ)數(shù)據(jù)的深拷貝
threads = []
for case in test_cases:
    copied_data = copy.deepcopy(base_data)
    thread = threading.Thread(target=run_test_case, args=(case, copied_data))
    threads.append(thread)
    thread.start()
# 等待所有線程完成
for thread in threads:
    thread.join()

在這個(gè)例子中,通過在每個(gè)線程內(nèi)部創(chuàng)建 base_data 的深拷貝,我們可以確保即使在并發(fā)環(huán)境下,不同測(cè)試用例之間也能安全地獨(dú)立操作數(shù)據(jù),避免了競(jìng)態(tài)條件和其他同步問題的發(fā)生。

深拷貝處理數(shù)據(jù)庫或緩存中的數(shù)據(jù)

在執(zhí)行測(cè)試用例前,你可能需要從數(shù)據(jù)庫加載一些初始數(shù)據(jù),然后基于這些數(shù)據(jù)進(jìn)行修改和操作:

import copy
import db_connection  # 假設(shè)這是一個(gè)連接到數(shù)據(jù)庫的模塊
# 從數(shù)據(jù)庫獲取基礎(chǔ)數(shù)據(jù)
base_data = db_connection.fetch_test_data()
def run_test_case(test_case, copied_data):
    # 在測(cè)試用例內(nèi)部對(duì)復(fù)制的數(shù)據(jù)進(jìn)行修改
    for record in copied_data['records']:
        if record['id'] == test_case['record_id']:
            record['status'] = test_case['new_status']
    # 執(zhí)行更新數(shù)據(jù)庫的操作(這里僅為示例,實(shí)際應(yīng)使用db_connection模塊)
    updated_data = update_database(copied_data)
    # 根據(jù)新狀態(tài)發(fā)送請(qǐng)求并驗(yàn)證響應(yīng)結(jié)果
    response = requests.get(f'http://api.example.com/record/{test_case["record_id"]}')
    assert response.json()['status'] == test_case['new_status']
# 定義測(cè)試用例列表
test_cases = [
    {'record_id': 1, 'new_status': 'active'},
    {'record_id': 2, 'new_status': 'inactive'}
]
# 對(duì)每個(gè)測(cè)試用例運(yùn)行,并提供數(shù)據(jù)庫數(shù)據(jù)的深拷貝
for case in test_cases:
    copied_data = copy.deepcopy(base_data)
    run_test_case(case, copied_data)
# 清理資源,如重置數(shù)據(jù)庫狀態(tài)至原始值
db_connection.reset_to_original_data(base_data)

在這個(gè)例子中,通過深拷貝從數(shù)據(jù)庫獲取的基礎(chǔ)數(shù)據(jù),我們可以安全地模擬各種業(yè)務(wù)場(chǎng)景下的數(shù)據(jù)更新操作,同時(shí)保證不會(huì)影響到其他測(cè)試用例或后續(xù)的數(shù)據(jù)恢復(fù)過程。在測(cè)試結(jié)束后,可以將數(shù)據(jù)庫狀態(tài)重置為初始狀態(tài),以確保測(cè)試環(huán)境的一致性。

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

2024-04-30 15:05:36

Python接口自動(dòng)化

2024-08-20 16:32:37

python接口自動(dòng)化

2024-04-03 15:27:31

Python接口自動(dòng)化開發(fā)

2024-02-26 00:00:01

?win32WindowsCOM

2023-10-06 22:12:40

Python開發(fā)工業(yè)系統(tǒng)

2018-05-11 08:29:10

Python自動(dòng)化測(cè)試數(shù)據(jù)驅(qū)動(dòng)

2018-05-11 13:39:05

PythonCSV接口測(cè)試

2010-07-26 10:02:49

Perl多進(jìn)程

2017-05-24 11:54:55

Javascript深拷貝

2024-04-17 09:01:08

Python深拷貝淺拷貝

2023-09-13 11:40:12

2022-12-26 12:30:28

接口測(cè)試

2022-07-26 08:07:03

Python淺拷貝深拷貝

2022-08-05 22:15:26

Python自動(dòng)化測(cè)試

2017-12-17 21:58:18

2017-08-16 13:30:05

Java深拷貝淺拷貝

2021-07-16 12:33:24

Javascript深拷貝淺拷貝

2024-01-08 13:31:00

Rust自動(dòng)化測(cè)試

2022-08-14 16:11:23

Python自動(dòng)化測(cè)試數(shù)據(jù)

2024-05-21 09:52:19

點(diǎn)贊
收藏

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