python介面測試:在一個用例檔案中呼叫另一個用例檔案中定義的方法
說明
在進行介面測試時,經常會遇到不同介面間傳遞引數的情況,即一個介面的某個引數需要取另一個介面的返回值;
在平常寫指令碼過程中,我經常會在同一個py檔案中,把相關介面的呼叫方法都寫好,這樣在同一個檔案中能夠很方便的進行呼叫;
後來隨著功能增多,在寫其他py檔案時,有時也會先呼叫某個相同的介面來獲取引數;
如果在每個py檔案中都寫一遍呼叫某個介面的方法,會顯得很囉嗦,也不好維護,並且以後萬一提供資料的那個介面發生變化,需要調整很多地方;
所以,當我們在一個用例py檔案中寫好某個介面呼叫方法,後續如果在其他py檔案中也要用到這個介面的返回值,則直接引用先前py檔案中定義好的介面呼叫方法即可。
例項
介面功能說明:
A介面--呼叫A介面可以生成一條資料,每條資料對應一個id
B介面--呼叫B介面可以返回一條資料的詳情,但是調B介面時,需要一個必要引數即資料id
1、新建一個py檔案,例如test_A.py
內容如下
import unittest import requests import json class CreateActivity(unittest.TestCase): """活動管理選單建立活動-測試用例""" def setUp(self): ……………… 一些必要的初始化工作,例如讀取配置檔案、呼叫其他方法等 ………………def push_file_download(self, xxx): """生成一條活動資料""" ……………… ……………… ……………… response = requests.post(self.base_url+self.push_file_download_url, data=json.dumps(payload), headers=headers) data= json.loads(response.content) try: if data["data"] != {}: r_data = { "Id": data["data"]["Id"] } return r_data else: print("返回結果為空或返回資料異常,請檢查介面") return None except Exception as e: logger.error("介面錯誤資訊為 %r", e) print("headers資訊:", headers) print("請求地址:", response.url) print("引數資訊:", payload) raise e ……………… ………………
在這個檔案中建立了一個類:CreateActivity,繼承自unittest.TestCase
然後在setUp方法中進行了一些必要的初始化工作
最後建立了一個名為push_file_download的方法,它的作用就是調某個介面,來生成資料
2、新建另一個py檔案,例如test_B.py
內容如下
1 import unittest 2 from create_activity import CreateActivity 3 import requests 4 import json 5 6 7 8 class OperateActivity(unittest.TestCase): 9 """活動管理選單建立活動-測試用例""" 10 11 def setUp(self): 12 13 ……………… 14 15 一些必要的初始化工作,例如讀取配置檔案、呼叫其他方法等 16 ……………… 17 18 def view_activity(self, id): 19 """執行檢視資料詳情介面""" 20 21 ……………… 22 23 payload = self.view_payload 24 payload["bizId"] = id 25 26 ……………… 27 28 response = requests.post(self.url, json=payload, headers=headers) 29 data = response.json()
……………… 30 31 try: 32 self.assertEqual(response.status_code, 200) 33 self.assertEqual(data["msg"], "操作成功") 34 self.assertEqual(data["errcode"], 0) 35 36 except Exception as e: 37 logger.error("介面錯誤資訊為 %r", e) 38 print("headers資訊:", headers) 39 print("請求地址:", response.url) 40 print("引數資訊:", payload) 41 raise e 42 43 44 def test_case_01(self): 45 """檢視活動資料詳情case""" 46 47 try: 48 temp = CreateActivity() # 呼叫CreateActivity類,得到一個例項temp 49 temp.setUp() # 通過例項呼叫CreateActivity類下的setUp和tearDown方法,進行初始化 50 temp.tearDown() 51 data = temp.push_file_download(xxx) # 呼叫CreateActivity類下的push_file_download方法,得到其返回的資料 52 53 if data is not None: 54 id = data["Id"] # 提取生成資料的資料id 55 self.view_activity(id) # 呼叫當前檔案下的view_activity方法,檢視資料詳情 56 57 ……………… 58 59 except Exception as e: 60 logger.error("用例執行錯誤資訊:%r", e) 61 print("用例執行錯誤資訊:", e) 62 raise e
(1)首先匯入了CreateActivity類
(2)第18行,建立了一個名為view_activity 的方法,它作用是檢視資料詳情
(3)第44行,建立一條檢視活動資料詳情的測試用例 test_case_01
接下來是重點:在這條用例下呼叫view_activity 方法,而view_activity方法有一個必傳引數id,這個id就是由test_A.py檔案中CreateActivity 類下的push_file_download 方法生成的;
所以這裡要先呼叫下 push_file_download 方法,對應第48~51行程式碼
temp = CreateActivity() # 呼叫CreateActivity類,得到一個例項temp temp.setUp() # 通過例項呼叫CreateActivity類下的setUp和tearDown方法,進行初始化 data = temp.push_file_download(xxx) # 呼叫CreateActivity類下的push_file_download方法,得到其返回的資料
注意到上述程式碼在對CreateActivity類進行例項化得到temp後,先呼叫了setUp方法;
因為CreateActivity類下的push_file_download要想正常執行,也依賴於setUp方法先進性初始化工作(例如讀取配置檔案、呼叫其他方法等);
所以當跨檔案呼叫push_file_download方法,對CreateActivity類進行例項化後,也需要先呼叫其setUp方法進行初始化工作,不然直接呼叫push_file_download方法的化,會報錯(由於缺少執行push_file_download方法所需的一些條件);
總結:說了這麼多,其實只是想要說明一點,當跨用例檔案進行呼叫某個方法時,需要看下這個方法是否依賴於其他方法,如果有依賴的話,則需要先呼叫其將依賴的方法