PsotMan介紹和使用
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作為一個chrome的插件,你可以打開chrome,在chrome webstore里面找到。當然,如果是在國內,你需要翻牆,否則的話,你只能百度一下,搜索postman的安裝包自己安裝到chrome上。這里需要提一下的是,你可以不用打開chrome而直接使用Postman,具體的方法是:
選項->更多工具->擴展程序
詳細信息->創建快捷方式->‘全部勾上’
這樣你就可以在任何地方啟動你的Postman了
Postman sending requests
安裝好之后,我們先打開Postman,可以看到界面分成左右兩個部分,右邊是我們后頭要講的collection,左邊是現在要講的request builder。在request builder中,我們可以通過Postman快速的隨意組裝出我們希望的request。一般來說,所有的HTTP Request都分成4個部分,URL, method, headers和body。而Postman針對這幾部分都有針對性的工具。
URL
要組裝一條Request, URL永遠是你首先要填的內容,在Postman里面你曾輸入過的URL是可以通過下拉自動補全的哦。如果你點擊Params按鈕,Postman會彈出一個鍵值編輯器,你可以在哪里輸入URL的Parameter,Postman會幫你自動加入到URL當中,反之,如果你的URL當中已經有了參數,那Postman會在你打開鍵值編輯器的時候把參數自動載入
Headers
點擊’Headers’按鈕,Postman同樣會彈出一個鍵值編輯器。在這里,你可以隨意添加你想要的Header attribute,同樣Postman為我們通過了很貼心的auto-complete功能,敲入一個字母,你可以從下拉菜單里選擇你想要的標准atrribute
Method
要選擇Request的Method是很簡單的,Postman支持所有的Method,而一旦你選擇了Method,Postman的request body編輯器會根據的你選擇,自動的發生改變
Request Body
如果我們要創建的request是類似於POST,那我們就需要編輯Request Body,Postman根據body type的不同,提供了4中編輯方式:
- form-data
- x-www-form-urlencoded
- raw
- binary
(我們這里是可以傳文件的哦)
演示
我這里創建一條發送給google geocode的request,看看是啥結果:
注意,在URL里面我使用了變量googleMaps,並用{{}}調用它,這里是類似於AngulaJs的語法(果然是同一家人),其返回值是:http://maps.googleapis.com/maps/api/geocode/json。而這個變量我是定義在我的環境GoogleApiTest里面的。這部分的內容會在接下來的文章里面講到。
點擊了Send之后,可以在Postman上直接看到response的內容,內容很漂亮,Postman根據內容檢索自動按JSON的格式顯示出來,同時我們可以清楚的看到status code和花費的時間。
用PostMan進行測試
我們已經知道如何用Postman組裝並發送消息,那我們如何根據需求用Postman來做測試呢?在這開始之前,我們先來看看Postman的左邊面板:
這里包含了History和Collection,我們可以在History里面看到我們曾經發送過的HTTP Request, 我們可以很方便的通過點擊上面的項重新構建我們的request。而右邊的Request Builder面板上,還有兩個按鈕,Pre-request Script和Tests。
- Pre-request Script
定義我們在發送request之前需要運行的一些腳本,應用場景主要是設置全局變量和環境變量 - Tests
定義發送Request之后,需要用腳本檢測的內容,也就是Test case的內容。
這里的的Tests是我們關鍵。
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
Variables and Environment
另外,這里大家可以看到在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里面也是一樣的。這里就不贅述
Collection
定義好了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的.
用Postman生成Request代碼
Postman這款工具可以讓你很方便的測試你的Web API,那如果你實在是沒辦法用Postman,必須手寫代碼,又或者你有別的需求是Postman沒法實現的,你必須寫一個特殊的script或App來測試你的接口,那這時候是不是Postman就沒有用武之地了?
我來個你share一個小技巧吧,管不管用你說的算。
假設我現在要這樣來測我的接口:
我們要設置用戶名和密碼:
我們要設置參數和Header:
如果讓你寫代碼來生成這個HTTP Request是不是感覺有點麻煩? 如果你也是個懶人,就打開Postman,配好你想要的HTTP Request,然后點擊上圖中的Generate Code吧,在彈出的窗口里面,你可以看到這條Request在各種語言里面的對應寫法,比如Java OK HTTP:
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .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") .get() .addHeader("accept", "application/xml") .addHeader("cache-control", "no-cache") .addHeader("pragma", "text/cmd") .addHeader("postman-token", "6f00b02c-419f-9b98-f2d3-942ddd1ba081") .build(); Response response = client.newCall(request).execute();
比如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); });