基於Java+HttpClient+TestNG的接口自動化測試框架(一)-------接口測試模型

  本篇開始,將陸續介紹基於Java+HttpClient+TestNG的接口自動化測試框架。(這裏須要閱讀的童鞋們有Java的編碼知識及HttpClient和TestNG的使用經驗。前端

  首先,咱們須要討論一下,什麼是接口測試?爲何要作接口測試?以及咱們這個框架解決的問題是什麼。數據庫

  什麼是接口測試?首先須要說明一下什麼是接口。按照百度的定義,接口------外部系統與系統之間以及內部各個子系統之間的交互點。這麼說有點抽象,簡單來講,若是我要在一個網頁中顯示一些數據/文字什麼的,我須要有數據來源,碰巧這些數據來源是須要通過邏輯計算的,又碰巧這些數據來源不是來自同一個服務器。那麼,若是我直接把這些邏輯和請求都寫在頁面上顯然是不合適的。這時,咱們須要去請求一個接口,這個接口就是頁面顯示和後臺服務之間的交互點。接口測試就是測試這個交互點的功能是否正常,我所須要的數據是否按既定的邏輯進行返回。從這個意義上來講,接口測試很是簡單,咱們只須要考慮各類輸入條件下,會產生相應的什麼結果,是最爲簡單的黑盒測試!json

  那麼爲何要作接口測試呢?無他,整體來講就是成本低,效果好,速度快。後端

  在前端的童鞋尚未完成UI頁面以前,傳統的測試是不太可能進行的。而接口測試不須要UI界面,直接經過接口去驗證後臺邏輯。並且,若是有人經過抓包,直接跳過前端的校驗,去進入後端的程序。也是一件很危險的事情。所以,接口測試能夠儘量早的開展。越早介入測試,發現的問題解決起來的成本是越低的。在傳統的測試中,開發沒有將完整產品提交給測試時,測試這邊是沒法工做的。而在如今流行的敏捷開發中,開發能夠寫完一個接口就進行一輪接口測試的迴歸,以最小的代價快速保證質量。api

  接口測試性價比很高,不少公司也比較喜歡進行接口測試。那麼當咱們作接口測試時,到底須要作哪些方面的工做呢?服務器

  1. 獲取需求文檔和接口文檔 --------> 實際有可能沒有,有可能不全。
  2. 經過對需求文檔分析出接口的業務邏輯要求以及業務邊界 -------->對測試的業務場景進行構建
  3. 經過對接口文檔分析出接口的技術指標(接口地址、請求方式、入參、出參)-------->實際測試的以前必須搞清楚要訪問接口的信息。
  4. 接口測試用例設計(着重於接口測試數據準備)-------->業務數據的準備尤其重要。
  5. 使用接口測試工具進行接口測試 --------> 可使用Jmeter,Postman等軟件,也可使用自動化測試框架
  6. 接口缺陷管理與跟蹤 -------->生成測試的log與報告
  7. 接口自動化持續集成 -------->用於Jenkins平臺

  在這裏,有一個誤區,不少人認爲會使用接口測試工具就是會接口測試。其實接口測試遠遠不止是工具的使用,Jmeter也好,Postman也好,這些工具都是咱們在進行接口測試過程當中可以更方便的進行測試,而工具僅僅是工具,真正核心部分仍是接口測試用例設計以及測試思惟。app

  既然已經有了接口測試的軟件,也能必定程序上實現接口測試的自動化操做。爲何咱們還要費勁周折的去寫接口自動化測試框架呢?說實話,我一開始也不是很明白。直到後來,我遇到了這樣一個接口,框架

這個接口的訪問須要輸入一個sign做爲參數。而這個sign的獲取方式以下:ide

  int A 爲當前系統的Unix時間戳。(即1970年1月1日到如今有多少秒),String B爲當前用戶所對應的secret數據庫id(一個32位字符串),String C爲當前的appkey(能夠經過另一個接口得到),工具

將int A轉爲16進制,而後變成字符串,與B及C拼接成字符串D,而後對字符串D取MD5的值,做爲sign。

  說實話,這個我不知道用Jmeter或者Postman怎麼作。尤爲是int A每一秒都不同。在這種狀況下,本身寫個工具來解決,是否是方便不少呢?

       針對一些使用工具進行接口測試的痛點,就說說咱們這個接口自動化測試框架可以解決哪些問題。

  1. 採用數據驅動方式來解決大量功能重複性接口的測試。
  2. 針對返回JSON字符串,採用JSONPath的模式來精準斷定JSON的內容。
  3. 能夠生成比較直觀的報告。

  固然,也能夠集成不少小工具。好比上面提到的計算MD5的值。

  先開個頭,想一想一個接口的請求及返回是由哪些構成的呢?

  請求的有:url,訪問方法,請求頭,body,參數等,返回的有json字符串,狀態等。

  咱們能夠根據接口的訪問和返回的內容,作成一個Bean,來記錄請求和返回及斷定的數據,而這些數據都記錄在Excel中。

  如今作成Excel的基礎類:

  

package apiTest.bean; 
public class baseBean { private String excelName; private String sheetName;
public String getSheetName() { return sheetName; } public void setSheetName(String sheetName) { this.sheetName = sheetName; } public String getExcelName() { return excelName; } public void setExcelName(String excelName) { this.excelName = excelName; } }

        而後,咱們的api請求及返回繼承這個基礎類。 

package apiTest.bean; public class apiDataBean extends baseBean { private boolean run; //是否運行
    private String desc; // 接口描述
    private String method;//訪問方法
    private String url; //接口訪問url //header的狀況相對複雜,能夠設置公共header,也能夠針對個別請求來設定訪問的header。
    private String header; private String body;//接口請求時的body
    private boolean contains; //是否對返回的json字符串中做包含斷定(針對接口返回內容較多,很差具體制定路徑的狀況)
    private int status; //返回狀態
    private String verify;//斷定內容
    private String save; //須要保存的內容
    private String param; //接口發送須要的參數
    private int sleep; //暫停時間
    public boolean isRun() { return run; } public void setRun(boolean run) { this.run = run; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getHeader() { return header; } public void setHeader(String header) { this.header = header; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public boolean isContains() { return contains; } public void setContains(boolean contains) { this.contains = contains; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getVerify() { return verify; } public void setVerify(String verify) { this.verify = verify; } public String getSave() { return save; } public void setSave(String save) { this.save = save; } public String getParam() { return param; } public void setParam(String param) { this.param = param; } public int getSleep() { return sleep; } public void setSleep(int sleep) { this.sleep = sleep; } @Override public String toString() { // TODO Auto-generated method stub
        return String.format("desc:%s,method:%s,url:%s,param:%s", this.desc, this.method, this.url, this.body); } }

 

       好的,這樣咱們就對接口及返回數據製做了一個類,這個類就是接口測試的數據模型。

  開篇先寫道這裏。以後咱們來討論配置的讀取和設定。

相關文章
相關標籤/搜索