『政善治』Postman工具 — 9、在Postman中使用斷言

繁華似錦Fighting發表於2021-05-13

我們檢驗一個測試用例是否通過,一般會將我們心理預期的結果與實際結果進行比對,如果結果一致則證明測試通過,如果結果不一致,則證明測試不通過,這即是我們經常所說的斷言。

1、Tests的介紹

Postman中的斷言是使用請求後指令碼Tests,是對狀態碼、響應頭、響應正文等資訊進行斷言操作。

在Postman中封裝了我們常見的斷言程式碼片段,當然Tests除了可以作為斷言,還可以當做後置處理器。

經常應用於:

  1. 斷言。
  2. 獲取當前介面的響應資料,傳遞給下一個介面。

提示:在一個請求或者一個集合都可以定義Tests,在集合中定義Tests,表示集合中的每一個請求響應後,都需要執行Tests中的斷言指令碼。

點選請求中的Tests標籤項,如下圖:

image

我們可以在上圖看到,在Tests標籤頁的右側邊欄中,Postman為我們提供了一些常用的程式碼模版。

提示我們:

Test scripts are written in JavaScript, and are run after the response is received.
測試指令碼用JavaScript編寫,並在收到響應後執行。

Learn more about tests scripts
點選這裡,可以學習更多關於測試指令碼的資料。

學習關於Tests的更多用法,請進入後面連結:https://go.pstmn.io/docs-test-scripts

總結

(1)Postman測試沙箱的執行順序

  1. 在傳送Request之前,執行Pre-request Script中的js指令碼,可定製化Request(準備資料)。
  2. 收到Response之後,執行Tests中的指令碼,處理返回的資料(斷言或者處理資料)。

整個流大概是這樣的:

image

(2)Postman中Tests的作用

  1. 做斷言:可以斷言狀態碼或者斷言返回資料中的欄位。
  2. 取返回值:做流程介面的時候,向下傳遞返回資料。

2、常用SNIPPETS(片段)說明

(1)常用變數相關

  • Get an environment variable:獲取一個環境變數。
  • Get a gloval variable:獲取一個全域性變數。
  • Get a variable:獲取一個變數(本地)。
  • Set an environment variable:設定一個環境變數。
  • Set a global variable:設定一個全域性變數。
  • Clear an environment variable:清空一個環境變數。
  • Clear a global variable:清空一個全域性變數 。

使用

  • 獲取變數:如果在下一個請求中用到上一個請求的返回值,可以使用“設定一個環境變數”,將請求的返回值設定為環境變數,在下一個請求中,使用“獲取一個環境變數”取到該值。
  • 清空變數:這裡的清空等於刪除變數,一個引數使用完成後,需要刪除,或者清空值都可以使用該方法。

(同前一篇Pre-request Script的使用方式一樣)

(2)狀態碼相關

  • Status code: Code is 200 :判斷狀態碼是否正確;預設判斷狀態是否為 200, 可修改。
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    
  • Status code:Successful POST request
    判斷狀態碼是否為預期結果之一;比如預設斷言狀態碼是否是 201, 202 中的一個。
    pm.test("Successful POST request", function () {
        pm.expect(pm.response.code).to.be.oneOf([201, 202]);
    });
    
  • Status code:Code name has string
    判斷狀態碼描述是否包含字串,比如是否包含 Created。
    pm.test("Status code name has string", function () {
        pm.response.to.have.status("Created");
    });
    

(3)響應結果斷言:

  • Response body: Contains string
    響應結果是否包含字串;
    注意:這隻能檢查Response body中raw格式展示的返回資料,如果raw格式展示的返回資料中,有中文資料未解碼,也只能匹配未解碼形式的內容,且匹配包含不唯一(工作中很少見,一般介面返回資料中不會設計重複欄位)。
    pm.test("Body matches string", function () {
        // 比如raw中的資料,“學院”沒有進行Unicode解碼,就只能如下方式進行比對。
        pm.expect(pm.response.text()).to.include("例如:\u5b66\u9662");
    });
    
  • Response body: JSON value check
    響應結果如果是 JSON格式的資料,檢查具體的 JSON欄位的值;
    實際工作中基本就用這個方式。(下面有練習好好看看)
    pm.test("Your test name", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData.value).to.eql(100);
    });
    
  • Response body: Is equal to a string
    響應結果與字串是否全部匹配預期的字串;
    就是在把Response body的資料用raw格式展示,然後全部複製到下面位置。
    pm.test("Body is correct", function () {
        pm.response.to.have.body("raw格式展示的返回資料,全部複製到這裡");
    });
    
  • Response body: Convert XML body to a JSON Object
    將 XML 轉換成 JSON;
    var jsonObject = xml2Json(responseBody);
    

等等還有很多,用的時候我們可以檢視相關文件。

(4)Header :

Response headers:Content-Type header check
響應頭部中是否包含欄位,程式碼片段如下:

pm.test("Content-Type is present", function () {
    pm.response.to.have.header("Content-Type(這裡填寫請求頭屬性)");
});

(5)響應速度:

Response time is less than 200ms
響應時間是否少於多少 ms。

pm.test("Response time is less than 200ms", function () {
    pm.expect(pm.response.responseTime).to.be.below(200);
});

3、示例

(1)響應碼斷言

我們以“新增學院測試為例”

1)準備資料

Pre-request Script編輯如下程式碼,來準備資料

// 隨機生成一個3位數字的id
var dep_id = Math.floor(Math.random()*1000);
pm.environment.set("depid" , dep_id); //設定到環境變數中

// 隨機生成學院名稱dep_name
// 隨機生成一個10位的字串
var data = Math.random().toString(36).slice(-10) ;
var dep_name = data+"學院";
pm.environment.set("dep_name" , dep_name);//設定到環境變數中

// 隨機生成院長的名字
var first_name = ["趙","錢","孫","李","劉"];
var last_name = ["子鼠","丑牛","寅虎","牟兔","辰龍","巳蛇"];
var master_name = first_name[Math.floor(Math.random() * (first_name.length))] +last_name[Math.floor(Math.random() * (last_name.length))];
pm.environment.set("master_name" , master_name);//設定到環境變數中

// 隨機生成口號
var slogan_str = ["吃飯","睡覺","打豆豆"];
var slogan = slogan_str[Math.floor(Math.random() * (slogan_str.length))];
pm.environment.set("slogan" , slogan);//設定到環境變數中


// 很low的程式碼,只做練習

2)編輯請求所要提交的資料

image

3)編寫Tests中的斷言

使用Tests中的Status code: Code is 200內建程式碼片段。

// 用來斷言介面請求的狀態碼,針對HTTP協議狀態碼。
// pm.test 表示Postman進行測試斷言
// "Status code is 200" 表示斷言的名稱或者說明,一般和測試用例同名
// function 表示 執行斷言的方法
pm.test("新增學院請求正常放回201", function () {
    pm.response.to.have.status(201);
});

4)檢視斷言結果

如下圖:

image

提示:

Test Results(1/1):表示一共有1個斷言,執行通過了1個斷言。

All:表示顯示所有斷言。

Passed:表示只顯示通過的斷言。

Skipped:表示只顯示跳過的斷言。

Failed:表示只顯示失敗的斷言。

當我們斷言執行失敗時,也會有詳細提示,如把上面的狀態碼改成202。

image

AssertionError: expected response to have status code 202 but got 201

AssertionError:預期響應的狀態碼為202,但得到201。

(2)返回值斷言(非常頻繁)

返回值斷言,就是對介面返回的資料(body主體)中的欄位進行驗證。

以返回值為json格式的資料為例:

這裡先標識一下,介面的實際返回結果如下:

{
    "create_success": {
        "count": 1,
        "results": [
            {
                "dep_id": "637",
                "dep_name": "k7iwvtgk2h學院",
                "master_name": "李子鼠",
                "slogan": "睡覺"
            }
        ]
    },
    "already_exist": {
        "count": 0,
        "results": []
    }
}

同上面練習,直接編寫Tests中的斷言,

使用Tests中的Response body: JSON value check內建程式碼片段。

// 斷言返回值為json格式的資料
// pm.test 表示Postman進行測試斷言
// "Your test name" 表示斷言的名稱或者說明,一般和測試用例同名
// function 表示 執行斷言的方法
// jsonData 表示介面返回的所有資料
// pm.expect 表示設定斷言的預期
// jsonData.value 表示取具體的某一欄位,一級一級點下去就可以(層級關係)
pm.test("斷言新增學院數量", function () {
    var jsonData = pm.response.json(); // 獲取返回值所有資料
    pm.expect(jsonData.create_success.count).to.eql(1); // 斷言返回值中具體欄位的值
});

然後執行並檢視結果:

image

說明

如果結果返回的json資料中有陣列,如下:我們要取slogan欄位

{
    "create_success": {
        "count": 1,
        "results": [
            {
                "dep_id": "637",
                "dep_name": "k7iwvtgk2h學院",
                "master_name": "李子鼠",
                "slogan": "睡覺"
            }
        ]
    },
    "already_exist": {
        "count": 0,
        "results": []
    }
}

需要如下方式進行選取:

pm.test("斷言新增學院的口號", function () {
    // 獲取返回值所有資料,賦值給jsonData
    var jsonData = pm.response.json(); 
    // 可以使用console.log在控制檯輸出內容,進行除錯
    // console.log(jsonData.create_success.results[0].slogan)
    // 斷言返回值中具體欄位的值
    pm.expect(jsonData.create_success.results[0].slogan).to.eql("哈哈哈"); //這裡是重點
});

其他程式碼片段使用方式同理,這裡就不一一舉例了。其實Tests中編寫的就是JavaScript指令碼,你也可以編寫迴圈、判斷、輸出到控制檯等程式碼。

相關文章