国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Aest 功能強大的NodeJS Restful 接口測試工具

sihai / 820人閱讀

1. Aest

項目地址:https://github.com/wangduandu...

功能強大的REST接口測試工具, Power By Jest, axios, superstruct, mustache, lodash

2. 特點

非常簡單: 大部分工作量在于寫配置文件

請求模板: 可以在配置文件中加入運行時變量,如/users/{{id}}

響應體結構驗證: 支持對響應體的字段類型進行嚴格校驗,多字段、少字段、字段類型不符合預期都會報錯

非常詳細的報錯提示: 參見截圖

3. 安裝
yarn add aester
npm i aester -S
4. 使用 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 -D
4.4.1. 方法1

然后在package.json中加入如下字段

"test:report": "jest --reporters="jest-html-reporter""

然后運行

npm run test:report
4.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 test
5. 參看測試結果 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.864s
5.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. (test/index.test.js:20:1)
5.3. 接口返回響應體不符合預期測試結果

例如,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:29
6. 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. 測試Aester
npm test

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96817.html

相關文章

  • jest jenkins搭建自動化CI測試教程

    摘要:想做自動化接口測試時,我也按照打包鏡像的套路走,感覺走到死胡同。終于自己走通了一遍。點擊進去可以發現測試報告。注意測試報告并不是生成的。我的項目目錄如下最后如果你也需要自動化接口測試工具可以試試我最近寫的一個工具。 關于jest和jenkins集成,我走了一些彎路。之前一直用jenkins打包nodejs鏡像。想做nodejs自動化接口測試時,我也按照打包鏡像的套路走,感覺走到死胡同。...

    ztyzz 評論0 收藏0
  • 前后端分離模式

    摘要:采用前后端分離模式可以減后臺負擔,加快研發效率,當然,前提是前端能做好的話。還是基礎不夠導致的后端是否風格很多公司采用了前后端分離模式后,后端仍然采用以往的傳統風格,這是不合理的,風格的應該是前后端分離的最佳實踐。 showImg(https://segmentfault.com/img/bVFC8f?w=690&h=360);早期的web開發是不分前端后端的。互聯網進入Web2.0時...

    fobnn 評論0 收藏0
  • 前后端分離模式

    摘要:采用前后端分離模式可以減后臺負擔,加快研發效率,當然,前提是前端能做好的話。還是基礎不夠導致的后端是否風格很多公司采用了前后端分離模式后,后端仍然采用以往的傳統風格,這是不合理的,風格的應該是前后端分離的最佳實踐。 showImg(https://segmentfault.com/img/bVFC8f?w=690&h=360);早期的web開發是不分前端后端的。互聯網進入Web2.0時...

    DesGemini 評論0 收藏0
  • 前后端分離模式

    摘要:采用前后端分離模式可以減后臺負擔,加快研發效率,當然,前提是前端能做好的話。還是基礎不夠導致的后端是否風格很多公司采用了前后端分離模式后,后端仍然采用以往的傳統風格,這是不合理的,風格的應該是前后端分離的最佳實踐。 showImg(https://segmentfault.com/img/bVFC8f?w=690&h=360);早期的web開發是不分前端后端的。互聯網進入Web2.0時...

    whlong 評論0 收藏0
  • 4.3 路由設計/RESTful API-博客后端Api-NodeJs+Express+Mysql實

    摘要:路由設計路由設計以用戶注冊為例介紹如何閉環用戶注冊開發注意點使用郵箱注冊驗證郵箱是否注冊目前真實開發業務大部分都是手機號注冊,這塊由于沒有購買短信服務首先,在文件夾下新建上圖中對應真實業務邏輯現附上業務實現代碼加密國際化工具類用戶服務 路由設計 路由設計 以用戶注冊為例介紹如何閉環用戶注冊開發注意點:(1)使用郵箱注冊(2)驗證郵箱是否注冊 【目前真實開發業務大部分都是手機號注冊,這塊...

    1fe1se 評論0 收藏0

發表評論

0條評論

sihai

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<