Postman API 接口測試##
Postman 是一款非常實(shí)用的接口測試工具。它有三大主要功能:模塊請求、工作空間贯吓、接口自動測試等。當(dāng)然蜀变,還有其他功能。
官網(wǎng)地址:https://www.getpostman.com
最新的 Postman 版本為 6介评。以下所有的文檔都將基于 Postman 6 版本進(jìn)行講解库北。
1 工作空間 Workspaces
1.1)工作空間介紹
如圖所示爬舰,中間頂部點(diǎn)擊 "My Workspaces" 會展示工作空間的管理彈窗。它有一個(gè)默認(rèn)的工作空間:My Workspace寒瓦。我們所有的接口的模擬請求都是基于工作空間為單位進(jìn)行管理情屹。工作空間最大的作用就是用來區(qū)分不同的項(xiàng)目。因?yàn)樵友煌墓ぷ骺臻g可以單獨(dú)設(shè)置各自的環(huán)境變量以及全部變量垃你。后面我們在講變量的時(shí)候會介紹。
1.2)創(chuàng)建新的工作空間
如圖所示喂很,我們可以點(diǎn)擊 "Create New" 創(chuàng)建新的工作空間惜颇。非常方便,這里就不再展示講解少辣。
我創(chuàng)建了一個(gè)新的工作空間:混時(shí)間凌摄。
如果想把當(dāng)前工作空間從 "My Workspace" 切換到新的工作空間 "混時(shí)間",只需要點(diǎn)擊 "混時(shí)間即可"漓帅。
1.3)編輯/刪除工作空間
在 Postman 客戶端當(dāng)中锨亏,是不能對工作空間進(jìn)行編輯與刪除的。必須忙干,通過旁邊的 "Manage" 進(jìn)入 Postman 的 Web 管理后臺進(jìn)行操作器予。所以,這里需要我們注冊并登錄一個(gè)賬號捐迫。
點(diǎn)擊上圖中的 "Manage" 會進(jìn)到如下界面:
上圖當(dāng)中的每個(gè)工作空間右邊都有一個(gè) "..." 的按鈕乾翔。點(diǎn)擊之后,會展開弓乙。里面有對當(dāng)前工作空間的操作末融。如下圖所示 :
圖上一目了然,我們就不對它進(jìn)行深入的講解了暇韧。
2 接口收藏夾 Collections
我在第 1 節(jié)當(dāng)中勾习,我們講了工作空間。這一小節(jié)我們講接口收藏夾懈玻。我們所有的接口模擬請求都必須放到收藏夾當(dāng)中巧婶。所以,我們在講解創(chuàng)建接口模擬請求之前涂乌,先講收藏夾艺栈。
2.1)創(chuàng)建收藏夾
創(chuàng)建收藏夾非常簡單,點(diǎn)擊下圖當(dāng)中紅框的按鈕湾盒,就會彈出新加收藏夾的彈框湿右。
彈框如下:
收藏夾的名字,可以是你想要的任何名字罚勾。你可以對這個(gè)集合添加任何想要的描述毅人。
上圖當(dāng)中吭狡,有 5 個(gè) Tab。每個(gè) Tab 意義都非常之重要丈莺。
Description:收藏夾描述划煮。
Authorization:我們有一些接口,在請求的時(shí)候需要在 Header 頭當(dāng)中增加一個(gè)密鑰或賬號密碼進(jìn)行請求驗(yàn)證缔俄。這個(gè)時(shí)候弛秋,我們就可以通過這個(gè)選項(xiàng)給我們收藏夾當(dāng)中所有的接口一個(gè)默認(rèn)設(shè)置。如果某個(gè)接口不一樣俐载⌒仿裕可以在具體的接口請求的 Authorization 當(dāng)中覆蓋它即可。
Pre-request Scritps:每個(gè)接口在請求之前都會調(diào)用這個(gè)選項(xiàng)當(dāng)中的代碼瞎疼。每個(gè)接口都會繼承它科乎。
Tests:這里設(shè)置的請求結(jié)果驗(yàn)證代碼,會在收藏夾下每個(gè)請求的 Tests 執(zhí)行完之后再調(diào)用贼急。
Variables:在這里創(chuàng)建的所有變量茅茂,都可以在這個(gè)收藏夾下的所有請求當(dāng)中使用媒吗。與環(huán)境變量券敌、全局變量不同。
創(chuàng)建好之后肺孵,會在左側(cè)顯示出來走敌。如圖所示:
2.2)收藏夾編輯/刪除/復(fù)制
這個(gè)操作太簡單碴倾。通過點(diǎn)擊紅框就能知道如何操作了。
3 模擬 API 接口請求
3.1)GET 請求
通常我們只需要在填寫一個(gè)要請求的 URL 地址掉丽,然后請求就可以了跌榔。如果需要設(shè)置驗(yàn)證頭的話〈氛希可以通過提供的 "Authorization" 搞定即可僧须。如果,還需要加入一些 Header 頭來模擬不同的瀏覽器项炼,也是可以的担平。如下圖:
我們輸入了一個(gè)百度的 URL 地址。然后锭部,Ctrl + S 保存這個(gè)接口到我們剛剛創(chuàng)建的收藏夾當(dāng)中暂论。此時(shí)會彈框讓他們對這個(gè)請求填寫一個(gè)名稱和說明。如下圖所示:
圖中紅框位置拌禾,是讓我們選擇一個(gè)收藏夾把這個(gè)模擬請求添加進(jìn)去取胎。保存之后,會在左側(cè)的收藏夾當(dāng)中顯示在下方湃窍。
既然現(xiàn)在有了接口之后扼菠,我們只需要點(diǎn)擊 "Send" 按鈕即可發(fā)送請求摄杂。
通過上圖這個(gè)界面坝咐,我們可以清晰知道響應(yīng)的 Body 內(nèi)容循榆、Cookie、Header墨坚、以及我們運(yùn)行 Tests 之后的測試結(jié)果 Test Results秧饮。除此之外,我們還知道 Http Status 狀態(tài)碼泽篮、請求花費(fèi)時(shí)間盗尸、整個(gè)響應(yīng)的包大小。
關(guān)于這塊可以通過 HTTP 協(xié)議帽撑,可以更加明白這些數(shù)值的含義泼各。這里只對 Postman 工具的使用進(jìn)行講解。不對 HTTP 協(xié)議進(jìn)行深入的說明亏拉。
3.2)POST 請求
創(chuàng)建一個(gè)新的模擬請求非常簡單扣蜻。點(diǎn)擊 Tab 選擇項(xiàng)卡的 "+" 按鈕即可打開一個(gè)新的創(chuàng)建界面。
POST 請求只需要將 GET 切換為 POST 即可及塘。非常簡單莽使。在 GET 請求時(shí),Body 是不能進(jìn)行任何操作的笙僚。POST 的時(shí)候才可以芳肌。如下圖所示:
此時(shí),假設(shè)我們的接口地址是如圖所示肋层,我們可以對這個(gè)接口發(fā)送兩個(gè)參數(shù)亿笤。
3.3)文件上傳請求
在我們的 Web 應(yīng)用當(dāng)中,經(jīng)常會要求上傳圖片或其他文件之類的工作栋猖。所以净薛,模擬文件上傳也是一個(gè)必備的技能。
文件上傳依然是一個(gè) POST 類型的請求掂铐。只是在添加請求參數(shù)的時(shí)候罕拂,參數(shù)的右邊我們把 Text 切換為 File 即可。這樣全陨,參數(shù)的值選項(xiàng)框就會變成一個(gè)文件上傳控件爆班。
上圖所示,我們已經(jīng)成功把圖片上傳到了我們的服務(wù)器辱姨。并且柿菩,服務(wù)器響應(yīng)了圖片的細(xì)節(jié)信息。
3.4)Cookie 設(shè)置
有時(shí)候雨涛,我們需要向我們的請求當(dāng)中枢舶,添加 Cookie懦胞。添加 Cookie 非常簡單。每個(gè)請求的右側(cè)有一個(gè) Cookies 的按鈕凉泄。點(diǎn)擊進(jìn)入就可以添加各種 Cookie躏尉。注意:添加的時(shí)候,一定要仔細(xì)填寫 Cookie 生效的域名后众。使用的時(shí)候胀糜,每個(gè)請求會自動根據(jù)請求的域名去搜尋 Cookie。然后蒂誉,自動將 Cookie 上傳教藻。
相關(guān)截圖如下:
相關(guān) Cookie 的添加刪除修改一目了然,這里就不再進(jìn)行贅述右锨。
3.5)raw 請求
raw 的含義是未加工的括堤。在我們的 HTTP 協(xié)議當(dāng)中就是原始字符串。不是已知標(biāo)準(zhǔn)的 HTTP 協(xié)議定的格式绍移。也就是說悄窃,我們可以上傳任何與服務(wù)器端約定的格式。我們按照約定的格式進(jìn)行封裝/解析登夫。
那么服務(wù)器端是 PHP 語言的話广匙,那么要接收這個(gè)數(shù)據(jù)就不能通過常規(guī)的 _POST 等超全局?jǐn)?shù)據(jù)接收。必須通過如下代碼才能正確接收:
$data = file_get_contents("php://input");
3.6)其他類型的請求
目前最常見的只有 GET恼策、POST 請求鸦致。所以,關(guān)于向其他的 PUT涣楷、DELETE分唾、HEAD 類型的請求。百度一下就很容易進(jìn)行操作了狮斗。非常之簡單绽乔。
這些類型,在一些大型的標(biāo)準(zhǔn)的 RESTFul 應(yīng)用當(dāng)中會涉及到碳褒。
4 Postman 變量的應(yīng)用
我們在本地測試過程中折砸,經(jīng)常會遇到如下幾種場景:
場景一:接口之間依賴。比如:用戶詳情接口依賴登錄接口沙峻。
場景二:賬號密碼在多處使用睦授。比如,登錄/更換手機(jī)號/修改登錄密碼摔寨。
諸如此類場景去枷,我們總不能在每個(gè)接口的時(shí)候?qū)懰腊伞1热纾謾C(jī)號更換成功之后删顶,下次該接口再更換手機(jī)號竖螃,就已經(jīng)不是最初的手機(jī)號。這樣每次模擬請求這個(gè)接口逗余,都得手動修改這個(gè)值特咆。多麻煩。我們要實(shí)現(xiàn)高階的自動化測試猎荠,解放我們的雙手坚弱,節(jié)約我們的時(shí)間。這顯示是不可取的关摇。
接下來,我們就一起來通過 Postman 提供的變量機(jī)制解決此類問題碾阁。
4.1)環(huán)境變量設(shè)置
見名知義输虱。環(huán)境變量就是針對我們不同的開發(fā)環(huán)境或者自己定義的環(huán)境,定義不同的變量脂凶。比如宪睹,在本地環(huán)境,我們的 username 等于 winerQin蚕钦,在線上開發(fā)環(huán)境亭病,我們的 username 等于 test。通過嘶居。切換不同的環(huán)境罪帖,變量值自動切換。
上圖當(dāng)中邮屁,左邊的紅框會顯示當(dāng)前我們創(chuàng)建的所有環(huán)境整袁。右邊的紅框是設(shè)置環(huán)境變量的按鈕。我們點(diǎn)擊進(jìn)去設(shè)置環(huán)境變量佑吝。
如圖所見坐昙,我已給創(chuàng)建了 5 個(gè)環(huán)境。local - 本地芋忿、dev - 開發(fā)炸客、pre - 預(yù)發(fā)布、beta - 公測戈钢、 pro - 正式痹仙。當(dāng)然,這些名字你可以自己定義逆趣。只要能代表你心中對這個(gè)環(huán)境的定義即可蝶溶。
如果,你想添加一個(gè)新的環(huán)境,通過上圖當(dāng)中右下角的 "And" 按鈕即可進(jìn)入創(chuàng)建并為這個(gè)環(huán)境添加環(huán)境變量抖所。
上圖所示梨州,我們給開發(fā)環(huán)境定義了一個(gè) api_url 的變量。
值為:http://api.dev.phpjieshuo.com田轧。
我們每個(gè)環(huán)境都應(yīng)該設(shè)置這樣一個(gè)變量暴匠。因?yàn)椋總€(gè)環(huán)境的接口請求地址不一樣傻粘。
4.2)環(huán)境變量使用
我們現(xiàn)在有了環(huán)境變量每窖,那么肯定就有使用得到它的地方。如下圖所示:
環(huán)境變量可以在上圖紅框當(dāng)中使用弦悉。當(dāng)然窒典,使用的地方并不局限于這里。大家可以自己嘗試在不同的可輸入值的地方如此使用驗(yàn)證稽莉∑僦荆總之,變量的使用必須用兩對花括號包起來就行了污秆。如果劈猪,這個(gè)變量不存在,那么它會變成紅色良拼。如下圖所示:
在后面的測試小節(jié)战得,我們再深入講解環(huán)境變量通過 Postman 提供的方法來讀取。
4.3)全局變量的設(shè)置
所謂全部變量是相對于環(huán)境變量而言庸推。環(huán)境變量是通過切換不同環(huán)境而得到不的變量值常侦。而全部變量在所有的環(huán)境當(dāng)中值都是一樣的。
沒錯予弧。還是這個(gè)按鈕刮吧。跟環(huán)境變量一樣,都是在這里進(jìn)行管理掖蛤。
點(diǎn)擊這個(gè)按鈕之后彈出的框下面有一個(gè)按鈕 "Globals" 杀捻。此時(shí)彈出的框就是全局變量設(shè)置的框了。
如下圖所示蚓庭,我設(shè)置了一大堆的全局變量
全局變量的用法與環(huán)境變量的用法一致致讥。當(dāng)全局變量與環(huán)境變量同時(shí)存在一個(gè)同名的變量時(shí)。環(huán)境變量的值會覆蓋全局變量的值器赞。也就是說垢袱,環(huán)境變量的值優(yōu)先級最高。
4.3)查看當(dāng)前所有的變量
如圖所示港柜,通過截圖的眼睛圖標(biāo)请契,我們可以查看當(dāng)前的環(huán)境變量與全局變量咳榜。
5 接口分組
接口分組有利于我們很好管理接口∷叮可以把相似的接口按照功能進(jìn)行劃分在不同分組當(dāng)中涌韩。
如圖所示:
創(chuàng)建分組其實(shí)很簡單。如下圖所示:
更改分組的名稱或刪除分組氯夷,同樣很簡單臣樱。只需要在分組的名稱上面右鍵就會顯示出刪除的按鈕。
6 收藏夾導(dǎo)入導(dǎo)出
一個(gè)項(xiàng)目通過是由多個(gè)模塊組成腮考,每個(gè)模塊有相應(yīng)的開發(fā)人員雇毫。那么,這時(shí)候每個(gè)開發(fā)人員把自己所屬模塊創(chuàng)建了模擬請求踩蔚。那么棚放,導(dǎo)出功能就能很好地與各自分享。
6.1)導(dǎo)出
導(dǎo)出功能很簡單寂纪。選擇對應(yīng)的收藏夾的更多按鈕席吴。在里面點(diǎn)擊 "Export" 即可。
6.2)導(dǎo)入
導(dǎo)入也是相當(dāng)簡單捞蛋,在 Postman 左上角有一個(gè) "Import" 按鈕。把導(dǎo)出的文件導(dǎo)入即可柬姚。
7 Run Collections
Run Collections 可以理解為自動運(yùn)行收藏夾當(dāng)中的接口請求拟杉。
這個(gè)按鈕會彈出一個(gè)界面。
在這個(gè)界面當(dāng)中量承,我們可以選擇要自動運(yùn)行哪個(gè)收藏夾的接口請求搬设。也可以指定某個(gè)收藏夾下的某個(gè)分組的接口請求。
然后撕捍,可以選擇以哪個(gè)環(huán)境運(yùn)行這個(gè)些請求拿穴。以及上一個(gè)接口請求與下一個(gè)接口請求之間間隔多久時(shí)間。設(shè)置完成之后忧风,直接點(diǎn)擊 "Start Run" 即可開啟自動運(yùn)行默色。會在右側(cè)顯示運(yùn)行的結(jié)果
如下圖所示:
8)Tests
Tests 是我們在每個(gè)模擬的請求當(dāng)中,有一個(gè) Tests 的選項(xiàng)當(dāng)中設(shè)置的響應(yīng)結(jié)果驗(yàn)證代碼狮腿。
// [1] 讀取環(huán)境變量值
var api_url = pm.environment.get('api_url');
console.log(api_url);
// [2] 設(shè)置一個(gè)環(huán)境變量值
pm.environment.set('temp_value', '俺是一個(gè)臨時(shí)環(huán)境變量,待會就會刪除');
// [3] 刪除一個(gè)環(huán)境變量值
pm.environment.unset('temp_value');
// [4] 讀取全部變量值
var longitude = pm.globals.get('longitude');
console.log("longitude::get::" + longitude);
// [5] 設(shè)置一個(gè)全部變量值
pm.globals.set('longitude', 113.336666);
console.log("longitude::get::" + pm.globals.get('longitude'));
// [6] 刪除一個(gè)全部變量值
pm.globals.unset('longitude');
pm.globals.set('longitude', 0);
// [7] 無差別訪問全局與環(huán)境變量腿宰。環(huán)境變量值優(yōu)先級高于全局變量值。
var mobile = pm.variables.get('mobile');
console.log("mobile:" + mobile);
// [8] 取請求返回的數(shù)據(jù)
var jsonData = pm.response.json();
// [9] 驗(yàn)證返回的結(jié)果中的 code 值是否為期望的 200
pm.test("響應(yīng)結(jié)果是否為:200", function () {
pm.expect(jsonData.code).to.eql(200);
});
// [10] 如果響應(yīng)的結(jié)果為 200 則把 token 值設(shè)置到全局配置中
if (jsonData.code == '200') {
var token = jsonData.data.token;
pm.globals.set("token", token);
}
// [11] 驗(yàn)證響應(yīng)的頭信息當(dāng)中是否包含 Content-Type
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
// [12] 驗(yàn)證響應(yīng)的頭信息當(dāng)中是否包含 Access-Control-Allow-Origin
pm.test("Access-Control-Allow-Origin is present", function () {
pm.response.to.have.header("Access-Control-Allow-Origin");
});
// [13] 驗(yàn)證請求成功花費(fèi)時(shí)間是否超過 300 ms
pm.test("Response time is less than 300ms", function () {
pm.expect(pm.response.responseTime).to.be.below(300);
});
// [14] 驗(yàn)證響應(yīng)的狀態(tài)碼是否為 200
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
// [15] 驗(yàn)證響應(yīng)結(jié)果里面是否包含期望的值
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("token");
});
// [16] 驗(yàn)證響應(yīng)結(jié)果是否等于其他的值
pm.test("Body is correct", function () {
pm.response.to.have.body("xxxxx");
});
// [17] 發(fā)送一個(gè)請求
pm.sendRequest(pm.variables.get('api_url'), function (err, response) {
console.log(response.text());
});
// [18] 驗(yàn)證規(guī)則使用
var schema = {
"items": {
"type": "string"
}
};
var data1 = [true, false];
var data2 = [true, 123];
pm.test('Schema is valid', function() {
pm.expect(tv4.validate(data1, schema)).to.be.true;
pm.expect(tv4.validate(data2, schema)).to.be.true;
console.log("Validation failed: ", tv4.error);
});
以上代碼大家可以通過在 Tests 當(dāng)中使用驗(yàn)證理解其用法缘厢。
驗(yàn)證的結(jié)果當(dāng)中 "Test Results" 會顯示當(dāng)前有多少個(gè)驗(yàn)證吃度,成功多少個(gè)。PASS 代表驗(yàn)證過的項(xiàng)贴硫。FAIL 代表驗(yàn)證失敗的薦椿每。
關(guān)于這塊的高級驗(yàn)證,大家可以通過官網(wǎng)提供的文檔進(jìn)行研究使用。這里僅拋磚引玉间护。
9)結(jié)后語
關(guān)于 Postman 的 API 接口測試的講解就到這里了亦渗。Postman 的功能并不僅僅如我上面講到的這些。它還有很多更高級的功能兑牡。大家可以通過官方文檔研究使用央碟。如本文存在不足或錯誤之后,可以跟我溝通修正均函。