2017.10.21 始發于TesterHome精華帖 Postman+Newman+Git+Jenkins+Slack 接口自動化和監控
打算寫這個文章很久了,終于下定決心動一下懶得不能再懶的一雙手。。。
之前有寫過一個Postman 使用小結 ,主要是針對Postman 用戶端的使用總結。
後續跟進接口自動化,之前用Postman梳理的很多接口又不舍得丢棄,于是又深挖了下?。
如何第一時間發現接口異常,并快速定位哪裡出了問題,哪個接口or服務?想到接口自動化和Slack,是以就有了以下内容
一、Newman介紹:
1、簡介
Newman是指令行工具,Postman是GUI的用戶端,Newman可執行Postman導出的.json腳本檔案。
Newman 運作需要先安裝NodeJS環境(>=v4.)。
NodeJS下載下傳:https://nodejs.org/en/download/package-manager.
因NodeJS可以跨平台支援,是以Postman & Newman也可以同時支援Windows/Mac/Linux等多個系統。
2、安裝
通過NPM安裝,是以上面安裝nodejs最好也通過NPM安裝
$ npm install newman --global;
3、檢查
$ newman -v
列印出目前Newman版本号即安裝成功。
PS:Newman一定要用最新或3.8.0及以上版本,因之前版本存在一些bug,會導緻運作Postman腳本時報錯。
4、運作
運作一個Postman導出的.json檔案
二、Newman指令行介紹:
newman run <collection-file-source> [options]
-
-e <source>, --environment <source>
- 指定環境變量的路徑。環境變量定義和管理詳見:官方詳解
-
-g <source>, --globals <source>
- 指定全局變量的路徑。
-
-d <source>, --iteration-data <source>
- 指定資料(csv)檔案路徑。資料檔案說明:官方詳解
-
-n <number>, --iteration-count <number>
- 指定目前腳本運作次數。
-
--export-environment <path>
- 執行結束前,導出本次執行後的環境變量到指定路徑。
-
--export-globals <path>
- 執行結束前,導出本次執行後的全局變量到指定路徑。
-
--export-collection <path>
- 執行結束前,導出本次執行後的全部腳本到指定路徑。
-
--timeout-request <ms>
- 指定請求逾時時間,機關是毫秒ms。
測試結果配置
-
-r <reporter-name>, --reporters <reporter-name>
- 指定測試報告的導出格式
- 目前支援四種格式:
,cli
,json
,html
junit
-
--reporter-{{reporter-name}}-{{reporter-option}}
- 支援同時導出多種測試報告格式
- JSON
--reporter-json-export <path>
- HTML
--reporter-html-export <path>
- JUNIT/XML
--reporter-junit-export <path>
- 上述幾種測試報告Demo詳見:官方詳解
示例
newman run -e ...... -n 1 -r cli,json,junit --reporter-json-export /home/admin/temp/json_reporter_171211.json --reporter-junit-export /home/admin/temp/xml_reporter_171211.xml
注釋
newman執行指定腳本1次,并輸出cli、json和junit三種測試報告,其中json報告儲存至
home/admin/temp/json_reporter_171211.json
,junit報告儲存至
/home/admin/temp/xml_reporter_171211.xml
。
------------------------------------分 割 線----------------------------------------------------
以上部分摘自Newman Github官網,提了一些下面會用到的地方,還有很多地方沒有提到,更全更詳細詳見官方文檔 Newman Github
終于到重點了
三、Newman實作接口自動化流程
整體架構如下圖:
1、Postman中調試接口,編寫業務邏輯和Tests
目前我們主要做以下四個方面的斷言:
1.1 Http statuscode
1.2 特定資料校驗
// 先轉成json格式,然後判斷
var jsonData = JSON.parse(responseBody);
if(jsonData.hasOwnProperty("a")){
tests["Parameter a is here"] = true;
}else{
// response中不包含特定參數,列印url和response
tests["[ERROR]KEY not in Response, please Check: " + request.url + " " + responseBody] = false;
}
1.3 請求逾時判斷
// 請求時長判斷,大于等于limitReqTime 時報錯
// limitReqTime 作為環境變量可動态配置
if(responseTime < parseInt(environment["limitReqTime"])){
tests["Request Success"] = true;
}else{
// 逾時,列印url和實際請求時間responseTime,responseTime是工具本身提供
tests["[INFO]Request success, BUT time is too long: " + request.url + " " + responseTime] = false;
}
1.4 錯誤判斷
// 假設Http code 不等于200即表示有錯誤
if(responseCode.code === 200){
var jsonData = JSON.parse(responseBody);
tests["Request seccess"] = true;
}else{
// 非200報錯,列印錯誤資訊,輸出目前請求的錯誤資訊,包括請求時長、請求資料、傳回資料等
tests["[ERROR]" + request.url + " " + responseCode.code + " " + responseCode.name + " " + responseTime + "ms Request:" + request.data + " Response:" + responseBody] = false;
}
PS:以上列印資訊都使用的
tests[...] = true/false
,主要是為後續
Newman
內建Jenkins時,導出
Junit/xml
報告所用。
平時調試也可以使用
console.log(...)
,具體調試資訊可在Postman左上角菜單->View->Show DevTools/Show Postman Console 中檢視。
Tests 中流程如下
2、導出json腳本,上傳到Git;
這一步比較簡單,就是把在Postman中寫好的腳本(Collections)和環境變量(Environment)導出成幾個.json檔案,然後上傳到Git中,此處不贅述。
PS:不同的API接口執行頻率根據業務可能有差別,考慮後面Jenkins 任務執行頻率設定,最好是在導出之前就将Collections的分組設計好,以友善後續執行。
3、Jenkins中建立Git 自動更新任務
3.1 Jenkins 建立一個自由風格的項目
3.2 設定Git位址、證書及分支
3.3 設定Git hook
在建構觸發器中勾選
GitHub hook trigger for GITScm polling
點選儲存即可,此任務建立完畢。
任務目的:當Git分支中有更新時,會觸發此任務建構,将最新的分支腳本clone到目标機器上。
4、Jenkins中建立Newman API任務
4.1 設定定時任務
建構觸發器中選擇
Build periodically
,填寫腳本即可
如
H/5 * * * *
:每五分鐘執行一次建構
4.2 建構腳本
建構中選擇
Execute shell
,編寫腳本。
以下是我的Newman run的示例腳本
WORKSPACE_PATH="/home/ubuntu/temp"
WORKSPACE_SCRIPTS="/home/ubuntu/temp/scripts"
CURRENT_COUNTRY="/zh_CN"
CURRENT_DAY=`date +%y%m%d`
REPORTER_NAME="reporter_"`date +%y%m%d`_${BUILD_NUMBER}
echo ${WORKSPACE_PATH} ${WORKSPACE_SCRIPTS} ${CURRENT_COUNTRY} ${CURRENT_DAY} ${REPORTER_NAME}
newman run ${WORKSPACE_SCRIPTS}/collection.json \
-e ${WORKSPACE_SCRIPTS}${CURRENT_COUNTRY}/environment.json \
-g ${WORKSPACE_SCRIPTS}/globals.json -n 1 -r json,cli,junit \
--reporter-json-export ${WORKSPACE_PATH}/${CURRENT_DAY}/${REPORTER_NAME}.json \
--export-environment ${WORKSPACE_SCRIPTS}${CURRENT_COUNTRY}/environment.json
說明:上面腳本中的
\
作用是使腳本換行顯示,為了友善檢視,否則這麼長的腳本會顯示成一行,注意斜杠後一定不要留白格。
重要說明:解釋下上面腳本中添加
--export-environment <path>
的原因,Newman執行時,本次run使用的變量是
-e <path>
或
-g <path>
中存儲的資料。如果run中包含多個接口,且互相間存在資料調用,比如a接口傳回參數被b接口當傳參調用,此時就要使用
--export-environment <path>
,将本次run後的結果變量重新導出一份新的,覆寫掉上述
-e <path>
或
-g <path>
中的
<path>
即可,這樣下次run使用的資料是最新的。否則,每次執行都會調用同一份測試資料。
此問題隻在Newman中存在,在Postman中,因資料是實時寫到變量中的,是以不用擔心上述問題。
5、Jenkins中添加JUnit配置
前置條件:Jenkins已安裝
JUnit Plugin
插件
在建構後操作中選擇
Publish JUnit test result report
PS:Newman導出的檔案會儲存到Jenkins預設工作空間下面的newman檔案夾中, 也可以改成自定義的路徑。
添加此配置時,
newman run
時
-r
一定要加上
junit
,否則沒有資料 。
6、Jenkins JUnit測試結果展示
列舉下面三圖舉例,其它一些功能請自行檢視
- 任務頁面會出現如下測試結果趨勢
- 所有任務執行情況彙總
- 單任務中每個接口結果
7、Jenkins配置Slack
前置條件:Jenkins已安裝
Slack Notification Plugin
插件
詳見另一篇文章 Jenkins + Slack配置
8、測試結果發送到Slack,移動端檢視,效果圖如下:
上面是在Linux環境上搭建的,如果要在Windows上搞這個,請參考下面這篇文章:
LinkedIn參考文獻:
https://www.linkedin.com/pulse/api-test-automation-ci-using-github-jenkins-slack-talal-ibdah
總結
上面這些内容已經應用較長一段時間了,除了網絡錯誤外,效果也還是不錯。
使用這個Newman原因很簡單,就是快:上手快、普及快、環境部署快、內建快。。。
但也有不足,此處暫不列舉。
文章有點長,感謝大家耐心閱讀完
大家有任何指點可随時在這裡讨論?
歡迎交流
詳細交流口口裙:668526705
威信嗖:Postman&Newman