接口測試


以下接口來源: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元,那在頁面上點是測試不了的,這個時候我們就可以直接用接口來調用,修改一下訂單金額的值,然后再發請求就可以了。

  或者另一種情況,前端咱們限制了輸入的內容,或者說是下拉框選擇的情況,那么這樣是前端測試不了的。我們只能借助接口測試傳不同的參數來進行測試
  當然這只是我舉幾個例子,接口測試當然不只是這一點原因,總的來說還是為了更好的提高我們產品的質量。

  接口測試必要性,總結:

  1. 可以發現很多在頁面上操作發現不了的bug
  2. 檢查系統的異常處理能力
  3. 檢查系統的安全性、穩定性
  4. 前端隨便變,接口測好了,后端不用變

 怎么做接口測試

接口測試流程

  1. 需求評審,熟悉業務和需求
  2. 開發提供接口文檔
  3. 編寫接口測試用例
  4. 用例評審
  5. 提測后開始測試
  6. 提交測試報告

接口測試規范文檔

既然我們要測試接口,那我們根據什么來測試呢?
那就是接口規范文檔,也是我們測試最重要的一個依據
接口文檔是干嘛的呢,接口文檔說簡單點,就是這個接口的使用文檔。
接口文檔至少包括:

  1. 接口說明
  2. 調用url
  3. 請求方法(get\post)
  4. 請求參數、參數類型、請求參數說明
  5. 返回參數說明

怎么來測試接口—— http 接口

前面我們已經有了接口文檔,那么我們就要根據接口文檔來拼接參數調用接口,那么怎么調用呢?
接口請求報文拼接
1、url?param=value&param2=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

接口測試用例設計

  用例設計思路:等價類分析+邊界值分析+錯誤推斷+安全+性能

 (一)通過性驗證:首先肯定要保證這個接口功能是好使的,也就是正常的通過性測試,按照接口文檔上的參數,正常傳入,是否可以返回正確的結果。

 (二)接口安全:

  1. 繞過驗證,比如說購買了一個商品,它的價格是300元,那我在提交訂單時候,我把這個商品的價格改成3元,后端有沒有做驗證,更狠點,我把錢改成-3,是不是我的余額還要增加?
  2. 繞過身份授權,比如說修改商品信息接口,那必須得是賣家才能修改,那我傳一個普通用戶,能不能修改成功,我傳一個其他的賣家能不能修改成功
  3. 參數是否加密,比如說我登陸的接口,用戶名和密碼是不是加密,如果不加密的話,別人攔截到你的請求,就能獲取到你的信息了,加密規則是否容易破解。
  4. 密碼安全規則,密碼的復雜程度校驗

 (三)異常驗證:
  異常的,也就是我不按照你接口文檔上的要求輸入參數,來驗證接口對異常情況的校驗。比如說必填的參數不填,輸入整數類型的,傳入字符串類型,長度是10的,傳11,總之就是你說怎么來,我就不怎么來,其實也就這三種,必傳非必傳、參數類型、入參長度。

 (四)根據業務邏輯來設計用例

  根據業務邏輯來設計的話,就是根據自己系統的業務來設計用例,這個每個公司的業務不一樣,就得具體的看自己公司的業務了,其實這也和功能測試設計用例是一樣的。
  舉個例子,拿bbs來說,bbs的需求是這樣的:

  1. 登錄失敗5次,就需要等待15分鍾之后再登錄
  2. 新注冊的用戶需要過了實習期才能發帖
  3. 刪除帖子扣除積分
  4. ......

  像這樣的你就要把這些測試點列出來,然后再去造數據測試對應的測試點。

接口測試用例模板

下面,做一個測試用例設計模板:

項目 模塊 用例 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. 怎么發請求
  2. 怎么驗證結果

1)Postman 腳本編寫

  一般來講,有兩種請求是我們經常要用的:GET/POST。那么POST 請求內又分為 Form-Data 、Json、上傳文件 三類,具體用什么方式去請求,看接口文檔的要求。

GET 請求:

  比如我們就按照 "獲取學生信息" 接口,用 Postman 實現

  1. 選擇請求方式
  2. 依據接口文檔描述,輸入 URL 
  3. 如果需要 Header ,在Headers 內進行添加
  4. 點擊 Send 
  5. 查看結果


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 做接口測試呢?

  1. 添加線程組
  2. 添加http請求
  3. 在http請求中寫入接口url、路徑、請求方式、參數
  4. 添加查看結果樹
  5. 調用接口、查看返回值
  6. 對接口的返回值利用響應斷言校驗返回數據

這里具體的 jmeter 各組件使用以及詳細說明不進行贅述,在另一片博文內,我會進行介紹,等待完成貼鏈接

(一)安裝

  安裝分兩步:

  1. 安裝好 jdk:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ,配置好環境變量
  2. 下載好 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返回有亂碼

  1. 在jmeter.properties文件中最下面加入 sampleresult.default.encoding=UTF-8
  2. 重啟jmeter

B、bodydata里面中文顯示不出來

  1. 在jmeter.properties文件中最下面加入 jsyntaxtextarea.font.family=Hack
  2. 重啟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 如何往文件內寫入內容?以此判斷測試用例是否通過。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM