1. 程式人生 > 實用技巧 >python介面測試:在一個用例檔案中呼叫另一個用例檔案中定義的方法

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方法所需的一些條件);

總結:說了這麼多其實只是想要說明一點,當跨用例檔案進行呼叫某個方法時,需要看下這個方法是否依賴於其他方法,如果有依賴的話,則需要先呼叫其將依賴的方法