深拷貝(deep copy)常用于復制請求參數、配置對象或其他復雜數據結構,以確保每次發送請求時使用的是獨立的數據副本,避免不同請求之間的數據互相影響。例如,當你需要多次調用同一個接口,但每次調用的參數略有不同的時候,深拷貝可以幫助你創建參數對象的新實例。
import requestsimport copy# 假設有一個包含接口請求參數的字典base_params = { 'user_id': 123, 'data': { 'name': 'Alice', 'address': { 'street': '123 Main St' } }}# 在接口自動化測試中,我們可能需要對某些參數進行修改后發起請求def send_request(modified_params): # 使用深拷貝來創建原始參數的一個完整副本 params = copy.deepcopy(base_params) # 現在可以安全地修改副本而不影響原始參數 params['user_id'] = modified_params['user_id'] params['data']['name'] = modified_params.get('new_name', params['data']['name']) # 發送HTTP請求 response = requests.post('http://api.example.com/endpoint', jsnotallow=params) # 處理響應并驗證結果...# 調用函數,傳入要修改的參數test_case_1_params = {'user_id': 456, 'new_name': 'Bob'}send_request(test_case_1_params)# 下一個測試案例,使用不同的參數test_case_2_params = {'user_id': 789, 'new_name': 'Charlie'}send_request(test_case_2_params)
在這個例子中,copy.deepcopy() 方法被用來創建 base_params 的深拷貝,這樣每個測試用例都可以根據需要獨立修改參數,并且不會干擾其他測試用例或后續的請求。這對于維護數據一致性以及避免由于數據共享導致的問題非常有用。
包含多個請求參數集合的列表,每個集合代表一次獨立的接口調用:
import copyimport requests# 假設我們有一系列需要以不同參數發送的請求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: # 根據測試需求修改每個請求的參數 request['data']['name'] = modified_requests[request['data']['user_id']]['new_name'] # 發送HTTP請求 response = requests.request(request['method'], request['url'], jsnotallow=request['data']) # 處理響應并驗證結果...# 定義要修改的用戶名稱modified_user_names = { 1: 'Charlie', 2: 'Dave'}# 調用函數,傳入要修改的參數send_requests(modified_user_names)
在這個例子中,通過深拷貝base_requests列表,我們可以對每個請求中的數據進行獨立修改,而不會影響到其他請求或后續的測試。這樣就能確保在并發或批量執行接口測試時,每次請求使用的都是獨立的數據副本。
全局配置對象,包含了所有請求的通用頭信息或其他默認設置:
import requestsimport copy# 全局配置對象global_config = { 'headers': { 'Content-Type': 'application/json', 'Authorization': 'Bearer some_token' }, 'timeout': 30, 'proxies': {...}}# 定義一個發送請求的函數,利用深拷貝來創建全局配置的副本def send_request(url, data, custom_cnotallow={}): # 創建全局配置的深拷貝 config = copy.deepcopy(global_config) # 更新或添加自定義配置 config.update(custom_config) # 發送HTTP請求 response = requests.post(url, jsnotallow=data, **config) # 處理響應并驗證結果...# 使用默認配置發送請求send_request('http://api.example.com/user', {'user_id': 1})# 發送具有部分自定義配置的請求(如:更新令牌)custom_config = {'headers': {'Authorization': 'Bearer new_token'}}send_request('http://api.example.com/user', {'user_id': 2}, custom_config)
在這個例子中,通過深拷貝 global_config,我們可以在不改變原始全局配置的前提下,為每個單獨的請求定制不同的配置項。這樣在處理多用戶、多環境或者需要臨時修改某些配置參數的情況時,可以確保每次請求都基于獨立且完整的配置對象,從而避免數據污染和錯誤發生。
在并行執行多個接口測試用例時,每個測試任務可能會加載一套共享的基礎數據,但需要獨立操作這些數據以模擬不同的業務場景:
import threadingimport copyimport requests# 基礎數據集base_data = { 'users': [ {'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'} ], 'products': [...]}def run_test_case(test_case, copied_data): # 在線程內部對復制的數據進行修改和使用 for user in copied_data['users']: if user['id'] == test_case['user_id']: user['name'] = test_case.get('new_name', user['name']) # 根據測試用例發送請求 response = requests.put(f'http://api.example.com/user/{test_case["user_id"]}', jsnotallow=user) # 處理響應并驗證結果...# 定義測試用例列表test_cases = [ {'user_id': 1, 'new_name': 'Charlie'}, {'user_id': 2, 'new_name': 'Dave'}]# 使用多線程并發執行測試用例,并為每個線程提供基礎數據的深拷貝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()
在這個例子中,通過在每個線程內部創建 base_data 的深拷貝,我們可以確保即使在并發環境下,不同測試用例之間也能安全地獨立操作數據,避免了競態條件和其他同步問題的發生。
在執行測試用例前,你可能需要從數據庫加載一些初始數據,然后基于這些數據進行修改和操作:
import copyimport db_connection # 假設這是一個連接到數據庫的模塊# 從數據庫獲取基礎數據base_data = db_connection.fetch_test_data()def run_test_case(test_case, copied_data): # 在測試用例內部對復制的數據進行修改 for record in copied_data['records']: if record['id'] == test_case['record_id']: record['status'] = test_case['new_status'] # 執行更新數據庫的操作(這里僅為示例,實際應使用db_connection模塊) updated_data = update_database(copied_data) # 根據新狀態發送請求并驗證響應結果 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'}]# 對每個測試用例運行,并提供數據庫數據的深拷貝for case in test_cases: copied_data = copy.deepcopy(base_data) run_test_case(case, copied_data)# 清理資源,如重置數據庫狀態至原始值db_connection.reset_to_original_data(base_data)
在這個例子中,通過深拷貝從數據庫獲取的基礎數據,我們可以安全地模擬各種業務場景下的數據更新操作,同時保證不會影響到其他測試用例或后續的數據恢復過程。在測試結束后,可以將數據庫狀態重置為初始狀態,以確保測試環境的一致性。
本文鏈接:http://www.www897cc.com/showinfo-26-75305-0.htmlPython深拷貝在接口自動化里的用法
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com