簡介
應用程序編程接口(API Application Programming Interface)是在不同進程,程序或系統之間的通信的代碼。 API通常基於客戶機/服務器模型。有交互的地方都有接口。最常見的跨應用交互協議是HTTP+JSON, 其次是web service(比較笨重)。最常見的後臺協議有thrift、dubbo及大量的私有協議。
- 接口測試是保證軟件產品質量的最重要的軟件測試之一。
- 接口測試是進行評估的系統或組件是否正確地傳遞數據及互相正確的控制。
- 接口測試通常在測試和開發團隊都進行。
- 接口測試通常在應用或功能開發的初期檢驗模塊間調用的正確性和友好性。
分類
- 範圍:內部、外部、第三方等
- 協議分類: HTTP、thrift、DUBBO、FTP、SSH、TELNET等。
- 注意數據庫、文件等也是接口
接口在近幾年快速增長。Gartner 2014年的接口使用調查
- 超過80%的聲稱他們已停止使用一個或多個API,因爲它們BUG太多。
- API問題的不良影響: •開發延期 •增加客戶支持服務成本 •上市時間推遲 •測試延遲 •業務損失
- 90%的受訪者表示一個或多個API未能滿足其期望。
- 68%遇到了可靠性或功能問題。
- 42%遇到過安全問題。
- 74%遇到的性能問題。
- 使用API遇到的最嚴重的完整性問題:
•61%的可靠性 •22.2%的安全 •16.7%的性能
某公司模塊之間通信有seq,以免通信亂序。seq約定64位整數,會存入mysql數據。某工程師加班誤把unit64改成了unit32。系統上線運行一定時間後,出現莫名其妙丟失一些老數據。
如果有做接口測試,針對0,2的64次方等值進行,就不會出現這種問題。功能測試由於看不到該seq,自然無法驗證,當然長時間的大容量性能測試也會發現此問題。
某公司性能測試發現大量扣費時有不正確。經常是節假日優惠時忘記扣費。該問題在功能測試漏測。也沒有進行接口測試。大量這樣類似的bug堆積,導致性能測試延期。
某公司和合作方對接話單始終無法成功,後面用tcpdump抓包及查看日誌發現是對方少傳了一個計量單位字段。
常見問題
- 錯誤條件處理不好
- 無用的flag
- 缺失或者重複的功能
- 可靠性問題,比如有時難以連接或獲取響應。
- 安全問題
- 多線程問題
- 性能問題,比如用戶多時響應時間很高。
- 不合適的錯誤碼或告警。
- 參數處理錯誤
- 響應數據格式錯誤
接口測試關注的內容
- 功能:發送和返回都符合接口文檔;正確地實現了功能,比如能創建或刪除用戶,數據庫和緩存數據處理正確等。參數的邊界值和等價類劃分。
- 重複:比如重複添加或刪除用戶,不會對數據庫和緩存等造成不良影響,提示的錯誤碼與文檔一致。
- 通信:雙向通信能否正常完成。尤其要考慮丟包,延遲、2G等差網絡場景。可以使用linux的防火牆及tc命令或facebook的ATC框架模擬。
- 業務組合:比如扣費需要綜合考慮閒時、忙時、節假日、集團用戶優惠等各種因素。
- 文檔:包含數據順序,數據類型,格式,甚至大小寫。
- 易用性:是否容易調用、簡潔、語法一致等
- 測試環境:是否有專門的測試環境、沙箱。比如充值測試環境。
- 故障管理:出現故障或無調用是否知道?系統崩潰後是否可以重新啓動並可靠恢復?
- 異步:API間通常是鬆耦合,亂序、丟失、重複調用如何應對?
- 接口組合:接口的水平和垂直組合。
- 安全:傳遞和存儲的敏感數據加密,並且難以破解。蠕蟲注入等負載攻擊、無效認證、未經授權的訪問控制、雲上問題會更多。調用方非預期濫用等。
- 性能: 比如局域網內單次調用在50ms內完成、在1000併發的情況下最大相應時間不超過60ms、資源佔用正常等。是否有峯值,過量是否會產生不良效果。資源消耗與容量等。
- 黑白名單:非授權的主機不能訪問接口
- 異常測試: 錯誤碼及相關信息、亂序。
- 其他:更多需要關注的點請參考ISO/IEC 25010:2011
難點
- 參數組合、參數選擇和調用順序
- 沒有GUI,輸入有一定難度
- 驗證輸出難過功能測試
- 異常處理比功能測試更復雜
- 需要編碼。
準備
- API的對象是誰?
- API的使用環境
- 要測試哪些方面
- 測試難點是什麼
- 測試優先級
- 正常及異常情況
- 通過和失敗的定義及預期輸出和事件流
- 交互的API有哪些
接口測試工具
- 商業工具: Loadrunner(本質是性能測試工具,不推薦使用)、soapui等
- 開源或免費工具: Jmeter(本質是性能測試工具,不推薦使用)、curl、 soapui、 POSTMAN、 HTTPie等
-
自行開發工具:Python、ruby、perl等腳本語言因爲調試方便,編寫相對簡單成爲首選。比如Python的requests、urllib、urllib2等庫。
選擇原則:費用、難度、協議類型、序列化、後臺執行(很重要)、維護成本等。
cURL
cURL是一個利用URL語法在命令行下工作的文件傳輸工具,1997年首次發行。它支持文件上傳和下載,所以是綜合傳輸工具,但按傳統,習慣稱cURL爲下載工具。cURL還包含了用於程序開發的libcurl。
協議支持: cURL支持的通信協議有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。
環境準備:Linux和MAC一般自帶curl;Windows安裝git bash可以使用curl
GET、POST
$ curl https://curl.haxx.se
$ curl --data "key1=value1&key2=value2" http://httpbin.org/post
下載文件
$ curl https://curl.haxx.se/download/curl-7.52.1.tar.gz
- 參考資料
https://en.wikipedia.org/wiki/CURL
https://github.com/curl/curl
Using curl to automate HTTP jobs
HTTPie
HTTPie是使CLI與Web服務的交互儘可能人性化的命令行HTTP客戶端。它提供了簡單的http命令,使用簡單自然的語法發送任意HTTP請求,並顯示彩色輸出。 HTTPie可用於測試,調試和與HTTP服務器交互。
特點:直觀的語法;格式化和色彩化的終端輸出;內置 JSON 支持;支持上傳表單和文件 HTTPS、代理和認證;任意請求數據;自定義頭部;持久性會話;類 Wget 下載;支持 Python 2.6, 2.7 和 3.x 支持 Linux, Mac OS X 和 Windows;插件;文檔。
環境準備: # pip install --upgrade httpie
GET、POST
$ http https://httpie.org/
$ http -f POST http://httpbin.org/post key1=value1 key2=values
下載文件
$ http -d https://github.com/jakubroztocil/httpie/archive/master.tar.gz
參考資料
https://httpie.org
https://github.com/jakubroztocil/httpie
其他工具
HttpRequester爲Firefox插件,可以通過瀏覽器發送HTTP請求,並展示結果。
安裝Firefox,進入工具-附加組件-擴展,安裝HttpRequester插件
Postman爲Firefox插件,可以通過瀏覽器發送HTTP請求,並展示結果。
環境準備:安裝Chrome,進入工具-擴展程序-獲取更多擴展程序,安裝Postman插件
Requests做HTTP接口測試
環境準備:pip install requests
GET
import requests
r = requests.get('http://httpbin.org/get')
result = r.json()
print(result['origin'])
assert('.' in result['origin'])
POST
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
result = requests.post("http://httpbin.org/post", data=payload)
assert('headers' in result.json())
assert(result.json()["url"] == http://httpbin.org/post)
後記
這裏僅僅是對接口測試做了個簡單介紹.
瞭解接口的開發,更容易做接口模擬和接口測試.參考:使用python3和flask構建RESTful API(接口測試服務)
接口測試測試不僅僅只有HTTP, struct,socket等模塊在接口測試的應用中也相當重要.
用loadruner, jmeter做接口是通常屬於大炮打蚊子,簡單的問題複雜化的不當行爲.很多培訓機構的老師根本沒入門,喜歡這麼幹.
python很方便訪問其他語言,在當今多語言開發的情況下具有得天獨厚的優勢,ctypes,jython都比較重要.
- 討論qq羣144081101 591302926 567351477 釘釘免費羣21745728
- 本文最新版本地址
- 本文涉及的python測試開發庫 謝謝點贊!
- 本文相關海量書籍下載
-
本文源碼地址
10分鐘學會API測試
python庫介紹-dubbo:通過telnet接口訪問dubbo服務
python庫介紹-pyjnius:訪問java類
python庫介紹-jpype:python到java橋