回顧
很久沒有更新文章了姐赡,此時(shí)已經(jīng)是23:23了扰肌,有些愧疚,因?yàn)樽约鹤罱唤拥氖虑?生活的事情還是比較多的氧枣,所以到了晚上就沒有力氣來更新了沐兵。這里就更加佩服WQRF這個(gè)神一樣的男人!
記得上次說到便监,我們制作了一個(gè)簡(jiǎn)易的支持HTTP請(qǐng)求的頁面扎谎,實(shí)際上我們卻沒有把它用到用例之中
。
用例設(shè)計(jì)
我這個(gè)人有個(gè)很大的缺點(diǎn)烧董,想到啥就做啥毁靶,經(jīng)常是事先設(shè)計(jì)一個(gè)簡(jiǎn)版,然后后續(xù)進(jìn)行打磨逊移,其實(shí)這樣對(duì)一個(gè)成熟的系統(tǒng)來說太不友好了预吆,很多東西可能在設(shè)計(jì)的時(shí)候就太過于局限了。這里不扯廢話了胳泉,直接進(jìn)入主題吧拐叉。
關(guān)于用例
思考過很多次,目前在公司制作的測(cè)試平臺(tái)有個(gè)特點(diǎn)扇商,就是不需要寫代碼就可以完成接口測(cè)試用例的編寫凤瘦,只不過礙于對(duì)大家的成長(zhǎng)沒有太大的提升
,所以我這次打算做到兼容案铺,如果你愿意寫代碼廷粒,那么你可以導(dǎo)入代碼或者在線編寫代碼,如果不想看到代碼红且,也可以采用無碼模式,并且還要做到隨時(shí)轉(zhuǎn)換涤姊。
用例的生命周期
從設(shè)計(jì)上來說暇番,用例以鏈路的形式執(zhí)行,一個(gè)用例會(huì)有很多個(gè)臨時(shí)變量思喊,通過它們壁酬,我們可以解決數(shù)據(jù)依賴,完成對(duì)整個(gè)流程的測(cè)試恨课。由于筆者畫圖能力有限舆乔,所以這里就不上圖了。一個(gè)用例分為幾個(gè)部分:
前置setUp操作
用例執(zhí)行
后置tearDown操作
其中每個(gè)操作里面都擁有很多個(gè)步驟(step)剂公,每個(gè)step產(chǎn)生的數(shù)據(jù)都會(huì)在主用例的生命周期中保存希俩,達(dá)到數(shù)據(jù)互通的效果。
這里的步驟可以是http請(qǐng)求
纲辽,redis操作
颜武,sql語句
璃搜,python代碼片段
等等,每個(gè)步驟都可以擁有一個(gè)返回值鳞上,通過返回值解決數(shù)據(jù)依賴問題这吻。
舉例
如果我們需要獲取用戶的余額,那么我們的用例將這樣去編寫:
- 先設(shè)計(jì)一個(gè)登錄的測(cè)試用例:
用例名稱: 用戶登錄
前置條件: 無
用例執(zhí)行: 發(fā)送http請(qǐng)求篙议,獲取token
后置條件: 無
斷言語句: 校驗(yàn)http狀態(tài)碼等
- 編寫獲取用戶余額的測(cè)試用例(主用例):
用例名稱: 獲取用戶余額
前置條件:
-
step1: 用戶登錄
記錄返回值為step1唾糯,通過step1.token獲取到登錄接口中的token數(shù)據(jù)
用例執(zhí)行:
把body中的${step1.token}替換為真實(shí)的token,發(fā)送http請(qǐng)求鬼贱。
后置條件:無
斷言語句: 校驗(yàn)code和msg以及data字段中的信息
初期看不懂不要緊移怯,大概方向是這個(gè)樣子。主要也沒有圖片吩愧,這是一個(gè)流程化的東西芋酌。
公用組件包pity_basic
主要內(nèi)容有:
存儲(chǔ)用例生命周期產(chǎn)生的變量
尋找請(qǐng)求字段中的變量并替換成真實(shí)數(shù)據(jù)
redis相關(guān)操作
sql相關(guān)操作
http相關(guān)操作
-
python代碼塊相關(guān)操作
上述的代碼相關(guān)的操作都是為了能將數(shù)據(jù)和代碼進(jìn)行互相轉(zhuǎn)換,具體的構(gòu)思還沒有完全想好雁佳。我喜歡邊寫邊想脐帝,不然我想得肯定不全,只有寫的時(shí)候遇到問題了才能想好要怎么做下一步糖权。
給我思考的時(shí)間有限堵腹,我只能走一步算一步了!
其實(shí)這里我也覺得自己說的云里霧里星澳,還是等后續(xù)成品出來了疚顷,回過頭來看或者修改這篇文章吧!
編寫變量查找相關(guān)方法
這邊我們自己內(nèi)定一套規(guī)則禁偎,凡是${變量}
這種數(shù)據(jù)腿堤,都是需要替換的變量,可能由其他前置或常量產(chǎn)生如暖,需要隨時(shí)替換笆檀。這個(gè)規(guī)則要求變量盡量簡(jiǎn)單,不要搞特殊符號(hào)盒至。
import re
el_exp = r"\$\{(.+)\}"
pattern = re.compile(el_exp)
def get_el_expression(string: str):
"""
獲取el表達(dá)式
:param string:
:return:
"""
return re.findall(pattern, string)
if __name__ == "__main__":
s = "select * from xxx where name = '${mygod}'"
print(get_el_expression(s))
我們用正則提取變量,這樣如果我們的sql語句里面有變量的情況下枷遂,可以做到動(dòng)態(tài)sql語句樱衷,如上圖。不過基于這酒唉,我們還需要提供一個(gè)變量池矩桂,用來存放這個(gè)用例的所有臨時(shí)變量
。
編寫變量池相關(guān)方法
"""
pity變量池
變量池的生命周期與用例保持一致
"""
__author__ = "xiaoke"
class VarPool(object):
def __init__(self, case_id):
"""
:param case_id: 用來標(biāo)識(shí)變量所處的主生命周期case
"""
self.cache = dict()
self.case_id = case_id
def set(self, key, value):
self.cache[key] = value
def get(self, key):
return self.cache.get(key)
def get_default(self, key, default_value):
return self.cache.get(key, default_value)
這里創(chuàng)建了一個(gè)變量池類痪伦,實(shí)際上維護(hù)了一個(gè)map耍鬓,當(dāng)然由于復(fù)雜場(chǎng)景下阔籽,可能會(huì)有變量沖突的情況,所以我們會(huì)在web頁面層去控制牲蜀,去保證用戶不使用重復(fù)的變量笆制。
今天的內(nèi)容就先到這里了,主要還是一個(gè)構(gòu)思的問題涣达。后面慢慢補(bǔ)全這些概念在辆,使它越來越明朗。因?yàn)槲椰F(xiàn)在也很懵逼度苔,如果疑惑的話匆篓,可以等整個(gè)用例流程打通了再來回顧一下。
后續(xù)的話pity_basic會(huì)作為一個(gè)tar包寇窑,可在pypi下載鸦概,單獨(dú)抽出這個(gè)包的主要原因還是為了支持代碼和無碼模式的切換。