本文將會(huì)通過java和python編碼的方式來幫助大家實(shí)現(xiàn)接口測(cè)試。另外讀者還可以通過這篇文章了解到什么是接口測(cè)試、工作中接口測(cè)試的主要分類、接口測(cè)試優(yōu)勢(shì)、接口測(cè)試的評(píng)估標(biāo)準(zhǔn)、開展接口測(cè)試的通用過程等入門接口測(cè)試必備知識(shí)點(diǎn)。如果你想上手接口測(cè)試,她一定會(huì)幫到你!無論你的接口項(xiàng)目編碼使用的是java還是python,看這篇文章就夠了!
接口測(cè)試必備知識(shí)點(diǎn)
接口測(cè)試概念
接口測(cè)試是測(cè)試系統(tǒng)組件間接口的一種測(cè)試。接口測(cè)試主要用于檢測(cè)外部系統(tǒng)與系統(tǒng)之間以及內(nèi)部各個(gè)子系統(tǒng)之間的交互點(diǎn)。測(cè)試的重點(diǎn)是要檢查數(shù)據(jù)的交換,傳遞和控制管理過程,以及系統(tǒng)間的相互邏輯依賴關(guān)系等。
工作中接口測(cè)試的主要分類
1.模塊接口測(cè)試(開發(fā)人員)
模塊接口測(cè)試是單元測(cè)試的基礎(chǔ)。它主要測(cè)試模塊的調(diào)用與返回。類似于JUnit或者unittest中的單元測(cè)試。
2.Web接口測(cè)試(測(cè)試工作重點(diǎn))
web接口測(cè)試又可分為兩類:服務(wù)器接口測(cè)試和外部接口測(cè)試。
服務(wù)器接口測(cè)試:
是測(cè)試前端與服務(wù)器的接口(最常用的接口測(cè)試場(chǎng)景)。
外部接口測(cè)試:
這個(gè)很典型的例子就是第三方登錄,比如你做的新系統(tǒng)免于新用戶重新注冊(cè)的麻煩會(huì)提供第三方登錄,那用戶在登錄的時(shí)候調(diào)用的就是第三方登錄的接口,由第三方驗(yàn)證用戶名和密碼并且返回給當(dāng)前系統(tǒng)。
接口測(cè)試優(yōu)勢(shì)
1.接口測(cè)試相對(duì)容易實(shí)現(xiàn)自動(dòng)化持續(xù)集成,且相對(duì)UI自動(dòng)化也比較穩(wěn)定
2.測(cè)試可以更早的介入
3.可以發(fā)現(xiàn)功能測(cè)試覆蓋不到的服務(wù)端問題
接口文檔
接口文檔是接口測(cè)試的依據(jù),在接口文檔不完善的情況下不主張開展接口測(cè)試
接口文檔不管以什么形式存在,需要包含的內(nèi)容有:
a.接口名稱以及業(yè)務(wù)描述
b.接口類型(http\webservices等等)
c.輸入?yún)?shù)
? ? ? ? ? ? ? ? ?每個(gè)參數(shù)名;
? ? ? ? ? ? ? ? ?每個(gè)參數(shù)類型;
? ? ? ? ? ? ? ? ?每個(gè)參數(shù)業(yè)務(wù)含義;
? ? ? ? ? ? ? ? ?每個(gè)是否可空;
? ? ? ? ? ? ? ? ?每個(gè)字段長(zhǎng)度(可選,一般需要提供,有嚴(yán)格要求的字段需特別注明);
? ? ? ? ? ? ? ? ?每個(gè)參數(shù)的單位(可選,金額類字段需注明);
d.輸出結(jié)果
? ? ? ? ? ? ? ? ? 每個(gè)參數(shù)名;
? ? ? ? ? ? ? ? ? ?每個(gè)參數(shù)類型;
? ? ? ? ? ? ? ? ? ?每個(gè)參數(shù)業(yè)務(wù)含義;
接口測(cè)試介入階段
接口測(cè)試應(yīng)該在程序的開發(fā)階段就開始,具體的時(shí)間點(diǎn)應(yīng)該是在后臺(tái)接口開發(fā)基本完畢之后,需要開始接口測(cè)試,在前端寫功能之前對(duì)接口進(jìn)行測(cè)試,能夠在早期就把接口層的問題暴露出來,后續(xù)前端在寫功能時(shí)能夠減少很多由于接口問題導(dǎo)致返工的工作量。
接口測(cè)試評(píng)估標(biāo)準(zhǔn)
業(yè)務(wù)功能覆蓋是否完整
業(yè)務(wù)規(guī)則覆蓋是否完整(與業(yè)務(wù)相關(guān)的操作規(guī)范、管理章程、規(guī)章制度、行業(yè)標(biāo)準(zhǔn)等)
參數(shù)驗(yàn)證是否達(dá)到要求(邊界、業(yè)務(wù)規(guī)則)
返回?cái)?shù)據(jù)正確性與格式
接口異常場(chǎng)景覆蓋是否完整
接口覆蓋率是否達(dá)到要求
性能指標(biāo)是否滿足要求(接口的響應(yīng)時(shí)間、處理能力)
安全指標(biāo)是否滿足要求(一般接口都不會(huì)暴露在網(wǎng)上任意被調(diào)用,需要做一些限制,比如鑒權(quán)或認(rèn)證。)
開展接口測(cè)試的過程
確認(rèn)接口文檔(接口測(cè)試依據(jù))
準(zhǔn)備數(shù)據(jù)(往往耗費(fèi)很多精力)
構(gòu)建接口(根據(jù)接口文檔,使用代碼或者工具),代碼選擇java或者python,工具選擇postman、jmeter等
校驗(yàn)接口請(qǐng)求(根據(jù)接口文檔,使用代碼或者工具)
http接口實(shí)戰(zhàn)
接口項(xiàng)目介紹
使用http協(xié)議是目前最常用的接口調(diào)用方式,她的本質(zhì)是通過http請(qǐng)求調(diào)用后端的api,具體過程如下圖所示:

關(guān)于http知識(shí)的詳細(xì)內(nèi)容在這里就不做詳細(xì)介紹了,作為一個(gè)tester,http請(qǐng)求是必會(huì)的知識(shí)點(diǎn)之一,請(qǐng)大家自己查閱學(xué)習(xí),重點(diǎn)關(guān)注如下內(nèi)容:
請(qǐng)求方法(重點(diǎn)關(guān)注get和post)
請(qǐng)求頭參數(shù)含義
響應(yīng)頭參數(shù)含義
響應(yīng)代碼含義
我們這里重點(diǎn)講解如何通過java和python代碼的方式進(jìn)行http接口測(cè)試,主要就兩步(比大象放冰箱里還簡(jiǎn)單)
1.http請(qǐng)求構(gòu)建
2.http請(qǐng)求的解析
舉一個(gè)get接口請(qǐng)求的例子
接口描述:判斷獲取用戶的姓名和年齡是否成功
http://rap2.taobao.org:38080/app/mock/85630/getinfo
類型:get
參數(shù):name(String)必選,age(Number)必選
返回值信息說明
參數(shù)傳入正確
{
? "code": 0-10之間的數(shù)字,
? "msg": "OK"
}
參數(shù)缺失
"errMsg":"必選參數(shù)name或者age未傳值
Python方式實(shí)現(xiàn)
Python使用requests模塊進(jìn)行接口測(cè)試
安裝pip install requests
核心代碼如下:
import requests
正確的調(diào)用
response=requests.get("http://rap2.taobao.org:38080/app/mock/85630/getinfo?name=kevin&age=40")
print(response.text)
輸出:
{
? "code": 10,
? "message": "ok"
}
異常調(diào)用
response=requests.get("http://rap2.taobao.org:38080/app/mock/85630/getinfo?age=25")
print(response.text)
輸出:
{"isOk":false,"errMsg":"必選參數(shù)name未傳值。Required parameter name has no value."}
Java方式實(shí)現(xiàn)
使用httpclient jar包
下載地址:http://hc.apache.org/downloads.cgi
我這里使用的是4.5.12版本,把下圖的所有jar包導(dǎo)入到eclipse中。

核心代碼如下:
正確的調(diào)用
importorg.apache.http.client.fluent.Request;
String rsp1=Request.Get("http://rap2.taobao.org:38080/app/mock/85630/getinfo?name=kevin&age=40")????
????????? .execute().returnContent().asString();
????????????? ? System.out.println(rsp1);
輸出:
{
?"code": 4,
?"msg": "OK"
}
異常調(diào)用
?Stringrsp2=Request.Get("http://rap2.taobao.org:38080/app/mock/85630/getinfo?age=40")????
????????????? ????????? .execute().returnContent().asString();
??????????????????????????? ? System.out.println(rsp2);
輸出:
{"isOk":false,"errMsg":"必選參數(shù)name未傳值。Required parameter name has no value."}
通過java和python對(duì)同一個(gè)接口調(diào)用的實(shí)現(xiàn),我們很容易發(fā)現(xiàn)二者的實(shí)現(xiàn)差別不大,只要掌握了一門語言,使用另一門語言做接口測(cè)試也只不過是換了一種調(diào)用形式而已!核心就是:
使用合適的包或者模塊
發(fā)送http請(qǐng)求
獲取http請(qǐng)求
接口測(cè)試在unittest中的應(yīng)用
在實(shí)際工作中,我們利用上面的核心代碼+單元測(cè)試框架就可以完全搞定接口測(cè)試
Python unittest單元測(cè)試源碼如下:

接口測(cè)試在junit4中的應(yīng)用
Java Junit4源碼如下:

總結(jié)
接口自動(dòng)化測(cè)試的本質(zhì)總結(jié)為以下兩點(diǎn):
通過使用requests或者h(yuǎn)ttpclient提供的api,發(fā)送接口請(qǐng)求
解析接口響應(yīng)判斷接口發(fā)送成功與否;
大家可以看到發(fā)送接口請(qǐng)求的api要比ui自動(dòng)化涉及的api少很多,也簡(jiǎn)單很多,因此更適合大家進(jìn)行代碼入門!關(guān)于ui自動(dòng)化測(cè)試大家可以關(guān)注我的另一篇文章:
一文搞定Java和Python在Selenium3中的應(yīng)用
隨著大家接口測(cè)試經(jīng)驗(yàn)的不斷積累,在工作中可能還會(huì)遇到webservice、或者dubbo類型的接口,其實(shí)無論對(duì)于哪種接口進(jìn)行測(cè)試,其本質(zhì)和方法與我們文章中介紹的都是一致的!不同的接口會(huì)涉及使用不同的第三方j(luò)ar包或者模塊中的api來構(gòu)建接口而已。個(gè)人經(jīng)驗(yàn),接口測(cè)試的難點(diǎn)不在于技術(shù)手段,而是前期的溝通工作!想要做好接口測(cè)試的重點(diǎn)是接口文檔的詳盡程度以及文檔變更后及時(shí)通知的管理策略。各位同學(xué)可以在實(shí)際工作中多總結(jié)、多體會(huì)、找出一條適合自己公司的接口測(cè)試開展方案。真的寫了很多也非常地辛苦,原創(chuàng)不易,如果文章幫到了你,歡迎轉(zhuǎn)發(fā),讓更多的朋友受益!