簡介
應(yīng)用程序編程接口(API Application Programming Interface)是在不同進(jìn)程,程序或系統(tǒng)之間的通信的代碼。 API通?;诳蛻魴C(jī)/服務(wù)器模型。有交互的地方都有接口。最常見的跨應(yīng)用交互協(xié)議是HTTP+JSON, 其次是web service(比較笨重)。最常見的后臺協(xié)議有thrift、dubbo及大量的私有協(xié)議。
- 接口測試是保證軟件產(chǎn)品質(zhì)量的最重要的軟件測試之一。
- 接口測試是進(jìn)行評估的系統(tǒng)或組件是否正確地傳遞數(shù)據(jù)及互相正確的控制。
- 接口測試通常在測試和開發(fā)團(tuán)隊(duì)都進(jìn)行。
- 接口測試通常在應(yīng)用或功能開發(fā)的初期檢驗(yàn)?zāi)K間調(diào)用的正確性和友好性。
分類
- 范圍:內(nèi)部、外部、第三方等
- 協(xié)議分類: HTTP、thrift、DUBBO、FTP、SSH、TELNET等。
- 注意數(shù)據(jù)庫、文件等也是接口
接口在近幾年快速增長。Gartner 2014年的接口使用調(diào)查
- 超過80%的聲稱他們已停止使用一個(gè)或多個(gè)API,因?yàn)樗鼈傿UG太多。
- API問題的不良影響: ?開發(fā)延期 ?增加客戶支持服務(wù)成本 ?上市時(shí)間推遲 ?測試延遲 ?業(yè)務(wù)損失
- 90%的受訪者表示一個(gè)或多個(gè)API未能滿足其期望。
- 68%遇到了可靠性或功能問題。
- 42%遇到過安全問題。
- 74%遇到的性能問題。
- 使用API遇到的最嚴(yán)重的完整性問題:


?61%的可靠性 ?22.2%的安全 ?16.7%的性能
某公司模塊之間通信有seq,以免通信亂序。seq約定64位整數(shù),會存入mysql數(shù)據(jù)。某工程師加班誤把unit64改成了unit32。系統(tǒng)上線運(yùn)行一定時(shí)間后,出現(xiàn)莫名其妙丟失一些老數(shù)據(jù)。
如果有做接口測試,針對0,2的64次方等值進(jìn)行,就不會出現(xiàn)這種問題。功能測試由于看不到該seq,自然無法驗(yàn)證,當(dāng)然長時(shí)間的大容量性能測試也會發(fā)現(xiàn)此問題。
某公司性能測試發(fā)現(xiàn)大量扣費(fèi)時(shí)有不正確。經(jīng)常是節(jié)假日優(yōu)惠時(shí)忘記扣費(fèi)。該問題在功能測試漏測。也沒有進(jìn)行接口測試。大量這樣類似的bug堆積,導(dǎo)致性能測試延期。
某公司和合作方對接話單始終無法成功,后面用tcpdump抓包及查看日志發(fā)現(xiàn)是對方少傳了一個(gè)計(jì)量單位字段。
常見問題
- 錯(cuò)誤條件處理不好
- 無用的flag
- 缺失或者重復(fù)的功能
- 可靠性問題,比如有時(shí)難以連接或獲取響應(yīng)。
- 安全問題
- 多線程問題
- 性能問題,比如用戶多時(shí)響應(yīng)時(shí)間很高。
- 不合適的錯(cuò)誤碼或告警。
- 參數(shù)處理錯(cuò)誤
- 響應(yīng)數(shù)據(jù)格式錯(cuò)誤
接口測試關(guān)注的內(nèi)容
準(zhǔn)備
- API的對象是誰?
- API的使用環(huán)境
- 要測試哪些方面
- 測試難點(diǎn)是什么
- 測試優(yōu)先級
- 正常及異常情況
- 通過和失敗的定義及預(yù)期輸出和事件流
- 交互的API有哪些
接口測試工具
- 商業(yè)工具: Loadrunner(本質(zhì)是性能測試工具,不推薦使用)、soapui等
- 開源或免費(fèi)工具: Jmeter(本質(zhì)是性能測試工具,不推薦使用)、curl、 soapui、 POSTMAN、 HTTPie等
-
自行開發(fā)工具:Python、ruby、perl等腳本語言因?yàn)檎{(diào)試方便,編寫相對簡單成為首選。比如Python的requests、urllib、urllib2等庫。
圖片.png
選擇原則:費(fèi)用、難度、協(xié)議類型、序列化、后臺執(zhí)行(很重要)、維護(hù)成本等。

cURL
cURL是一個(gè)利用URL語法在命令行下工作的文件傳輸工具,1997年首次發(fā)行。它支持文件上傳和下載,所以是綜合傳輸工具,但按傳統(tǒng),習(xí)慣稱cURL為下載工具。cURL還包含了用于程序開發(fā)的libcurl。
協(xié)議支持: cURL支持的通信協(xié)議有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。
環(huán)境準(zhǔn)備: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服務(wù)的交互盡可能人性化的命令行HTTP客戶端。它提供了簡單的http命令,使用簡單自然的語法發(fā)送任意HTTP請求,并顯示彩色輸出。 HTTPie可用于測試,調(diào)試和與HTTP服務(wù)器交互。
特點(diǎn):直觀的語法;格式化和色彩化的終端輸出;內(nèi)置 JSON 支持;支持上傳表單和文件 HTTPS、代理和認(rèn)證;任意請求數(shù)據(jù);自定義頭部;持久性會話;類 Wget 下載;支持 Python 2.6, 2.7 和 3.x 支持 Linux, Mac OS X 和 Windows;插件;文檔。
環(huán)境準(zhǔn)備: # 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
其他工具
RESTED為Firefox插件,可以通過瀏覽器發(fā)送HTTP請求,并展示結(jié)果。
安裝Firefox,進(jìn)入工具-附加組件-擴(kuò)展,安裝RESTED插件

Postman為Firefox插件,可以通過瀏覽器發(fā)送HTTP請求,并展示結(jié)果。
環(huán)境準(zhǔn)備:安裝Chrome,進(jìn)入工具-擴(kuò)展程序-獲取更多擴(kuò)展程序,安裝Postman插件

Requests做HTTP接口測試
環(huán)境準(zhǔn)備: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)
后記
這里僅僅是對接口測試做了個(gè)簡單介紹.
了解接口的開發(fā),更容易做接口模擬和接口測試.參考:使用python3和flask構(gòu)建RESTful API(接口測試服務(wù))
接口測試測試不僅僅只有HTTP, struct,socket等模塊在接口測試的應(yīng)用中也相當(dāng)重要.
用loadruner, jmeter做接口是通常屬于大炮打蚊子,簡單的問題復(fù)雜化的不當(dāng)行為.很多培訓(xùn)機(jī)構(gòu)的老師根本沒入門,喜歡這么干.
python很方便訪問其他語言,在當(dāng)今多語言開發(fā)的情況下具有得天獨(dú)厚的優(yōu)勢,ctypes,jython都比較重要.
