金琦 浙江師范大學附屬中學
當今在軟件開發中,接口測試已經成為不可或缺的一部分,與其他測試類型相比,接口測試具有獨特的地位和作用。它主要關注系統各個模塊之間的交互,通過驗證這些接口是否按照規范進行數據傳遞和交互,來判斷系統是否能夠正常運行。與功能測試、性能測試等測試類型相比,接口測試更注重測試中間件、API等底層組件,其測試粒度更細,能夠發現其他測試類型無法發現的問題和風險。學校的信息系統也非常需要完善的接口測試,從而確保系統的穩定性和可靠性。
接口測試是指對系統中各組件之間的接口進行測試,以確保它們能夠正確地集成和協作,并滿足預期的功能和性能要求。接口測試是一種黑盒測試方法,獨立于系統的內部實現細節,主要關注輸入和輸出之間的交互行為。接口測試是軟件開發過程中非常重要的一環,它能夠幫助開發人員提高軟件系統的質量和穩定性,加快開發周期,降低成本。
在計算機編程中,接口(Interface)是指不同模塊、程序或系統之間互相通信的約定。它定義了各個模塊之間如何交互,包括輸入輸出的格式以及發送和接收消息的協議等。常見的接口類型包括應用程序接口、操作系統接口、網絡接口、數據庫接口等。可以說,接口是現代計算機編程不可或缺的一部分。
當下接口測試中的“接口”通常是指一個Web API(Application Programming Interface),即網絡應用程序編程接口,是一種定義了系統或組件之間交互方式的規范。在Web開發中,API通常指提供給客戶端(如瀏覽器、移動應用等)訪問和處理數據的接口。例如,在前后端分離的Web應用中,客戶端通過調用API來獲取數據或執行某些操作。接口定義了請求的格式、參數和返回數據的格式等信息。具體來說,接口可以看作是一個標準規范,它描述了一個函數、類、模塊或系統對外提供的輸入和輸出,以及如何使用這些輸入和輸出與之交互。我們可以通過調用接口中的方法或發送請求來向實現接口的程序或系統發起請求,并獲取返回的結果。接口的一大優勢是降低了模塊之間的耦合度,使得各個模塊可以獨立開發、測試和維護,同時也方便了擴展和更新。此外,接口還有助于促進代碼復用,提高了整個系統的可重用性和可維護性。
接口測試初學者會混淆接口和路由,它們的區別是:路由是指將HTTP請求映射到相應的處理函數上的分配和請求過程。在Web應用程序中,通常有很多請求需要被處理,如GET請求、POST請求等,每個請求可能需要調用不同的處理函數來完成相應的操作,這時就需要使用路由將不同的請求映射到對應的處理函數上。簡而言之,接口定義了客戶端與服務端交互的規范,路由則定義了服務器如何處理不同的HTTP請求并將其分派到相應的處理函數上。
要對接口進行測試,首先要了解接口的協議和接口的定義。目前的軟件系統之間的消息接口大部分是基于HTTP協議收發的。HTTP協議的特點是,客戶端發出一個HTTP請求給服務端,服務端就返回一個HTTP響應,這就與API程序調用的機制是一致的。所以我們可以通過最常規的HTTP接口的報文結構和構成來了解接口的構造。
①請求報文:HTTP請求報文由請求行、請求頭、空行和請求包體(body)組成,如圖1所示。

圖1

圖2
根據HTTP標準,HTTP請求可以使用多種請求方法,以表明要對給定資源執行的操作。典型的POST方法的請求報文示例如2圖所示。
該報文使用POST方法對/test接口提交了使用multipart/form-data作為content-type的表單。
②響應報文:HTTP響應報文由狀態行、響應頭部、空行和響應包體(body)組成,如圖3所示。其中狀態行包含了協議版本、狀態碼以及狀態描述。一個具體的HTTP響應報文如下頁圖4所示。協議版本指明了報文使用的HTTP協議版本。狀態碼是一個三位數字,用來表示處理的結果,狀態碼的類別如表1所示。其中的通用首部字段是指請求報文和響應報文都會使用到的首部字段,具體如下頁表2所示。

表1

表2

圖3

圖4
在這個響應報文中,狀態碼為200 OK,表示服務器成功地處理了客戶端請求并返回了響應。狀態行中的“HTTP/1.1”表示使用的HTTP協議版本,后面的“Date”表示響應報文的發送日期和時間。接下來是頭部,由四個鍵值對組成:
“Content-Type: text/html”表示響應體中包含的數據類型為HTML文本。
“Content-Length: 1234”表示響應體的長度為1234個字節。
“Connection: keep-alive”表示該連接可重用,服務器可以在短時間內保持連接以便于后續請求和響應之間的數據傳輸。
最后一行是空行,用于分隔頭部和響應主體。
響應主體是一個HTML頁面,其中包含一個標題和一個段落。該響應報文向客戶端返回了一個示例HTML文檔。
為了讓讀者更好地理解接口測試過程,筆者使用中學教師較熟悉的Python搭建了一個簡易的學生信息系統(下載地址:http://wx.ourschool.cn/down/code.zip)來進行接口測試,由于提供API的示例的Server.py是基于Flask框架編寫,所以需要先用pip命令(pip install flask)安裝Flask依賴包,Python環境下運行應用程序Server.py,服務器將綁定到本地的0.0.0.0:80端口,并在開啟調試模式的情況下(debug=True)監聽來自客戶端的請求,如圖5所示。

圖5
這是一個基于Flask框架實現的HTTP服務端程序,實現了基礎的“查、增、刪”功能,該程序提供了以下一個路由和三個API接口,整體結構如圖6所示。

圖6
當客戶端發送GET請求到服務器根路徑時,執行home()函數并返回包含學生信息的HTML頁面。該頁面會顯示出所有已定義的學生信息。GET請求home路由報文如下頁圖7所示。

圖7
當客戶端發送GET請求到/students路徑時,服務器會從請求參數中獲取到ID值并進行處理。如果ID存在,則只返回對應ID的學生信息;否則,返回所有已定義的學生信息。返回的數據格式為JSON。GET_students接口報文如圖8所示。

圖8
當客戶端發送POST請求到/students路徑時,服務器會從請求正文中獲取JSON格式的數據,并將其添加到內存中的學生信息列表中。在添加學生信息前,服務器會先判斷提交的數據是否合法。如果數據格式不正確,缺少必要字段或ID已存在,服務器會返回錯誤信息并拒絕該次請求。否則,服務器將成功添加新的學生信息,并返回確認的響應數據。ADD_students接口報文如圖9所示。

圖9
當客戶端向/students路徑發送DELETE請求時,服務器將從請求參數中獲取ID值并進行處理。如果指定的ID存在,則服務器將刪除對應的學生信息并返回刪除成功的響應。否則,服務器將返回錯誤提示信息,拒絕該次請求。DELTE_students接口報文如圖10所示。

圖10
接下來為了體驗接口的報文結構數據,還需要安裝burp suite community(社區版)抓包工具。以下根據給定的服務器代碼和接口測試代碼,對一些常規的手動接口測試用例進行分析(前述下載鏈接包含的“測試代碼”文件夾下有Python代碼對應完成10個手動接口測試用例)。
3.6推行加速康復外科。加強圍手術期的管理,積極推行加速康復外科,尤其是管道的管理,對于術前盡量少留置管道,術后根據患者情況盡早拔出引流管,尤其是胃管和尿管,對于帶T管出院的患者,做好出院病人的健康宣教。
①測試首頁信息:使用GET請求方法向http://127.0.0.1發起請求。
實驗結果:返回狀態碼200和包含‘’和‘’的響應內容。
打開Burp Suite,然后打開該軟件自帶瀏覽器輸入“127.0.0.1”,查看“HTTP歷史記錄”,可看到抓到一組請求響應數據報文,如下頁圖11所示。

圖11
②測試獲取學生信息:使用已存在數據向http://127.0.0.1/students發起GET請求,查詢ID為1的學生信息,參數為:id=1。
實驗結果:返回狀態碼200和包含id為1、名字為‘張三’、年齡為18的學生信息的響應,如下頁圖12所示。

圖12
③測試獲取學生信息:使用不存在數據向http://127.0.0.1/students發起GET請求,參數為:id=4。
由于演示程序目前只有3條學生信息記錄,所以實驗結果為:返回狀態碼200和為空數組的響應內容。

圖13
實驗結果:返回狀態碼20 0和包含“S t ude nt adde d successfully”的響應內容,如圖14所示。

圖14
⑤測試添加學生信息:使用不正確數據格式向http://127.0.0.1/students發起POST請求(運行測試代碼5.py),參數如下頁圖15所示。

圖15
實驗結果:返回狀態碼400和包含“Missing required fields”的響應內容,如下頁圖16所示。

圖16
最后我們體驗一下接口自動化測試,在之前下載的文件中,找到Python自動化測試示例程序AutoTest.py,并運行pip命令安裝requests(HTTP 請求庫)和tqdm(進度條)依賴包:pip install requests tqdm。程序會自動對提供的接口進行測試并輸出測試結果,如下頁圖17所示。

圖17
測試首頁函數:test_home。
對首頁發起了GET請求并判斷返回狀態碼和返回數據是否正確。
測試獲取學生信息函數:test_get_students。
正確的ID、錯誤的ID、不指定ID,這三種數據構建GET請求并判斷返回狀態碼和返回數據是否正確。
測試添加學生信息函數:test_add_students。
合法數據、數據格式不正確、缺少必要字段、ID已存在,這四種數據構建POST請求并判斷返回狀態碼和返回數據是否正確。
測試刪除學生信息函數:test_delete_students。
正確的ID、不存在的ID、不傳遞ID、非數字,這四種數據構建DEL請求并判斷返回狀態碼和返回數據是否正確,再判斷是否正確刪除了數據。
運行上述示例可以體驗到將軟件測試由手工變成了自動,進而可以低成本、快速地反復運行,并可以做手工做不了、不好做的測試(如針對一些輸入不可見的特殊字符、二進制數據等)。雖然自動化測試并不能徹底代替手工測試,但作為一種高效、快速和對測試人員要求更高的軟件測試方法,它已經被越來越多行業的軟件開發組織所采納。
