日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Python深拷貝在接口自動化里的用法

來源: 責編: 時間:2024-02-29 14:39:07 205觀看
導讀深拷貝(deep copy)常用于復制請求參數(shù)、配置對象或其他復雜數(shù)據(jù)結(jié)構(gòu),以確保每次發(fā)送請求時使用的是獨立的數(shù)據(jù)副本,避免不同請求之間的數(shù)據(jù)互相影響。例如,當你需要多次調(diào)用同一個接口,但每次調(diào)用的參數(shù)略有不同的時候,深拷

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

lEW28資訊網(wǎng)——每日最新資訊28at.com

基礎示例

import requestsimport copy# 假設有一個包含接口請求參數(shù)的字典base_params = {    'user_id': 123,    'data': {        'name': 'Alice',        'address': {            'street': '123 Main St'        }    }}# 在接口自動化測試中,我們可能需要對某些參數(shù)進行修改后發(fā)起請求def send_request(modified_params):    # 使用深拷貝來創(chuàng)建原始參數(shù)的一個完整副本    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請求    response = requests.post('http://api.example.com/endpoint', jsnotallow=params)    # 處理響應并驗證結(jié)果...# 調(diào)用函數(shù),傳入要修改的參數(shù)test_case_1_params = {'user_id': 456, 'new_name': 'Bob'}send_request(test_case_1_params)# 下一個測試案例,使用不同的參數(shù)test_case_2_params = {'user_id': 789, 'new_name': 'Charlie'}send_request(test_case_2_params)

在這個例子中,copy.deepcopy() 方法被用來創(chuàng)建 base_params 的深拷貝,這樣每個測試用例都可以根據(jù)需要獨立修改參數(shù),并且不會干擾其他測試用例或后續(xù)的請求。這對于維護數(shù)據(jù)一致性以及避免由于數(shù)據(jù)共享導致的問題非常有用。lEW28資訊網(wǎng)——每日最新資訊28at.com

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

包含多個請求參數(shù)集合的列表,每個集合代表一次獨立的接口調(diào)用:lEW28資訊網(wǎng)——每日最新資訊28at.com

import copyimport requests# 假設我們有一系列需要以不同參數(shù)發(fā)送的請求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):    # 對原始請求列表進行深拷貝    requests_to_send = copy.deepcopy(base_requests)    for request in requests_to_send:        # 根據(jù)測試需求修改每個請求的參數(shù)        request['data']['name'] = modified_requests[request['data']['user_id']]['new_name']        # 發(fā)送HTTP請求        response = requests.request(request['method'], request['url'], jsnotallow=request['data'])        # 處理響應并驗證結(jié)果...# 定義要修改的用戶名稱modified_user_names = {    1: 'Charlie',    2: 'Dave'}# 調(diào)用函數(shù),傳入要修改的參數(shù)send_requests(modified_user_names)

在這個例子中,通過深拷貝base_requests列表,我們可以對每個請求中的數(shù)據(jù)進行獨立修改,而不會影響到其他請求或后續(xù)的測試。這樣就能確保在并發(fā)或批量執(zhí)行接口測試時,每次請求使用的都是獨立的數(shù)據(jù)副本。lEW28資訊網(wǎng)——每日最新資訊28at.com

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

全局配置對象,包含了所有請求的通用頭信息或其他默認設置:lEW28資訊網(wǎng)——每日最新資訊28at.com

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

在這個例子中,通過深拷貝 global_config,我們可以在不改變原始全局配置的前提下,為每個單獨的請求定制不同的配置項。這樣在處理多用戶、多環(huán)境或者需要臨時修改某些配置參數(shù)的情況時,可以確保每次請求都基于獨立且完整的配置對象,從而避免數(shù)據(jù)污染和錯誤發(fā)生。lEW28資訊網(wǎng)——每日最新資訊28at.com

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

在并行執(zhí)行多個接口測試用例時,每個測試任務可能會加載一套共享的基礎數(shù)據(jù),但需要獨立操作這些數(shù)據(jù)以模擬不同的業(yè)務場景:lEW28資訊網(wǎng)——每日最新資訊28at.com

import threadingimport copyimport requests# 基礎數(shù)據(jù)集base_data = {    'users': [        {'id': 1, 'name': 'Alice'},        {'id': 2, 'name': 'Bob'}    ],    'products': [...]}def run_test_case(test_case, copied_data):    # 在線程內(nèi)部對復制的數(shù)據(jù)進行修改和使用    for user in copied_data['users']:        if user['id'] == test_case['user_id']:            user['name'] = test_case.get('new_name', user['name'])    # 根據(jù)測試用例發(fā)送請求    response = requests.put(f'http://api.example.com/user/{test_case["user_id"]}', jsnotallow=user)    # 處理響應并驗證結(jié)果...# 定義測試用例列表test_cases = [    {'user_id': 1, 'new_name': 'Charlie'},    {'user_id': 2, 'new_name': 'Dave'}]# 使用多線程并發(fā)執(zhí)行測試用例,并為每個線程提供基礎數(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()

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

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

在執(zhí)行測試用例前,你可能需要從數(shù)據(jù)庫加載一些初始數(shù)據(jù),然后基于這些數(shù)據(jù)進行修改和操作:lEW28資訊網(wǎng)——每日最新資訊28at.com

import copyimport db_connection  # 假設這是一個連接到數(shù)據(jù)庫的模塊# 從數(shù)據(jù)庫獲取基礎數(shù)據(jù)base_data = db_connection.fetch_test_data()def run_test_case(test_case, copied_data):    # 在測試用例內(nèi)部對復制的數(shù)據(jù)進行修改    for record in copied_data['records']:        if record['id'] == test_case['record_id']:            record['status'] = test_case['new_status']    # 執(zhí)行更新數(shù)據(jù)庫的操作(這里僅為示例,實際應使用db_connection模塊)    updated_data = update_database(copied_data)    # 根據(jù)新狀態(tài)發(fā)送請求并驗證響應結(jié)果    response = requests.get(f'http://api.example.com/record/{test_case["record_id"]}')    assert response.json()['status'] == test_case['new_status']# 定義測試用例列表test_cases = [    {'record_id': 1, 'new_status': 'active'},    {'record_id': 2, 'new_status': 'inactive'}]# 對每個測試用例運行,并提供數(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)

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

本文鏈接:http://www.www897cc.com/showinfo-26-75305-0.htmlPython深拷貝在接口自動化里的用法

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 掌握各種 Git 服務倉庫信息的解析與轉(zhuǎn)換

下一篇: 年后跳槽,從 Go 到 Rust 面試掛了

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 布拖县| 龙口市| 旬阳县| 辽阳市| 瓦房店市| 怀仁县| 双流县| 舞钢市| 哈巴河县| 钟祥市| 阜城县| 新化县| 页游| 丰镇市| 汕尾市| 古丈县| 沂源县| 临清市| 株洲县| 宝兴县| 常德市| 沐川县| 始兴县| 德昌县| 清流县| 鄂尔多斯市| 阆中市| 惠安县| 临夏市| 潼南县| 新田县| 柳林县| 河东区| 临桂县| 抚顺县| 龙井市| 中卫市| 交口县| 惠东县| 深圳市| 江北区|