說明
在進行接口測試時,經常會遇到不同接口間傳遞參數的情況,即一個接口的某個參數需要取另一個接口的返回值;
在平常寫腳本過程中,我經常會在同一個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方法所需的一些條件);
總結:說了這么多,其實只是想要說明一點,當跨用例文件進行調用某個方法時,需要看下這個方法是否依賴於其他方法,如果有依賴的話,則需要先調用其將依賴的方法