前段時(shí)間看到一片文章《接口測(cè)試斷言》,里面提到了接口測(cè)試中斷言的作用和寫(xiě)斷言的要點(diǎn)肛炮。這篇文章會(huì)總結(jié)一下我在做接口測(cè)試的時(shí)候是如何寫(xiě)斷言的掰盘。
為什么要做接口斷言
首先先說(shuō)一說(shuō)眾所周知的一個(gè)問(wèn)題瑟啃,為什么要做斷言。
假設(shè)我們查詢我們銀行余額的時(shí)候發(fā)出了一個(gè)請(qǐng)求,請(qǐng)求響應(yīng)的HTTP狀態(tài)碼是200酒觅,但是響應(yīng)體里面返回的是咱們信用卡和貸款的錢(qián)。如果沒(méi)有斷言微峰,這個(gè)接口用例會(huì)通過(guò)嗎舷丹?這個(gè)接口實(shí)際上通過(guò)了嗎?
事實(shí)上這個(gè)接口測(cè)試并沒(méi)有通過(guò)蜓肆,但是在執(zhí)行的時(shí)候這個(gè)case并不會(huì)報(bào)錯(cuò)颜凯,這是缺乏合適的接口斷言導(dǎo)致的。合適的斷言則可以保障接口測(cè)試質(zhì)量仗扬。
所有接口測(cè)試都需要斷言嗎
首先我們需要討論一下症概,在什么時(shí)候做接口測(cè)試的時(shí)候是需要做斷言的。
我們?cè)诠ぷ鞯臅r(shí)候可能會(huì)遇到這種情況:“咱們組只提供后端接口早芭,你測(cè)一下接口就行”彼城,“前端還沒(méi)寫(xiě)好,你先測(cè)后端接口吧”。在這種情況下我們需要對(duì)接口做斷言嗎募壕?基本上是不需要的调炬,畢竟這種情況下每一個(gè)請(qǐng)求我們都會(huì)用肉眼去查看,有沒(méi)有報(bào)錯(cuò)舱馅、響應(yīng)是否符合預(yù)期我們基本上都能看出來(lái)缰泡。
事實(shí)上,接口測(cè)試的斷言在手動(dòng)測(cè)試的時(shí)候基本上是用不到的代嗤,只有在自動(dòng)化的情況下才會(huì)用斷言來(lái)驗(yàn)證接口響應(yīng)是否符合預(yù)期棘钞,例如測(cè)試環(huán)境的CI和線上的巡檢(起碼在我的工作中是這樣的)。
斷言的原則
等值校驗(yàn)
對(duì)于穩(wěn)定不變的字段我們需要做等值校驗(yàn)
舉個(gè)例子干毅,我們?cè)谀成缃黄脚_(tái)查看一個(gè)“胡X進(jìn)”用戶的主頁(yè)宜猜,調(diào)用了/ajax/profile/info
這個(gè)接口,根據(jù)我的觀察溶锭,data.user.id這個(gè)字段是這個(gè)用戶的uid宝恶,這個(gè)是必定不會(huì)改變的,所以我們?cè)趯?duì)這個(gè)接口做斷言的時(shí)候趴捅,這個(gè)字段可以做等值校驗(yàn)垫毙。
有規(guī)律的校驗(yàn)
對(duì)于有一定規(guī)律的字段我們會(huì)根據(jù)字段的類型做校驗(yàn),下面是幾個(gè)比較常見(jiàn)的例子
數(shù)字大小校驗(yàn)
依然以/ajax/profile/info
這個(gè)接口舉例拱绑,data.user.followers_count這個(gè)字段是用戶粉絲的數(shù)量综芥,必然是數(shù)字類型的返回,所以我們?cè)趯?duì)這個(gè)字段做斷言的時(shí)候可以判斷這個(gè)值是否大于0或者是否大于等于0猎拨。
內(nèi)容包含校驗(yàn)
這次我們那不用請(qǐng)求胡X進(jìn)用戶信息的接口做例子了膀藐,我們使用/ajax/side/search
接口來(lái)搜索“胡X進(jìn)”有關(guān)的內(nèi)容,這個(gè)接口返回了一系列和我們輸入有關(guān)的內(nèi)容红省,我們可以使用里面包含的內(nèi)容是否含有胡X進(jìn)來(lái)做斷言额各,也可以選定某些字段,針對(duì)這些字段里是否包含胡X進(jìn)來(lái)做斷言吧恃。
數(shù)組長(zhǎng)度校驗(yàn)
這次我們真的不用和胡X進(jìn)有關(guān)的接口了虾啦,/ajax/statuses/hot_band
這個(gè)接口是返回?zé)崴寻駟蔚模渲?em>data.band_list這個(gè)字段返回的是熱搜榜單列表痕寓,返回的形式是數(shù)組傲醉,那么我們可以對(duì)這個(gè)字段的數(shù)組長(zhǎng)度做斷言,判斷這個(gè)數(shù)組長(zhǎng)度是否為50(通常情況下熱搜榜單有50條)呻率。
枚舉值校驗(yàn)
例如/ajax/statuses/hot_band
接口相應(yīng)中的icon_desc字段硬毕,里面的內(nèi)容都是有枚舉值的,可以定義一個(gè)數(shù)組礼仗,對(duì)這個(gè)字段是否在數(shù)組里面進(jìn)行斷言吐咳。
字段為空校驗(yàn)
/ajax/statuses/hot_band
這個(gè)接口返回的數(shù)組我們可以判斷長(zhǎng)度逻悠,但是里面的內(nèi)容沒(méi)有規(guī)律,我們?cè)撛趺磁袛鄶?shù)組里面的字段是否正確呢韭脊。暫時(shí)也沒(méi)有別的辦法蹂风,只能對(duì)里面的內(nèi)容做非空的斷言,確認(rèn)里面的內(nèi)容是否為空字符串乾蓬,或者是否為空。
空字符串指的是返回了這個(gè)字段慎恒,字段內(nèi)容為空任内;空指的是接口并沒(méi)有返回這個(gè)字段。
接口中的所有字段都需要做斷言嗎
這個(gè)問(wèn)題比較看團(tuán)隊(duì)的要求融柬,但是大部分情況下來(lái)講死嗦,前端需要展示的字段一般都是需要做斷言的。
還是以某社交平臺(tái)的/ajax/statuses/hot_band
為例粒氧。icon_desc或者small_icon_desc越除、num、word或者word_scheme外盯,這些字段是展示出來(lái)的摘盆,所以這幾個(gè)字段我們是一定要做斷言的,除此之外饱苟,數(shù)組的長(zhǎng)度也需要做斷言孩擂。其他的字段相對(duì)來(lái)說(shuō)做斷言的意義則沒(méi)那么高。
不同情況下的特殊斷言
需要注意的是箱熬,在線上跑接口和測(cè)試環(huán)境不一樣类垦。在做接口自動(dòng)化的時(shí)候,在線上只能運(yùn)行查的接口城须,而測(cè)試環(huán)境則可以運(yùn)行增刪改查的接口蚤认。
與查接口不同的是,增刪改三種類型的接口會(huì)有異步接口的可能性糕伐,在這種情況下砰琢,只對(duì)單接口做斷言并不能驗(yàn)證接口的準(zhǔn)確性。需要設(shè)計(jì)更完善的接口測(cè)試方案來(lái)驗(yàn)證接口的準(zhǔn)確性赤炒。