以下接口來源:http://doc.nnzhp.cn/ 賬號:xiaohei 密碼:123456
切玩且珍惜
目錄
接口基礎
接口是什么?
說白了就是從數據庫內取數據/插入數據。前端展示出的瀏覽網頁,所看到的數據都是在數據庫內,那么正要展示給用戶,前后端交互就要借助接口。
接口分類
接口一般來說有兩種,一種是程序內部的接口,一種是系統對外的接口。
系統對外的接口:比如你要從別的網站或服務器上獲取資源或信息,別人肯定不會把數據庫共享給你,他只能給你提供一個他們寫好的方法來獲取數據,你引用他提供的接口就能使用他寫好的方法,從而達到數據共享的目的,比如說咱們用的app、網址這些它在進行數據處理的時候都是通過接口來進行調用的。
程序內部的接口:方法與方法之間,模塊與模塊之間的交互,程序內部拋出的接口,比如bbs系統,有登錄模塊、發帖模塊等等,那你要發帖就必須先登錄,要發帖就得登錄,那么這兩個模塊就得有交互,它就會拋出一個接口,供內部系統進行調用。
現在我們最常用的兩種接口就是 webservice 接口和 http api 接口,概念這里就不贅述了,知道有這兩種接口和怎么測試就可以了。
webService 接口是走 soap 協議通過 http 傳輸,請求報文和返回報文都是 xml 格式的,我們在測試的時候都用通過工具才能進行調用,測試。
http api 接口是走 http 協議,通過路徑來區分調用的方法,請求報文都是 key-value 形式的,返回報文一般都是 json 串,有 get 和 post 等方法,這也是最常用的兩種請求方式。
前端和后端
前端是什么呢,對於web端來說,咱們使用的網頁,打開的網站,這都是前端,這些都是html、css寫的;對於app端來說呢,它就是咱們用的app,android或者object-C(開發ios上的app)開發的,它的作用就是顯示頁面,讓我們看到漂亮的頁面,以及做一些簡單的校驗,比如說非空校驗,咱們在頁面上操作的時候,這些業務邏輯、功能,比如說你購物,發微博這些功能是由后端來實現的,后端去控制你購物的時候扣你的余額,發微博發到哪個賬號下面,那前端和后端是怎么交互的呢,就是通過接口。
說的通俗點,前端負責貌美如花,后端負責養家糊口
接口測試
仨問題:什么是接口測試,為什么做,怎么做?
什么是接口測試
剛剛我們講過,接口就是連接前后端的,那么接口測試可以簡單理解為脫離了前端的功能測試。那么一個一個的接口就對應功能測試內一個一個的功能(但是要注意,一個功能有可能不是一個接口就能實現),那么接口測試和功能測試的區別在哪呢?其實功能測試就是在頁面上輸入我們的參數值,點點點;而接口測試沒有前端,而是通過接口文檔上的調用地址、請求參數等,校驗返回的結果值。
那么,從某種意義程度上講,接口測試的難度是小於功能測試的,因為功能測試還得考慮前端顯示問題,比如字體顯示,顏色,兼容性等……
為什么要做接口測試
剛剛咱們提到過,接口測試就是沒有前端的功能測試,那么既然我們要進行功能測試,為什么還要做接口測試???這樣做是不是進行了重復測試呢?
思考一個問題,假如現在在京東app上買東西,支付訂單,訂單金額是500元,支付的話,那肯定要調用支付接口,你在頁面上操作的話,訂單金額是修改不了的,那如果你想測試一下服務端有沒有校驗訂單的金額,我想把訂單金額改成5元,那在頁面上點是測試不了的,這個時候我們就可以直接用接口來調用,修改一下訂單金額的值,然后再發請求就可以了。
或者另一種情況,前端咱們限制了輸入的內容,或者說是下拉框選擇的情況,那么這樣是前端測試不了的。我們只能借助接口測試傳不同的參數來進行測試
當然這只是我舉幾個例子,接口測試當然不只是這一點原因,總的來說還是為了更好的提高我們產品的質量。
接口測試必要性,總結:
- 可以發現很多在頁面上操作發現不了的bug
- 檢查系統的異常處理能力
- 檢查系統的安全性、穩定性
- 前端隨便變,接口測好了,后端不用變
怎么做接口測試
接口測試流程
- 需求評審,熟悉業務和需求
- 開發提供接口文檔
- 編寫接口測試用例
- 用例評審
- 提測后開始測試
- 提交測試報告
接口測試規范文檔
既然我們要測試接口,那我們根據什么來測試呢?
那就是接口規范文檔,也是我們測試最重要的一個依據
接口文檔是干嘛的呢,接口文檔說簡單點,就是這個接口的使用文檔。
接口文檔至少包括:
- 接口說明
- 調用url
- 請求方法(get\post)
- 請求參數、參數類型、請求參數說明
- 返回參數說明
怎么來測試接口—— http 接口
前面我們已經有了接口文檔,那么我們就要根據接口文檔來拼接參數調用接口,那么怎么調用呢?
接口請求報文拼接
1、url?param=value¶m2=value
這種是最簡單的一種,問號前面是請求url,后面是請求的參數名和參數值,多個參數用&來連接
https://api.douban.com/v2/book/search?q=鄒偉偉
2、還有一種就是入參是json串的,那就不能拼接參數了,需要借助工具來完成比如postman
GET和POST請求:
如果是get請求的話,直接在瀏覽器里輸入就行了,只要在瀏覽器里面直接能請求到的,都是get請求,如果是post的請求的話,就不行了,就得借助工具來發送。
GET請求和POST請求的區別:
1、GET使用URL或Cookie傳參。而POST將數據放在BODY中。
2、GET的URL會有長度上的限制,則POST的數據則可以非常大。
3、POST比GET安全,因為數據在地址欄上不可見。
4、一般get請求用來獲取數據,post請求用來發送數據。
其實上面這幾點,只有最后一點說的是比較靠譜的,第一點post請求也可以把數據放到url里面,get請求其實也沒長度限制,post請求看起來參數是隱式的,稍微安全那么一些些,但是那只是對於小白用戶來說的,就算post請求,你通過抓包也是可以抓到參數的。
HTTP狀態碼
每發出一個http請求之后,都會有一個響應,http本身會有一個狀態碼,來標示這個請求是否成功,常見的狀態碼有以下幾種:
- 200 2開頭的都表示這個請求發送成功,最常見的就是200,就代表這個請求是ok的,服務器也返回了。
- 300 3開頭的代表重定向,最常見的是302,把這個請求重定向到別的地方了,
- 400 400代表客戶端發送的請求有語法錯誤,401代表訪問的頁面沒有授權,403表示沒有權限訪問這個頁面,404代表沒有這個頁面
- 500 5開頭的代表服務器有異常,500代表服務器內部異常,504代表服務器端超時,沒返回結果
怎么來測接口—— webservice接口
webservice接口怎么測試呢,他不需要你在拼報文了,會給一個webservice的地址,或者wsdl文件,直接在soapui導入,就可以看到這個webservice里面的所有接口,也有報文,直接填入參數調用,看返回結果就可以了。
天氣預報wsdl地址:http://www.webservicex.net/globalweather.asmx?wsdl
接口測試用例設計
用例設計思路:等價類分析+邊界值分析+錯誤推斷+安全+性能
(一)通過性驗證:首先肯定要保證這個接口功能是好使的,也就是正常的通過性測試,按照接口文檔上的參數,正常傳入,是否可以返回正確的結果。
(二)接口安全:
- 繞過驗證,比如說購買了一個商品,它的價格是300元,那我在提交訂單時候,我把這個商品的價格改成3元,后端有沒有做驗證,更狠點,我把錢改成-3,是不是我的余額還要增加?
- 繞過身份授權,比如說修改商品信息接口,那必須得是賣家才能修改,那我傳一個普通用戶,能不能修改成功,我傳一個其他的賣家能不能修改成功
- 參數是否加密,比如說我登陸的接口,用戶名和密碼是不是加密,如果不加密的話,別人攔截到你的請求,就能獲取到你的信息了,加密規則是否容易破解。
- 密碼安全規則,密碼的復雜程度校驗
(三)異常驗證:
異常的,也就是我不按照你接口文檔上的要求輸入參數,來驗證接口對異常情況的校驗。比如說必填的參數不填,輸入整數類型的,傳入字符串類型,長度是10的,傳11,總之就是你說怎么來,我就不怎么來,其實也就這三種,必傳非必傳、參數類型、入參長度。
(四)根據業務邏輯來設計用例
根據業務邏輯來設計的話,就是根據自己系統的業務來設計用例,這個每個公司的業務不一樣,就得具體的看自己公司的業務了,其實這也和功能測試設計用例是一樣的。
舉個例子,拿bbs來說,bbs的需求是這樣的:
- 登錄失敗5次,就需要等待15分鍾之后再登錄
- 新注冊的用戶需要過了實習期才能發帖
- 刪除帖子扣除積分
- ......
像這樣的你就要把這些測試點列出來,然后再去造數據測試對應的測試點。
接口測試用例模板
下面,做一個測試用例設計模板:
項目 | 模塊 | 用例 ID | 用例描述 | 請求 URL | 請求方式 | 請求數據 | 預期結果 | 請求報文 | 返回報文 | 測試結果 | 測試人員 | 備注 |
上表內,是我們的測試用例設計,並且可以根據該表格生成測試結果:返回報文,測試結果,測試人員都可將結果寫入,這個在以后再進行研究,前面的那些列就是設計用例的模板
接口測試工具
一般來講,小白要做接口自動化,工具就是三種:Postman、Jmeter、SoapUI。這里我們只介紹前兩種,個人更喜歡 Jmeter ,畢竟可以用 Beanshell ,也可以導入開發寫的 jar 包,方法可直接調用,減少不必要的人工浪費。那么我們先介紹這兩種工具,只介紹其中簡單的用法,能夠做接口測試即可。
Postman
(一)安裝
安裝 Postman 不要太簡單,一種是進入 Chrome 瀏覽器的應用內,下載 Postman ,打開即可使用:
另一種方式就是去下載了:https://www.getpostman.com/downloads/,下載完成安裝即可,這里不贅述。
打開后界面如下:
那么,這兩種安裝方式有何不同呢?
這么說,我個人更傾向第一種方式,經過實踐,第一種方式安裝的 Postman ,可以安裝一個 Interceptor ,同時在 Chrome 瀏覽器也安裝一個該插件。
那么這個小插件有啥用呢?其實就是把 Chrome 的 cookie 傳遞到 Postman 內,這樣的話,Postman 內就沒必要去 Header 內手動添加 cookie ,在 Chrome 進行登錄就 OK,那么下載安裝的 Postman ,是不能安裝 Interceptor 的,所以說會稍顯繁瑣。
(二)使用
剛剛說完安裝,接下來講述一下如何使用 Postman 進行簡單的接口測試呢?那么我們知道,接口測試就是去訪問后端的接口,得到相應的返回結果,進行校驗,驗證接口是否 OK。那么就涉及到幾個問題:
- 怎么發請求
- 怎么驗證結果
1)Postman 腳本編寫
一般來講,有兩種請求是我們經常要用的:GET/POST。那么POST 請求內又分為 Form-Data 、Json、上傳文件 三類,具體用什么方式去請求,看接口文檔的要求。
GET 請求:
比如我們就按照 "獲取學生信息" 接口,用 Postman 實現
- 選擇請求方式
- 依據接口文檔描述,輸入 URL
- 如果需要 Header ,在Headers 內進行添加
- 點擊 Send
- 查看結果
POST請求:
1、Key - Value 形式
2、Json 形式
Body 內選擇 raw,選擇 Json 形式,將請求內容粘貼。
要注意的是,請求選擇為 JSON 形式,Headers 內會自動新增一條 Content-Type 為 application/json ,這代表是要發送 JSON 的數據類型,不要手賤刪掉
3、上傳文件
類型要選擇成 File ,Value 內可選擇本地文件
2)校驗數據
關於 Postman 返回數據校驗,預想是根據我們的測試用例文檔, 去取相對應的預期結果比對。那么這個以后再補充,我們這里就簡單介紹一個類似於 Jmeter 斷言的內容:
比如說,我們的登錄接口,會返回一個 "userId" ,那么我們校驗它是否為 16040
在 Testers 內,我們可以點擊 "Response body:contains string",就會出現如下內容
tests["Body matches string"] = responseBody.has("string_you_want_to_search");
我們進行替換就好,結果如下:
結果:userId 為 PASS ,代表校驗通過 userId 通過
JMeter
Jmeter是apache公司基於java開發的一款開源壓力測試工具,體積小,功能全,使用方便,不像loadrunner那樣體積大,是一個比較輕量級的測試工具,使用起來非常的簡單,深受測試人員的喜愛,但是它的測試報告沒有loadrunner的那么詳細,看起來沒有那么的直觀。因為它是java開發的,所以運行的時候必須要安裝jdk才可以,jmeter是免安裝的,拿到安裝包之后直接解壓就可以使用了,它也是跨平台的在linux、windows、macos上都可以使用。
那么,我們怎么用 jmeter 做接口測試呢?
- 添加線程組
- 添加http請求
- 在http請求中寫入接口url、路徑、請求方式、參數
- 添加查看結果樹
- 調用接口、查看返回值
- 對接口的返回值利用響應斷言校驗返回數據
這里具體的 jmeter 各組件使用以及詳細說明不進行贅述,在另一片博文內,我會進行介紹,等待完成貼鏈接
(一)安裝
安裝分兩步:
- 安裝好 jdk:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ,配置好環境變量
- 下載好 Jmeter 安裝包:https://jmeter.apache.org/download_jmeter.cgi,解壓(環境變量可自行配置,在接口自動化內不大影響,但是性能測試內不配置可能會影響某些插件運行)
Microsoft Windows [版本 6.1.7601] 版權所有 (c) 2009 Microsoft Corporation。保留所有權利。 C:\Users\Admin>java -version java version "1.8.0_181" Java(TM) SE Runtime Environment (build 1.8.0_181-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
出現以上界面,代表 Jmeter 安裝完成,可進行接口測試
這里題提兩個小坑,關於 Jmeter 亂碼的,修改配置文件 jmeter.properties :
A、解決jmeter返回有亂碼
- 在jmeter.properties文件中最下面加入 sampleresult.default.encoding=UTF-8
- 重啟jmeter
B、bodydata里面中文顯示不出來
- 在jmeter.properties文件中最下面加入 jsyntaxtextarea.font.family=Hack
- 重啟jmeter
(二)使用
這里測試計划,線程組等概念就不再贅述,直接講如何進行腳本制作
先添加一個 http 請求默認值,http 請求內就不用再重復寫協議以及服務器的 ip,端口我們是默認的(http 為 80,https 為 443),不用寫也成
1、GET 請求
在察看結果樹內,可以查看到結果:
2、POST 請求的form-data 形式:
3、POST 請求的 JSON 形式
4、文件上傳
文件名稱填寫文件的絕對路徑;參數名稱需要改為接口文檔內規定的參數,我們參數名是 file ;如果接口請求不成功就把 MIME 類型寫成文件的格式類型
(三)參數化
為什么要參數化呢?
假如傳的參數有唯一性校驗,比如手機號等,那么就需要傳不同的參數
參數化有很多種方式,這里我們介紹其中幾種,工作中比較實用的
1、函數助手
${__Random(00,99,tel)} ## 函數助手定義一個隨機值,范圍在 00~99 之間,把這個函數直接當一個參數,在本線程組內粘貼直接使用即可(這樣還是有可能取到重復值)
${__time(,)} ## 取當前時間戳,默認 13 位 。${__time(yyyyMMddhhmmss,)} 這個就形成了時間戳的年月日時分秒格式化
2、CSV 文件
將數據造在 excel/csv/txt 等文件內,把數據造在 excel 取值比較特殊,之前整理過解決方案:https://www.cnblogs.com/xiaowenshu/p/9935362.html
3、其他方案
1、其實可以在 setup 線程組內建立一個 jdbc 請求,取出數據庫內當前數值的最大值存為一個全局變量,然后用一個計數器組件,在這個變量基礎上一直往后 +1 ,這樣就避免了數值取重復的而且不會有數據區間的浪費
2、如果數據不需要我們造,來源於數據庫,我們就連接數據庫存參數,逐一取值即可,這里我們之前有整理過:https://www.cnblogs.com/xiaowenshu/p/9949836.html
(四)關聯
關聯就是將上一個或者幾個接口的響應結果分別存為變量,傳遞給下一個接口使用。
那么我們的 Jmeter 關聯如果是接口測試,一般是用 JSON 提取器;在需要提取的 http 請求上右擊==>JSON 提取器 ,就可以建立。如果返回值不為 json 串,那么就用正則提取器等。
問題:怎么測試 json 提取結果?
解決:在我們的察看結果樹內,有一個結果的顯示規則,我們選擇為:JSON Path Tester,可以在 Json Path Expression 內寫 json 提取的表達式進行測試,那么具體的 json 提取我們之前也有過整理:
https://www.cnblogs.com/xiaowenshu/p/10024689.html
(五)檢查點
用於校驗接口的響應結果。也就是斷言
我們請求的是接口,返回的數據是 json 數據,所以個人建議用 json 斷言
如果不能用 json 斷言,再考慮用響應斷言,響應斷言可以對線程組內的參數進行判定,這個相對來講也是比較准確的
(六)Jmeter 操作數據庫——以 Mysql 為例
我們在做性能測試過程中,有時經常要對數據庫的性能進行測試,比如說查詢語句,插入以及更新語句,那么jmeter能不能做連接數據庫的腳本對數據庫進行這些操作呢?答案當然是 ok,這里我們就來介紹下,jmeter 怎么連接數據庫並對其操作。
分為兩部分:JDBC Connection Configuration+JDBC Request,前者是配置數據庫連接池,后者是對數據庫進行操作腳本編寫的 jdbc 請求。另外,要有連接數據庫的 jar 包,放入 jmeter 的 \lib 目錄下即可,或者在請求所在的線程組內,添加 jar 包的絕對路徑(這里推薦放在 lib 目錄下,如果腳本在 linux 虛擬機上運行,該目錄下肯定沒有該 jar 包)
這里列舉幾種 jar 包的獲取方式:
Mysql:進入官網https://www.mysql.com/,點擊"Downloads",拉到最下,選擇社區版"Community (GPL) Downloads",找到"MySQL Connectors",點擊"DOWNLOAD",點擊"Connector/J",點擊"MySQL Connector/J Installation Instructions"再點擊"Maven repository",然后 Download下來就ok。如果發現在jmeter內運行腳本提示 version 不匹配的,那么就是你的 jar 包版本不對了,自己下其他的吧,jmeter 3 版本用 jdbc 5 左右就ok咯
- JDBC Connection Configuration
需要配置的玩意:
Variable Name for created pool:自己擬定一個數據庫連接池名稱(別手賤寫中文)
Database URL:jdbc:mysql://ip:port/DatabaseName?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true ## 標紅的區域是需要修改的,修改為你要連接的 mysql ip,端口,以及數據庫名稱,注意,該語句前后不能加空格!!!
JDBC Driver class:下拉框選擇:com.mysql.jdbc.Driver
Username:連接數據庫的用戶名
Password:連接數據庫的密碼
- JDBC Request
這里,如果想 insert 或者 update 語句跟 select 語句一起運行的話,則需要選擇 Callable Statement
(七)聚合報告
介紹一下聚合報告值的意義:
- Samples ## 事務數
- Average ## 平均響應時間,如果運用了事務控制器,那么就是一個事務的響應時間
- Median ## 一半的請求的響應時間是這個值
- 90% Line ## 響應時間從小到大排列,90% 的響應時間是這個值,也就是說其余的 10% 請求都超過這個值
- 95% Line ## 響應時間從小到大排列,95% 的響應時間是這個值,也就是說其余的 10% 請求都超過這個值
- 99% Line ## 響應時間從小到大排列,99% 的響應時間是這個值,也就是說其余的 10% 請求都超過這個值
- Min ## 最小的響應時間
- 最大值 ## 最大的響應時間
- Error% ## 錯誤的事務所占總失誤比例
- Throughput ## tps
- Received KB/s ## 每秒從服務器端接收到的數據量
- Send KB/s ## 每秒發送給服務器端的數據量
注意,在壓測過程中,察看結果樹以及聚合報告等是不能添加在腳本內的,為什么呢?因為這個其實是日志收集的組件,會對負載機本身造成影響,組件只是調試腳本使用,能不用組件,盡量不用。
(八)No-Gui
為什么要 no - gui 呢?其實是官方給的建議,壓測過程用 no - gui 進行壓測。實際上,我們的腳本就是個 jmx 形式的文件,給負載機執行這個腳本而已,那么有沒有界面其實不重要,關於no - gui 壓測的部署,我們不多說,之前的博客是有整理的:
https://www.cnblogs.com/xiaowenshu/p/10076707.html
https://www.cnblogs.com/xiaowenshu/p/9905516.html
(九)分布式負載
老規矩,上博客鏈接:
https://www.cnblogs.com/xiaowenshu/p/9979839.html
https://www.cnblogs.com/xiaowenshu/p/9925169.html
四、總結
1、面試中會問:為什么要做接口測試?接口測試怎么做?接口測試有什么優勢?在文中是有簡單提及。
2、接口測試常用工具:postman 和 jmeter,以及輔助工具:fiddler & f12 大法
3、思考一下,jmeter 持續集成的手段以及 postman 的持續集成手段。這樣才能真真自動化,jmeter 可以用 jmeter + ant + jenkins。還有個問題,如果我們將測試用例寫在 Excel 內維護,那么測試結果那一項,jmeter 如何往文件內寫入內容?以此判斷測試用例是否通過。