一、Postman介紹
Postman是google開發的一款功能強大的網頁調試與發送網頁HTTP請求,並能運行測試用例的的Chrome插件。其主要功能包括:
- 模擬各種HTTP requests
從常用的 GET、POST 到 RESTful 的 PUT 、 DELETE …等等。 甚至還可以發送文件、送出額外的 header。 - Collection 功能(測試集合)
Collection 是 requests的集合,在做完一個測試的時候, 你可以把這次的 request 存到特定的 Collection 里面,如此一來,下次要做同樣的測試時,就不需要重新輸入。而且一個collection可以包含多條request,如果我們把一個request當成一個test case,那collection就可以看成是一個test suite。通過collection的歸類,我們可以良好的分類測試軟件所提供的API.而且 Collection 還可以 Import 或是 Share 出來,讓團隊里面的所有人共享你建立起來的 Collection。 - 人性化的Response整理
一般在用其他工具來測試的時候,response的內容通常都是純文字的 raw, 但如果是 JSON ,就是塞成一整行的 JSON。這會造成閱讀的障礙 ,而 Postman 可以針對response內容的格式自動美化。 JSON、 XML 或是 HTML 都會整理成我們可以閱讀的格式 - 內置測試腳本語言
Postman支持編寫測試腳本,可以快速的檢查request的結果,並返回測試結果 - 設定變量與環境
Postman 可以自由設定變量與Environment,一般我們在編輯request,校驗response的時候,總會需要重復輸入某些字符,比如url,postman允許我們設定變量來保存這些值。並且把變量保存在不同的環境中。比如,我們可能會有多種環境, development 、 staging 或 local, 而這幾種環境中的 request URL 也各不相同,但我們可以在不同的環境中設定同樣的變量,只是變量的值不一樣,這樣我們就不用修改我們的測試腳本,而測試不同的環境。
二、postman工具介紹和應用
幾乎很多人都是從postman開始做接口測試的。所以,我們很有必要了解這個工具。我個人認為,postman是一個半自動化接口測試工具。因為功能和軟件本身限制,還是不能夠達到代碼自動化測試的效果。
1、postman的下載和安裝
在介紹這個工具之前,我們還是需要先安裝到本地,才開始學習postman。
官網是https://www.getpostman.com/。我個人習慣是在chrome瀏覽器上安裝postman的插件,方法就是chome瀏覽器上輸入chrome://extensions/,然后輸入postman進行搜索,遺憾的是,我們國內網絡連接不上google應用商店,所以無法直接下載安裝,我幫忙下載了一個postman的插件安裝程序,但是拖動到chrome瀏覽器內提示不能安裝這個擴展程序。如果沒辦法訪問google的朋友,就去安裝windows版本的安裝文件,點擊這里。
2、postman軟件界面介紹
我這邊使用的是瀏覽器插件版,然后在桌面生成一個快捷方式。剛剛安裝的postman,打開需要你登錄或者創建一個賬號,這里我們點擊不創建,直接進來的界面如下圖。
這里不一一介紹每個按鈕的左右,還是粗略分為三大塊。
- 左邊這塊,主要是接口用例的管理和執行導出操作。
- 右邊上面部分這塊,表示接口輸入的區域,主要有接口地址,請求方式,參數設計。
- 第三部分是接口的響應顯示內容。
1、設置postman的主題
2、導出和導入接口集
postman支持非常方便的導入和導出接口集,繼續操作如下:
導出(數據一般以postman_collection.json結尾)
導入:
3、身份驗證Authentication
- Basic Auth
是基礎的驗證,所以會比較簡單
會直接把用戶名、密碼的信息放在請求的 Header 中 - Digest Auth
要比Basic Auth復雜的多。使用當前填寫的值生成authorization header。所以在生成header之前要確保設置的正確性。如果當前的header已經存在,postman會移除之前的header。 - OAuth 1.0
postman的OAuth helper讓你簽署支持OAuth1.0基於身份驗證的請求。OAuth不用獲取access token,你需要去API提供者獲取的。OAuth 1.0可以在header或者查詢參數中設置value。 - OAuth 2.0
postman支持獲得OAuth 2.0 token並添加到requests中。
4、下載文件接口
按照一般請求接口,配置好接口地址以及參數,點擊Send and Download 按鈕,執行請求的同時會下載文件
3、postman接口測試舉例
還是以前面一篇文章介紹的新浪天氣舉例。
3.1 選擇請求方式是GET
3.2 輸入接口測試地址和輸入參數,如下圖,根據順序來填寫
3.3 確認填寫沒問題,點擊Send這個按鈕,查看response內容
上面可以看到接口響應的狀態碼是200 OK,接口得到response的時間是63毫秒。內容可以通過xml格式顯示天氣信息。你顯示格式方面,你可以點擊不同效果,例如當前是Pretty模式,你可以點擊Raw模式看看或者Preview模式。接口數據有的是xml格式,有的是json格式。
以下是http狀態碼以及對應的含義,可以作為測試過程中的參考:
4、postman進行接口自動化斷言
上面我們查看response信息是手工人眼去判斷,那么postman是不是可以支持自動化斷言呢,文章開頭提到postman是一個半自動工具,這里舉例來說明。
我們在Tests tab下設置了三個自動化斷言,一個是狀態碼是不是等於200,第二個是響應時間需要小於200ms,第三個是響應內容包含北京這個字段。我們可以在右側找到這三個函數,點擊就會自動化生成在代碼輸入區域。
查看測試結果是否通過。
上面可以看到自動化斷言測試通過,如果是失敗,會顯示紅色Fail按鈕。如果你需要保存這個接口,以便下次使用,你可以點擊右上角的Sava按鈕,彈出頁面,你需要創建一個集合,點擊保存到這個集合里。再回到postman頁面介紹左上角,有一個Run按鈕,左側我把接口保存到一個demo的集合里面。點擊Run,選擇demo集合,設置執行多少次,然后可以看見測試報告,一個很簡單的測試報告。
三、Postman 發送請求
安裝好之后,我們先打開Postman,可以看到界面分成左右兩個部分,右邊是我們后頭要講的collection,左邊是現在要講的request builder。在request builder中,我們可以通過Postman快速的隨意組裝出我們希望的request。一般來說,所有的HTTP Request都分成4個部分:URL、method、 headers和body。而Postman針對這幾部分都有針對性的工具。
1、URL
要組裝一條Request, URL永遠是你首先要填的內容,在Postman里面你曾輸入過的URL是可以通過下拉自動補全的哦。如果你點擊Params按鈕,Postman會彈出一個鍵值編輯器,你可以在哪里輸入URL的Parameter,Postman會幫你自動加入到URL當中,反之,如果你的URL當中已經有了參數,那Postman會在你打開鍵值編輯器的時候把參數自動載入
2、Headers
點擊’Headers’按鈕,Postman同樣會彈出一個鍵值編輯器。在這里,你可以隨意添加你想要的Header attribute,同樣Postman為我們通過了很貼心的auto-complete功能,敲入一個字母,你可以從下拉菜單里選擇你想要的標准atrribute
3、Method
要選擇Request的Method是很簡單的,Postman支持所有的Method,而一旦你選擇了Method,Postman的request body編輯器會根據的你選擇,自動的發生改變
4、Request Body
如果我們要創建的request是類似於POST,那我們就需要編輯Request Body,Postman根據body type的不同,提供了4中編輯方式:
- form-data
- x-www-form-urlencoded
- raw
- binary
1、form-data:
就是http請求中的multipart/form-data,它會將表單的數據處理為一條消息,以標簽為單元,用分隔符分開。既可以上傳鍵值對,也可以上傳文件。
當上傳的字段是文件時,會有Content-Type來表名文件類型;content-disposition,用來說明字段的一些信息;
由於有boundary隔離,所以multipart/form-data既可以上傳文件,也可以上傳鍵值對,它采用了鍵值對的方式,所以可以上傳多個文件。
2、x-www-form-urlencoded:
就是application/x-www-from-urlencoded,會將表單內的數據轉換為鍵值對拼接起來,比如,name=java&age = 23
3、raw
可以上傳任意格式的文本,可以上傳text、json、xml、html等
4、binary
相當於Content-Type:application/octet-stream,從字面意思得知,只可以上傳二進制數據,通常用來上傳文件,由於沒有鍵值,所以,一次只能上傳一個文件。
(我們這里是可以傳文件的哦)
四 、在test suite中運行test case
我們已經知道如何用Postman組裝並發送消息,那我們如何根據需求用Postman來做測試呢?在這開始之前,我們先來看看Postman的左邊面板:
這里包含了History和Collection,我們可以在History里面看到我們曾經發送過的HTTP Request, 我們可以很方便的通過點擊上面的項重新構建我們的request。而右邊的Request Builder面板上,還有兩個按鈕,Pre-request Script和Tests。
- Pre-request Script
定義我們在發送request之前需要運行的一些腳本,應用場景主要是設置全局變量和環境變量 - Tests
定義發送Request之后,需要用腳本檢測的內容,也就是Test case的內容。
這里的的Tests是我們關鍵。
1、Test
打開Tests,我們可以看到窗口分成兩部分,一部分是左邊的代碼窗口和右邊的Snippet窗口,點擊對應的snippet,postman會在左邊的窗口為我們生成對應的代碼,在下面的圖中,我選擇了“Response body: is equal to a String”和“Response time is less than 200ms”,可以看到Postman在代碼窗口為我加載對應的語句,這里我把希望的responseBody改成了“No valid parameters!!”.
這樣我就完成一條簡單的測試用例:
- 當HTTP Get request沒有帶任何參數的時候,希望response的body返回字符串“No valid parameters!!”
- responseTime小於200ms
2、Variables and Environment
變量
開發人員知道變量是符號名稱,代表您存儲在其中的信息。變量表示的信息可以更改,但變量上的操作保持不變。Postman中的變量以相同的方式工作。
您可以在多個位置重用變量的值。如果更改變量的值,則該變量的每個實例都將更改為新值。
環境
環境是一組鍵值對。鍵表示變量的名稱。您可以使用數據編輯器修改環境。
使用API時,通常需要為本地計算機,開發服務器或生產API提供不同的設置。環境允許您使用變量自定義請求,以便您可以在不更改請求的情況下輕松切換不同的設置。
全局變量
全局變量提供了一組在所有范圍內始終可用的變量。您可以擁有多個環境,但只有一個環境可以使用一組全局變量一次處於活動狀態,這些變量始終可用。
變量
我們可以分配五種類型的變量范圍:
- 全局
- 采集
- 環境
- 數據
- 本地
他們的的優先級如下圖:
官方文檔對變量定義的格式為{{variableName}}
另外,這里大家可以看到在URL輸入框中,我使用了{{myLocalHost}},那我們如何定義變量呢,首先,我們得創建一個Environment,點擊Environment那個button(在這里是“SampleEnv”那個button,因為我將其選擇我當前使用的Environment)
在Postman里面:
- Environements包含global Environment,即全局的Environment,里面定義的變量在任何地方地方都可以看到
- local Environment, 里面定義的變量只有在當前Environment里面才可以看到,這里,我定義了一個“SampleEnv”
- Environment可以被share,通過你的postman賬號或者google賬號
- Environment可以通過文件import
點擊之后,選擇Manage Environments。若要新建,選擇Add。若要編輯global Environment, 選擇Globals
我們來看看我已經創建好的SampleEnv,這里只創建了一個變量myLocalHost,也就是我們之前看到的在URL里的那個變量,這個變量在URL里可以用,在test script里面可以用,任何其他地方你都可以通過{{}}符號獲得它的值。
這里稍微舉例一下變量的好處,比如你把APP部署在自己的機器上時使用的域名是localhost,而部署在服務器上時,域名就是具體的服務器ip。為了在兩種不同環境上測試你的API,你在構建request的時候就需要輸入不同的url,但如果你使用了變量,你就可以使用變量來復用你的url,你只需在不同的environment里面給url賦不同的值,那你的request就完全不需要變。同理,在tests里面也是一樣的。這里就不贅述
3、Collection
如果我們將一個request看成一個測試用例,Collection可以看作是一個測試套件;
Collection可以一鍵運行Collection里的所有request請求;
Collection支持csv或者json格式的文件導入,官網有模板文件,json格式如下;
[{ "path": "post", "value": "1" }, { "path": "post", "value": "2" }, { "path": "post", "value": "3" }, { "path": "post", "value": "4" }]
引用變量的語法有兩個:
data.username 或者data['username']
定義好了test case (寫好的Request和定義好結果檢查tests),我們就需要運行,你可以簡單點擊send按鈕查看結果,但這時候你不會明顯的看到測試的結果,你需要把這條request加入到collection當中。我們先創建一個collection:
在彈出的窗口中創建你的collection,命名為你test suite的名字:
創建collection之后,把已經寫好的request(test case)保存到collection(test suite)當中。
- 點擊save,把Request Name改成你的test case的名字,比如“test_NoParameter_Expect_WarningInfo”;
- save to exist collection,選擇之前創建好的collection, “TestParameters”;
點擊窗口中的save之后我們就可以在左界面上看到我們的這個collection和collection中的request了:
點擊 ‘>’按鈕(點擊了之后會變成 ‘<’),我們就會看到彈出的窗口中有一個‘Run’,運行一下,就會彈出一個collection runner的窗口。點擊一下start test,你就可以看到運行的結果,這里我選擇了運行100次,在左邊窗口你還可以看到之前的運行記錄:
加入我把App的接口改為:
@Override protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { if( request.getParameter( "name" ) != null ) { response.getWriter().print( "lex" ); } else { response.getWriter().print( "No valid parameters???" ); } }
這會導致response body的比較不匹配 No valid parameters??? != No valid parameters!!
那你就會看到 Body is correct case是FAIL的.
4、用Postman生成Request其他語言的代碼
Postman這款工具可以讓你很方便的測試你的Web API,那如果你實在是沒辦法用Postman,必須手寫代碼,又或者你有別的需求是Postman沒法實現的,你必須寫一個特殊的script或App來測試你的接口,那這時候是不是Postman就沒有用武之地了?我來個你share一個小技巧吧,管不管用你說的算。
假設我現在要這樣來測我的接口:我們要設置用戶名和密碼:
我們要設置參數和Header:
如果讓你寫代碼來生成這個HTTP Request是不是感覺有點麻煩? 如果你也是個懶人,就打開Postman,配好你想要的HTTP Request,然后點擊上圖中的Generate Code吧,在彈出的窗口里面,你可以看到這條Request在各種語言里面的對應寫法
比如Javascript AJAX:
var settings = { "async": true, "crossDomain": true, "url": "http://maps.googleapis.com/maps/api/geocode/json?Address=%E4%B8%AD%E5%9B%BD%E5%9B%9B%E5%B7%9D%E6%88%90%E9%83%BD%E5%B8%82%E5%A4%A9%E5%8D%8E%E4%B8%80%E8%B7%AF&sensor=true", "method": "GET", "headers": { "accept": "application/xml", "cache-control": "no-cache", "pragma": "text/cmd", "postman-token": "c7d566f4-0e21-9680-e47f-667b3e65280d" } } $.ajax(settings).done(function (response) { console.log(response); });
五、Script腳本
1、postman中的script
postman集成了一個強大的,基於nodejs的script引擎,借助它,您可以為requests和collections添加動態的行為。
這樣就可以在編寫test suite時,構建可以包含動態參數的request,在request之間傳遞數據等等。您可以在流程中的兩個事件中添加要執行的JavaScript代碼:
1. 在發送request之前,編寫pre-request script,定制化request。
2. 收到response之后,用test script,處理返回的數據。
整個流大概是這樣的:
2、Pre-request scripts
pre-request script就是一段在發送request之前執行的代碼。大家可以自己腦補在什么場景可以用到它。比如,隨機的URL參數,變化的requst body等。
這里要注意的是,pre-request script和test scripts一樣,都是javascript,同時,和angular js一樣,可以用兩個{{}}訪問環境變量。
遞增的url參數
最近一直在玩elasticsearch,就用elasticsearch的API來作為例子吧。我們通過GET API,可以獲取ES中的數據。我現在從tushare上把新華保險的日線數據導出為json格式的文件,存儲到ES當中。每條記錄都有一個id。通過postman單個調用接口,大概是這樣的:(截圖中的url應該是localhost:9200/xhbx/stock-record/_search?q=_id:707)
但是如果我想通過run collections的方式,一次讀出100天的數據呢?那就是從712開始,每次request遞增1。查詢100次。
借助於pre-request script我們可以很方便的實現這個需求。
首先,查看當前的環境變量,點擊右上角的眼睛圖標:
你可以看到自定義的SampleHost
和Globals
。
我們可以定一個global變量xhbxId
,用於自增。點擊上圖的Edit。或者點擊眼睛圖標旁的齒輪圖標,添加一個global變量:
然后,配置我們的request使用xhbxId
。點擊send,你會發現,能夠正確請求到id為707的數據:
點擊parameter下方的Pre-request scripts選項,編輯我們的腳本:
var temp = parseInt(postman.getGlobalVariable("xhbxId")); temp += 1; postman.setGlobalVariable("xhbxId", temp);
腳本的意思是給xhbxId
自增1。前面已經說過,pre-request script會在request被發送之前運行,所以,所以每次我們點擊send,xhbxId
都應該增加1。也就是下一次是708。
另外,這里要注意的是,所有的環境變量或者global變量,都是以字符串的形式存儲的,所以我們的自增操作需要先轉化為int。
運行結果如圖:
變化的request body
很多人也問我,request body的問題。其實和url參數一樣,直接引用就是了。
保持我們之前的Pre-request scripts不變。把request的類型改成POST,編輯我們的request body,使用{{xhbxId}}
的方式獲取參數。本次調用正確的遞增了Id為709。
3、test script
接下來,通過test script測試結果。保持我們之前的Pre-request scripts不變。如果再按一次send,則返回的結果中,應該包含如下字符串: "_id":"710"
那么,我們就應該在test script里面,測試response里面應該包含如上字符串。test script和pre-request script是一樣的,所以我們可以很方便的使用xhbxId
作為判斷的比較值。
var temp = postman.getGlobalVariable("xhbxId"); tests["Body matches string"] = responseBody.has("\"_id\":\""+temp+"\"");
具體操作如下圖:
- 選擇Tests
- 讀出xhbxId
- 放入response body: Contains strings的snippet
- 運行之后,test的結果是OK的,1/1
- 710被匹配上。
4、在test suite中運行
好了,准備好上面的條件,我們把test case保存到collection當中(我新建了一個叫test_script的collections,不知道怎么操作的話看我的教程2)。運行個100次。
測試通過,接口沒問題。這時,運行了100次,global的xhbxId應該從710增加到810了。
確實是這樣,postman正確運行。