1. Aest
項目地址:https://github.com/wangduandu...
功能強大的REST接口測試工具, Power By Jest, axios, superstruct, mustache, lodash
2. 特點非常簡單: 大部分工作量在于寫配置文件
請求模板: 可以在配置文件中加入運行時變量,如/users/{{id}}
響應體結構驗證: 支持對響應體的字段類型進行嚴格校驗,多字段、少字段、字段類型不符合預期都會報錯
非常詳細的報錯提示: 參見截圖
3. 安裝yarn add aester npm i aester -S4. 使用 4.1. 編寫測試用例
// filename 必須以 test.js結尾 const Ae = require("aester") var testData = require("./test-data.js") // 初始化配置文件 testData = Ae.init(testData) describe("4XX 5XX error response test", () => { test("Get User Info without sessionId", async () => { await expect(Ae.send(testData.getOneUser, {id: "1"})).rejects.toHaveProperty("status", 403) }) test("loginByEmail Fail Test", async () => { await expect(Ae.send(testData.loginByEmail, {password: "111"})).rejects.toHaveProperty("status", 401) }) }) describe("2XX success response test", () => { test("loginByEmail Success Test", async () => { // 對于符合預期的正向測試,不需要使用expect, 如果響應狀態碼是400以上,或者響應體結構不符合預期, // 該測試用例會自動失敗 const data = await Ae.send(testData.loginByEmail, {password: "000"}) Ae.share("sessionId", data.sessionId) }) test("Get User Info", async () => { await Ae.send(testData.getOneUser, {id: "1"}) }) }) describe("2XX success response with error body struct", () => { test("StructError test", async () => { var data = _.cloneDeep(testData.getOneUser) data.resBodyStruct.test = "number" // set a error struct await expect(Ae.send(data, {id: "1"})).rejects.toHaveProperty("type", "StructError") }) })4.2. 接口配置文件
// test-data.js module.exports = { $baseUrl: "http://localhost:3000", loginByEmail: { desc: "login", req: { method: "post", path: "/login", headers: { "content-type": "application/x-www-form-urlencoded" }, data: "email=wdd@cc.tt&password={{password}}", params: { _test: 1 } }, resBodyStruct: { sessionId: "string" } }, getOneUser: { desc: "get user info", req: { path: "/users/{{id}}", headers: { "sessionId": "{{sessionId}}" // 如果share中有sessionId, 在請求發送時,會自動將{{sessionId}}替換成真正的值,否則會被替換成空字符串 } }, resBodyStruct: { id: "string", email: "string", password: "string", userName: "string", likes: "array", isAdmin: "boolean" } }, createOneUser: { desc: "create user", req: { method: "post", path: "/users", headers: { "sessionId": "{{sessionId}}" } } }, updateOneUser: { desc: "update user", req: { method: "put", path: "/users/{{id}}", headers: { "sessionId": "{{sessionId}}" } } }, deleteOneUser: { desc: "獲取用戶信息接口", req: { method: "delete", path: "/users/{{id}}", headers: { "sessionId": "{{sessionId}}" } } } }4.3. 運行測試用例
在package.json加入
"scripts": { "test": "jest" }
然后運行npm test
4.4. 生成html測試報告yarn add jest-html-reporter -D4.4.1. 方法1
然后在package.json中加入如下字段
"test:report": "jest --reporters="jest-html-reporter""
然后運行
npm run test:report4.4.2. 方法2
創建jest.config.js在項目根目錄
module.exports = { verbose: true, testEnvironment: "node", reporters: [ "default", ["./node_modules/jest-html-reporter", { pageTitle: `operation api test ${process.env.testConfigEnv}`, includeFailureMsg: true // 詳細錯誤提示 }] ] }
然后運行
npm test5. 參看測試結果 5.1. 正常測試結果
PASS test/unit.test.js PASS test/index.test.js Test Suites: 2 passed, 2 total Tests: 8 passed, 8 total Snapshots: 0 total Time: 1.864s5.2. 接口報錯測試結果
"origin": "null", "readyState": 4, "requestBuffer": null, "requestCache": null, "responseBuffer": [Buffer], "responseCache": null, "responseHeaders": [Object], "responseTextCache": "Forbidden", "responseURL": "http://localhost:3000/users/1", "responseXMLCache": null, "send": true, "status": 403, "statusText": "Forbidden", "timeoutFn": null, "timeoutId": 0, "timeoutStart": 0, "totalReceivedChunkSize": 9, "uploadComplete": true, "uploadListener": false, }, }, "status": 403, "statusText": "Forbidden", } 18 | }) 19 | > 20 | test("Get User Info", async () => { | ^ 21 | await Ae.send(testData.getOneUser, {id: "1"}) 22 | }) 23 | at Env.it (node_modules/jest-jasmine2/build/jasmine_async.js:102:24) at Object.5.3. 接口返回響應體不符合預期測試結果(test/index.test.js:20:1)
例如,resBodyStruct配置sessionId為number格式,但是返回的格式是字符串,將會如下格式的報錯
TypeError: Expected a value of type `number` for `sessionId` but received `"123456"`. 60 | if (conf.resBodyStruct) { 61 | let Scheme = struct(conf.resBodyStruct) > 62 | let result = Scheme.validate(res.data) | ^ 63 | if (result.length === 1) { 64 | reject(result[0]) 65 | } at Function.Struct.validate.value [as validate] (node_modules/superstruct/src/superstruct.js:78:17) at src/index.js:62:296. Api 6.1. Aest.init(apiConfs)
初始化配置文件
const Ae = require("aester") ... var conf = Ae.init(apiConfs)6.2. Aest.send(apiConf, options)
發送請求。
options會與share合并,然后將對應變量渲染到請求模板中。
const Ae = require("aester") ... Ae.send(testData.getOneUser, {id: "1"}6.3. Aest.share(key, value)
設置共享變量
const Ae = require("aester") ... var conf = Ae.share("token", "123123")6.4. Aest.getShare()
獲取所有共享變量
const Ae = require("aester") ... var conf = Ae.getShare() // {token: "123123"}7. 配置文件說明
key | 必須? | 說明 |
---|---|---|
$baseUrl | 是 | 請求baseUrl |
desc | 否 | 接口說明
req | 是 | 請求對象
req.method | 否 | 請求方法,默認get
req.path | 是 | 請求路徑
req.headers | 是 | 默認為空對象,默認設置"content-type": "application/json; charset=UTF-8"
resBodyStruct | 否 | 響應體格式校驗對象
resBodyStruct字段說明
{ key: keyType }
字段類型支持如下
any: 任意
number: 數字
array: 數組
string: 字符串
boolean: 布爾值
null: null
undefined: undefined
object: 對象類型
在字段類型后加上?表示字段是否可選
如:
{ sessionId: "string?" //sessionId是字符串,但是可以沒有這個字段 }
更多字段類型驗證參考:https://github.com/ianstormta...
8. 測試Aesternpm test
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96817.html
摘要:想做自動化接口測試時,我也按照打包鏡像的套路走,感覺走到死胡同。終于自己走通了一遍。點擊進去可以發現測試報告。注意測試報告并不是生成的。我的項目目錄如下最后如果你也需要自動化接口測試工具可以試試我最近寫的一個工具。 關于jest和jenkins集成,我走了一些彎路。之前一直用jenkins打包nodejs鏡像。想做nodejs自動化接口測試時,我也按照打包鏡像的套路走,感覺走到死胡同。...
摘要:路由設計路由設計以用戶注冊為例介紹如何閉環用戶注冊開發注意點使用郵箱注冊驗證郵箱是否注冊目前真實開發業務大部分都是手機號注冊,這塊由于沒有購買短信服務首先,在文件夾下新建上圖中對應真實業務邏輯現附上業務實現代碼加密國際化工具類用戶服務 路由設計 路由設計 以用戶注冊為例介紹如何閉環用戶注冊開發注意點:(1)使用郵箱注冊(2)驗證郵箱是否注冊 【目前真實開發業務大部分都是手機號注冊,這塊...
閱讀 3159·2021-10-14 09:42
閱讀 3564·2019-08-26 13:56
閱讀 3444·2019-08-26 11:59
閱讀 938·2019-08-23 18:00
閱讀 2196·2019-08-23 17:51
閱讀 3522·2019-08-23 17:17
閱讀 1479·2019-08-23 15:11
閱讀 5145·2019-08-23 15:05