接口測試的理論知識
1、接口的定義:
接口一般來說有兩種,一種是程序內部的接口,一種是系統對外的接口。
系統對外的接口:比如你要從別的網站或服務器上獲取資源或信息,別人肯定不會把數據庫共享給你,他只能給你提供一個他們寫好的方法來獲取數據,你引用他提供的接口就能使用他寫好的方法,從而達到數據共享的目的,比如說咱們用的app、網址這些它在進行數據處理的時候都是通過接口來進行調用的。
程序內部的接口:方法與方法之間,模塊與模塊之間的交互,程序內部拋出的接口,比如bbs系統,有登錄模塊、發帖模塊等等,那你要發帖就必須先登錄,要發帖就得登錄,那么這兩個模塊就得有交互,它就會拋出一個接口,供內部系統進行調用。
簡單來說,接口測試就是功能測試,測試的都是程序對外部的接口。
訪問接口、網站實質上都是對數據庫進行操作
2、接口分類:webservice接口和http api接口
webService接口是走soap協議通過http傳輸,請求報文和返回報文都是xml格式的,我們在測試的時候都用通過工具才能進行調用,測試。
http api接口是走http協議,通過路徑來區分調用的方法,請求報文都是key-value形式的,返回報文一般都是json串,有get和post等方法,這也是最常用的兩種請求方式。
3、前端與后端
前端是什么呢,對於web端來說,咱們使用的網頁,打開的網站,這都是前端,這些都是html、css寫的;對於app端來說呢,它就是咱們用的app,android或者object-C(開發ios上的app)開發的,它的作用就是顯示頁面,讓我們看到漂亮的頁面,以及做一些簡單的校驗,比如說非空校驗,咱們在頁面上操作的時候,這些業務邏輯、功能,比如說你購物,發微博這些功能是由后端來實現的,后端去控制你購物的時候扣你的余額,發微博發到哪個賬號下面,那前端和后端是怎么交互的呢,就是通過接口。
說的通俗點,前端負責貌美如花,后端負責養家糊口。
前端 對應 客戶端
后端 對應 服務端
手機上的app都是客戶端
前端與后端開發語言不一樣,前端與后端通過接口來交互
前端是 用html、css、js開發的,
后端是用java、php、python開發的
京東與支付寶交互,用通用的語言,通用的數據類型:json,對所有的語言都可以解析
接口返回的數據都是json格式的
server端測試是測試接口的
4、接口測試的定義
接口測試是測試系統組件間接口的一種測試。接口測試主要用於檢測外部系統與系統之間以及內部各個子系統之間的交互點。測試的重點是要檢查數據的交換,傳遞和控制管理過程,以及系統間的相互邏輯依賴關系等。 --百度百科
其實接口測試就和普通功能測試沒什么區別,區別就是功能測試是在頁面上點點點,在頁面上輸入值,提交數據看結果,而接口測試沒有頁面,通過接口規范文檔上的調用地址、請求參數,拼接報文,然后發送請求,檢查返回結果。
5、接口測試的目的
我們知道,其實接口也是app端或者說是web前端進行調用的,那我們直接在app或者web端直接測試不就好了,反正它都是調用的接口,app和web端功能測試通過了,那接口不就是好使的嘛。
真的是這樣嗎?說的好像很有道理,其實不然,要是真的是這樣的話,那我還講啥接口測試。
思考一個問題,假如現在在京東app上買東西,支付訂單,訂單金額是500元,支付的話,那肯定要調用支付接口,你在頁面上操作的話,訂單金額是修改不了的,那如果你想測試一下服務端有沒有校驗訂單的金額,我想把訂單金額改成5元,那在頁面上點是測試不了的,這個時候我們就可以直接用接口來調用,修改一下訂單金額的值,然后再發請求就可以了。
當然這只是我舉個例子,接口測試當然不只是這一點原因,總的來說還是為了更好的提高我們產品的質量。
6、接口測試的流程
一、需求評審,熟悉業務和需求
二、開發提供接口文檔
三、編寫接口測試用例
四、用例評審
五、提測后開始測試
六、提交測試報告
7、測試接口的話,必須得有接口文檔,接口規范文檔包括:
- 接口說明
- 調用url
- 請求方式,是post還是get
- 請求參數、參數類型、請求參數說明,入參(請求參數)
- 返回的參數說明(返回的數據)
8、http接口測試
前面我們已經有了接口文檔,那么我們就要根據接口文檔來拼接參數調用接口,那么怎么調用呢?
接口請求報文拼接
1、url?param=value¶m2=value
這種是最簡單的一種,問號前面是請求url,后面是請求的參數名和參數值,多個參數用&來連接
https://api.douban.com/v2/book/search?q=鄒偉偉
2、還有一種就是入參是json串的,那就不能拼接參數了,需要借助工具來完成比如postman
如果是get請求,直接用瀏覽器就能發請求,不用工具
如果是post的請求的話,就不行了,就得借助工具來發送。
GET請求和POST請求的區別:
1、GET使用URL或Cookie傳參。而POST將數據放在BODY中。
2、GET的URL會有長度上的限制,則POST的數據則可以非常大。
3、一般get請求用來獲取數據,post請求用來發送數據。
其實上面這幾點,只有最后一點說的是比較靠譜的,第一點post請求也可以把數據放到url里面,get請求其實也沒長度限制,post請求看起來參數是隱式的,稍微安全那么一些些,但是那只是對於小白用戶來說的,就算post請求,你通過抓包也是可以抓到參數的。所以上面這些面試的時候你說出來就行了。
如果是get請求:uRL加?號參數、參數值
json格式是"key":value,
1、http://api.nnzhp.cn/api/user/stu_info?stu_name=小黑&id=1
接口測試能發現一些頁面上操作發現不了的bug。‘
越早發現bug,解決bug的成本是越低的
http請求包含
請求頭
請求體
get請求沒有請求體,只有請求頭
get請求的參數只能寫在url里面或者是cookie里面
post請求
請求頭
請求體
請求參數放在請求體里面
post請求不一定比get請求安全
get請求參數長度有限制
post請求長度沒有限制
get請求是獲取數據
post請求是發送數據
9、http狀態碼
每發出一個http請求之后,都會有一個響應,http本身會有一個狀態碼,來標示這個請求是否成功,常見的狀態碼有以下幾種:
1、200 2開頭的都表示這個請求發送成功,最常見的就是200,就代表這個請求是ok的,服務器也返回了。
2、300 3開頭的代表重定向,最常見的是302,把這個請求重定向到別的地方了,302重定向,相當電話呼叫轉移
點擊一個頁面,跳轉到另外一個頁面
3、400 400代表客戶端發送的請求有語法錯誤,401代表訪問的頁面沒有授權,403表示沒有權限訪問這個頁面,404代表沒有這個頁面,404路徑不存在
4、500 5開頭的代表服務器有異常,500代表服務器內部異常,504代表服務器端超時,沒返回結果
10、webservice接口測試
webservice接口怎么測試呢,他不需要你在拼報文了,會給一個webservice的地址,或者wsdl文件,直接在soapui導入,就可以看到這個webservice里面的所有接口,也有報文,直接填入參數調用,看返回結果就可以了。
天氣預報wsdl地址:http://www.webservicex.net/globalweather.asmx?wsdl
11、通用接口用例設計
通過性驗證:首先肯定要保證這個接口功能是好使的,也就是正常的通過性測試,按照接口文檔上的參數,正常傳入,是否可以返回正確的結果。
參數組合:現在有一個操作商品的接口,有個字段type,傳1的時候代表修改商品,商品id、商品名稱、價格有一個是必傳的,type傳2的時候是刪除商品,商品id是必傳的,這樣的,就要測參數組合了,type傳1的時候,只傳商品名稱能不能修改成功,id、名稱、價格都傳的時候能不能修改成功。
接口安全:
1、繞過驗證,比如說購買了一個商品,它的價格是300元,那我在提交訂單時候,我把這個商品的價格改成3元,后端有沒有做驗證,更狠點,我把錢改成-3,是不是我的余額還要增加?
2、繞過身份授權,比如說修改商品信息接口,那必須得是賣家才能修改,那我傳一個普通用戶,能不能修改成功,我傳一個其他的賣家能不能修改成功
3、參數是否加密,比如說我登陸的接口,用戶名和密碼是不是加密,如果不加密的話,別人攔截到你的請求,就能獲取到你的信息了,加密規則是否容易破解。
4、密碼安全規則,密碼的復雜程度校驗
異常驗證:
異常的,也就是我不按照你接口文檔上的要求輸入參數,來驗證接口對異常情況的校驗。比如說必填的參數不填,輸入整數類型的,傳入字符串類型,長度是10的,傳11,總之就是你說怎么來,我就不怎么來,其實也就這三種,必傳非必傳、參數類型、入參長度。
根據業務邏輯來設計用例
根據業務邏輯來設計的話,就是根據自己系統的業務來設計用例,這個每個公司的業務不一樣,就得具體的看自己公司的業務了,其實這也和功能測試設計用例是一樣的。
舉個例子,拿bbs來說,bbs的需求是這樣的:
1、登錄失敗5次,就需要等待15分鍾之后再登錄
2、新注冊的用戶需要過了實習期才能發帖
3、刪除帖子扣除積分
4、......
像這樣的你就要把這些測試點列出來,然后再去造數據測試對應的測試點。
接口測試用例模板
咱們測試接口的話,肯定要寫測試用例,寫測試用例的話,就要有一個用例模板,那需要有哪些字段呢?
1、項目 是哪個項目的
2、模塊 這個接口是屬於哪個功能模塊的
3、用例id
4、接口名稱
5、用例標題 用例是干嘛的
6、請求方式 GET/POST
7、請求url url地址
8、請求參數
9、前置條件 有依賴的時候,比如說要測登錄失敗3次的
10、結果驗證 預期結果
11、請求報文
12、返回報文
13、測試結果 通過/失敗
14、測試人員
接口測試實踐
1、獲取學生信息的接口信息
獲取學生信息
簡要描述:
- 獲取學生信息接口
請求URL:
- http://api.nnzhp.cn/api/user/stu_info
請求方式:
- get
參數:
參數名 |
必選 |
類型 |
說明 |
stu_name |
是 |
string |
學生姓名 |
用jmeter做后去學生信息接口測試的截圖
服務器名稱或IP使用的是變量${host},目的是其他接口測試的服務器名稱或IP是一樣的,也可以調用該變量
2、登錄
登錄接口
簡要描述:
- 登錄接口
請求URL:
- http://api.nnzhp.cn/api/user/login
請求方式:
- post
參數:
參數名 |
必選 |
類型 |
說明 |
username |
是 |
string |
用戶名 |
passwd |
是 |
string |
密碼 |
post請求接口測試腳本截圖
3、添加學生信息
添加學生信息
簡要描述:
- 添加學生信息,這個接口是用來講入參是json類型的
請求URL:
- http://api.nnzhp.cn/api/user/add_stu
請求方式:
- post
- 入參是json類型
參數:
參數名 |
必選 |
類型 |
說明 |
name |
是 |
string |
學生姓名 |
grade |
是 |
string |
班級 |
phone |
是 |
int |
電話 |
sex |
否 |
string |
性別,如果不傳默認為男 |
age |
否 |
int |
年齡,如果不傳默認為18 |
addr |
否 |
string |
地址,如果不傳默認為北京市昌平區 |
請求示例
{
"name":"小黑",
"grade":"天蠍座",
"phone":18612532946,
"sex":"男",
"age":28,
"addr":"河南省濟源市北海大道32號"
}
入參是json的接口測試腳本截圖
4、文件上傳
上傳文件接口
簡要描述:
- 上傳文件接口
請求URL:
- http://api.nnzhp.cn/api/file/file_upload
請求方式:
- post
參數:
參數名 |
必選 |
類型 |
說明 |
file |
是 |
file |
文件 |
返回示例
{
"error_code": 0,
"msg":"上傳文件成功!"
}
返回參數說明
參數名 |
類型 |
說明 |
error_code |
int |
錯誤編碼,0為操作成功 |
msg |
string |
提示信息 |
文件上傳測試腳本截圖
5、學生金幣充值
學生金幣充值
簡要描述:
- 學生金幣充值接口,這個接口是為了講添加cookie以及身份驗證的
請求URL:
- http://api.nnzhp.cn/api/user/gold_add
請求方式:
- post
參數:
該接口有權限驗證,需要admin用戶才可以做操作,需要添加cookie
cookie中key為登錄的用戶名,value從登錄接口中獲取,登陸成功之后會返回sign
參數名 |
必選 |
類型 |
說明 |
stu_id |
是 |
int |
學生id |
gold |
是 |
int |
金幣數量 |
返回示例
{
"error_code": 0,
"msg":"充值成功!"
}
返回參數說明
參數名 |
類型 |
說明 |
error_code |
int |
錯誤編碼,0為操作成功 |
msg |
string |
提示信息 |
金幣充值測試腳本截圖
6、獲取所有學生信息
獲取所有學生信息
簡要描述:
- 這個接口是為了說明怎么添加header信息的
請求URL:
- http://api.nnzhp.cn/api/user/all_stu
請求方式:
- get
需要添加header信息,key為Referer value 為http://api.nnzhp.cn/
參數:
無
返回示例
{
"error_code": 0,
"all_stu": [
{
"id": 1,
"name": "小黑",
"sex": "男",
"age": 18 ,
"addr": "北京市昌平區回龍觀",
"phone": "18612532945",
"grade":"巨蟹座",
"gold":100
},
{
"id": 2,
"name": "小黑",
"sex": "男",
"age": 18 ,
"addr": "北京市昌平區回龍觀",
"phone": "18612532945",
"grade":"巨蟹座",
"gold":100
}
]
}
返回參數說明
參數名 |
類型 |
說明 |
error_code |
int |
錯誤編碼,0為操作成功 |
all_stu |
list |
學生信息 |
id |
int |
學生id |
name |
string |
學生姓名 |
sex |
string |
學生性別 |
age |
int |
年齡 |
addr |
string |
家庭住址 |
phone |
string |
手機號 |
grade |
string |
班級 |
gold |
string |
金幣 |
測試腳本截圖
Referer是指從哪里跳轉過來
7、注冊用戶接口
簡要描述:
- 用戶注冊接口
請求URL:
- http://api.nnzhp.cn/api/user/user_reg
請求方式:
- POST
參數:
參數名 |
必選 |
類型 |
說明 |
username |
是 |
string |
用戶名 (最少6位,最長10位) |
pwd |
是 |
string |
密碼 (最少6位,最長16位,必須包括大小寫字母數字) |
cpwd |
是 |
string |
密碼確認(最少6位,最長16位,必須包括大小寫字母數字) |
返回示例
{
"error_code": 0,
"msg":"注冊成功"
}
返回參數說明
參數名 |
類型 |
說明 |
error_code |
int |
錯誤編碼,0為成功 |
msg |
string |
提示信息 |
注冊用戶測試腳本截圖
注冊的用戶名username的值用了參數化,可以取txt文件中的內容,方法是用CSV Data Set Config元件
另外,用戶名username的值可以借助於函數助手做參數化,點擊jmeter工具欄菜單中的選項》函數助手對話框,選擇一個功能,在函數參數輸入值,點擊生成按鈕,將生成的字符串copy到username的值后面
8、用jmeter做數據庫操作
1、先在測試計划中添加"mysql-connector-java-5.1.7-bin.jar"包
2、在Database URL輸入:jdbc:mysql://211.149.218.16:3306/jxz?allowMultiQueries=true
在JDBC Driver class輸入:com.mysql.jdbc.Driver
輸入username、Password
3、JDBC Request中的Variable Name要與JDBC Connection Configuration的 Variable Name保持一致。
Query Type選擇callable Statement可以執行Query中所有類型的sql語句。