設(shè)計(jì)目標(biāo):
希望在手動(dòng)測(cè)試和自動(dòng)化測(cè)試中建立一個(gè)橋梁码俩,利用手動(dòng)測(cè)試產(chǎn)生的結(jié)果伪阶,來(lái)自動(dòng)生成測(cè)試用例纵东。
設(shè)計(jì)思路:
通過(guò)監(jiān)控手動(dòng)測(cè)試的結(jié)果粘招,我們可以對(duì)手動(dòng)測(cè)試的結(jié)果進(jìn)行分析,得到請(qǐng)求的條件以及返回的結(jié)果偎球。
通過(guò)泛化請(qǐng)求條件洒扎,例如:邊界值辑甜,等價(jià)值,安全測(cè)試等,我們可以自動(dòng)生成更多的測(cè)試用例袍冷。
通過(guò)自動(dòng)生成的測(cè)試用例栈戳,我們可以得到返回結(jié)果,以及預(yù)期的結(jié)果难裆,以及判斷對(duì)錯(cuò)。
系統(tǒng)運(yùn)行環(huán)境
python 3.7 pip install mitmproxy pymysql
mysql 镊掖, gencase.sql 在 test數(shù)據(jù)庫(kù) 建proxyed,gencase 兩張表
系統(tǒng)運(yùn)行
手動(dòng)測(cè)試準(zhǔn)備:
1. 修改 record.py 中的 live.kuaishou.com/rest/ 為你需要測(cè)試的應(yīng)用中的服務(wù)器url
def response(flow):
response =flow.response
if 'live.kuaishou.com/rest/' in flow.request.url:
2- python3 runproxy.py 乃戈, 在8888 端口上啟動(dòng)http/https 代理
3- 在手機(jī)上或者PC 上為http/https請(qǐng)求設(shè)置mitmproxy 代理
設(shè)置mitmproxy 代理方法請(qǐng)參考: 參見(jiàn)(http://www.reibang.com/p/0cc558a8d6a2)
記錄服務(wù)器請(qǐng)求
手機(jī)上手動(dòng)測(cè)試web和app應(yīng)用。 系統(tǒng)會(huì)在后臺(tái)記錄請(qǐng)求亩进。
生成測(cè)試用例:python3 gencase.py
運(yùn)行測(cè)試用例:python3 runcase.py
系統(tǒng)結(jié)構(gòu)結(jié)構(gòu)及程序說(shuō)明
系統(tǒng)結(jié)構(gòu)
APP ---- mitmproxy ---- web server
| record.py
mysql.proxyed
| gencase.py
mysql.gencase
| runcase.py
測(cè)試結(jié)果
record.py 記錄
對(duì)服務(wù)器的請(qǐng)求症虑,包括header,url , method,cookie,data
gencase.py 生成擴(kuò)展測(cè)試用例
根據(jù)記錄的請(qǐng)求參數(shù)的類型,為每個(gè)參數(shù)生成不同的數(shù)據(jù)值归薛,組合為測(cè)試用例谍憔。
目前支持的POST請(qǐng)求數(shù)據(jù)有 form-data, json, plaintext,
runcase.py 運(yùn)行測(cè)試用例
取出產(chǎn)生的測(cè)試用例主籍,生成服務(wù)器請(qǐng)求习贫,向服務(wù)器發(fā)送請(qǐng)求。
mylib.py
mysql接口函數(shù)
testcaselib.py
測(cè)試用例生成策略函數(shù)庫(kù)
測(cè)試用例的擴(kuò)展:
這個(gè)版本僅對(duì)數(shù)字類型取值和字符串類型取值進(jìn)行了數(shù)據(jù)的簡(jiǎn)單擴(kuò)展千元。
見(jiàn) testcaselib.py 苫昌,對(duì)測(cè)試用例測(cè)擴(kuò)展 主要修改這個(gè)文件即可。
數(shù)字?jǐn)U展為:
def extendcase_digital():
max32= 1024*1024*1024*4-1
max64 = (max32+1)*(max32+1)-1
return (0,max32,max64,-max32,-max64)
字符串?dāng)U展為:
def extendcase_str():
snull = ''
s1k = 'a'*1024
# s1M = 'a'*1024*1024
return (snull, s1k)