本文將以一款超簡單的博客應用爲例子,介紹如何使用 Htte 進行 API 接口的自動化測試。git
Htte 是一款自動化測試框架 是一款自動化測試框架。它容許你使用 YAML 編寫測試,不須要編寫代碼。 難度低,上手快。github
編寫一個測試就是羅列出請求數據以及預期的響應數據。htte 會自動爲你生成請求,並驗證響應數據是否匹配預期。npm
它提供插件,沒有什麼數據是生成和表示不了的,沒有什麼數據是沒法校驗和比對的,沒有什麼場景是測試不了。json
接口自動化測試中,測試中使用來自其它測試的數據一直是難言的痛。Postman 經過環境變量處理這個問題,繁瑣又容易出錯,Htte 創新獨到
地採用會話和路徑引用數據處理這個問題,安全而簡便。api
Htte 是一款優秀的接口自動化測試工具,值得你們一試。數組
使用 npm 安裝 htte 命令行:安全
npm i -g htte
有這樣一款超簡單的博客應用。它只有四個接口。app
功能: 用戶登陸 請求路徑: localhost:3000/login 請求方法: POST 請求頭: { "Content-Type": "application/json" } 請求數據: {"username": "john", "password": "johnsblog"} 響應: - 情況: 用戶名和密碼正確 響應狀態碼: 200 響應數據: {"name": "john", "token": "..."} - 情況: 用戶名或密碼不正確 響應狀態碼: 401 響應數據: {"errcode": 11001, "message": "invalid username or password"}
功能: 添加博文 請求路徑: localhost:3000/articles 請求方法: POST 請求頭: { "Content-Type": "application/json", "Authorization": "Bearer ..." } 請求數據: > { "title": "How to use htte", "content": "htte is ....", "tags": ["howto", "htte"] } 響應: - 情況: 添加成功 響應狀態碼: 200 響應數據: > { "title": "How to use htte", "slug": "how-to-use-htte-A43bcF", "content": "htte is ....", "tags": ["howto", "htte"], "createdAt": "2018-04-28T07:35:08.471Z" }
功能: 編輯博文 請求路徑: localhost:3000/article/how-to-use-htte-A43b 請求方法: PUT 請求頭: { "Content-Type": "application/json", "Authorization": "Bearer ..." } 請求數據: > { "title": "How to create htte plugin", "content": "htte plugin is ....", "tags": ["howto", "htte", "plugin"] } 響應: - 情況: 編輯成功 響應狀態碼: 200 響應數據: > { "title": "How to use htte plugin", "slug": "how-to-use-htte-A43b", "content": "htte plugin is ....", "tags": ["howto", "htte", "plugin"], "createdAt": "2018-04-28T07:35:08.471Z" }
功能: 獲取全部博文 請求路徑: localhost:3000/articles 請求方法: GET 請求頭: { "Content-Type": "application/json", "Authorization": "Bearer ..." } querystring: tag=howto 響應: - 情況: 成功 響應狀態碼: 200 響應數據: { "articlesCount": 1, "articles": [ { "title": "How to use htte plugin", "slug": "how-to-use-htte-A43b", "content": "htte plugin is ....", "tags": ["howto", "htte", "plugin"], "createdAt": "2018-04-28T07:35:08.471Z" } ] }
添加配置文件 .htte.yaml
,描述接口框架
url: http://localhost:3000 type: json # 使用 json 解壓縮請求響應數據 apis: login: method: post uri: /login createArticle: method: post uri: /articles updateArticle: method: put uri: /article/{slug} listArticles: /articles
添加測試文件 blog.yaml
,編寫測試。工具
units: - describe: 登陸失敗 api: login req: body: username: john password: johnblog res: status: 401 body: errcode: 11001 message: !@exist
describe
描述測試的目的,該字段會在最好的測試報告中呈現。
api
描述被測試的接口,該字段關聯配置文件中的接口定義。
req
定義請求數據, body
下的數據會封裝到請求體 {"username": "john", "password": "johnblog"}
。
res
指望響應數據。若是與實際響應數據不匹配,會致使測試不經過。
當 htte 載入這段測試代碼,會構造請求,也就是會往 http://localhost:3000/login
發送 post
請求,
有請求頭 {"Content-Type": "application/json"}
, 及請求體 {"username": "john", "password": "johnblog"}
。
當服務端響應後,會對響應的數據做以下斷言
errcode
和 message
errcode
屬性值爲 11001message
屬性值爲 invalid username or password
因此斷言所有經過,測試纔會經過。如響應狀態碼不爲 401 或者響應體中多了其它其它字段,都是不徹底匹配,會致使測試失敗。
- describe: 登陸成功 api: login name: johnLogin req: body: username: john password: johnsblog res: body: username: john token: !@exist
name
定義測試名稱,後續測試能夠經過該名稱訪問該 測試數據,好比響應的 token
值。
res
中省略了 status
,並不表明不檢查狀態碼了。對於這種狀況 htte 會檢查是否狀態碼在 200-299 範圍內。
token
的值是變更的,咱們檢查其具體值。因此使用 YAML 標籤 !@exist
進行一種特殊的檢查。其驗證 token
字段存在,不校驗其具體值。
!@exist
由 htte 插件提供。在只關注字段有無而不在乎值的狀況下使用。
- describe: 添加博文成功 api: createArticle name: articleUsehtte req: headers: Authorization: !$concat ['Bearer', ' ', !$query $$johnLogin.res.body.token] body: title: How to use htte content: htte is http automation testing tool tags: - howto - htte res: body: title: How to use htte slug: !@regexp /^how-to-use-htte/ content: htte is http automation testing tool tags: - howto - htte createdAt: !@exist
headers
描述請求頭。它將向發送的請求頭中追加 Authorization
頭。
添加博文接口會進行 JWT 權限校驗,所以咱們須要添加 Authorization
頭,提供登陸 token
。
這個 token
能夠從測試 johnLogin
中獲取。咱們經過標籤 !$query
引用這個 token
值。
htte 會經過會話記錄運行過的測試的請求和響應數據,你能夠這種方式獲取位於你前面的測試的數據。不須要預先定義,只須要定位(訪問路徑)。
而後使用標籤 !$concat
拼接 Bearer
和 token
值獲得 Authorization
的具體值。
slug
表示博文的訪問連接,經過 title 拼接一個 4 個字符的隨機字符串生成。它也不是一個具體值,因此咱們使用 !@regexp
進行正這而匹配驗證。
大多狀況下,測試的請求數據及預期響應數據是能夠給定的,但總免不了會碰到一些特殊情況,這是就須要使用插件了。htte 許多內置插件,它們
應該足夠應對絕大多數常見了。若是碰到沒法處理的狀況,能夠發 issue 或編寫插件。
- describe: 編輯博文成功 api: updateArticle req: headers: Authorization: !$concat ['Bearer', ' ', !$query $$johnLogin.res.body.token] params: slug: !$query $$articleUsehtte.res.body.slug res: body: title: How to use htte plugin slug: !@query $$$req.params.slug content: htte plugin is flexiabe tags: - howto - htte - plugin createdAt: 2018-04-28T07:35:08.471Z
params
描述路徑參數,該測試的請求路徑是 /article/{slug}
,帶有路徑參數 slug,
發送請求前 htte 會將替換成 params
中對應的值,最終的請求路徑是 /article/how-to-use-htte-A43bcF
!@query
標籤檢驗響應值是否某個引用值相等,用來判斷更新文章或 slug 是否改變。
- describe: 獲取個人全部博文 api: listArticles req: headers: Authorization: !$concat ['Bearer', ' ', !$query $$johnLogin.res.body.token] res: body: articlesCount: !@exist articles: !@array 0: title: How to use htte plugin slug: !@regexp /^how-to-use-htte/ content: htte plugin is flexiabe tags: - howto - htte - plugin createdAt: !@exist
!@array
要特別注意。Htte 常規狀態下比對數組時,會先比對元素個數,在逐一比對個元素。
而 articles
多是一個長度不固定的數組,,這種情況下進行常規比對沒有意義。
使用 !@array
自定義數組比對行爲,使其僅比對特定的元素,好比該測試中,就表示僅對第一個元素進行比對,忽略其它元素。
若是該元素匹配,則測試經過。
- describe: 經過標籤賽選個人博文 api: listArticles req: headers: Authorization: !$concat ['Bearer', ' ', !$query $$johnLogin.res.body.token] query: tag: howto res: body: articlesCount: !@exist articles: !@array 0: title: How to use htte plugin slug: !@regexp /^how-to-use-htte/ content: htte plugin is flexiabe tags: - howto - htte - plugin createdAt: !@exist
query
描述 querystring, 測時的 url 將變成 http://localhost:3000/articles?tag=howto
。
保證 Web 可用的狀況下,在文件 .htte.yaml
和 blog.yaml
所在的目錄,執行命令 htte
, htte 會逐一執行測試。
並打印測試執行的結果。
一些 htte 命令行有些實用技巧:
htte --bail
htte --bail --amend
htte --unit blog-articleUsehtte --shot
htte --debug
經過這個僅僅 4 接口的博客應用接口測試案例,你應該很很熟悉 Htte 了,就是這麼簡單。
Htte 自動生成數據,發送請求,比對響應數據,編排測試用例並逐一執行,打印報告。
所謂測試就是使用 YAML 描述接口的請求和響應。對於描述不了的極少部分場景提供了插件。
即享有描述性策略編寫測試的優越性,又持有插件帶來的靈活性。