httprunner3.x詳細(xì)教程六(httprunner的setup和teardown及hook)

httprunner3.x詳細(xì)教程六(httprunner的setup和teardown及hook)

httprunner的setup和teardown可以在yml或者json文件中定義,按照3.x版本的推薦,建議大家在py文件中進(jìn)行定義放案,unittest和pytest都可以定義setup和teardown秒啦,那么httprunner如何定義呢坦报,下面我會(huì)介紹一下設(shè)置setup和teardown的兩種方式当犯。

**歡迎加入測(cè)試交流群:自動(dòng)化測(cè)試-夜行者(816489363)進(jìn)行交流學(xué)習(xí)QAQ**--成都-阿木木

httprunner有兩種setup和teardown的定義方式征椒,一個(gè)是測(cè)試類級(jí)別,一個(gè)是測(cè)試步驟級(jí)別的定義末荐。

測(cè)試類級(jí)別的setup和teardown

第一種寫法setup和teardown:

#!/user/bin/env?python??

#?-*-?coding:?utf-8?-*-??


"""??

------------------------------------??

@Project?:?interfaceDemo??

@Time????:?2020/8/20?13:47??

@Auth????:?chineseluo??

@Email???:?848257135@qq.com??

@File????:?demo_baidu_request_test.py??

@IDE?????:?PyCharm??

------------------------------------??

"""??

from?httprunner?import?HttpRunner,?Config,?Step,?RunRequest,?RunTestCase??



class?TestBaiduRequestTestCase(HttpRunner):??

????def?setup(self):??

????????print("運(yùn)行于測(cè)試用例之前")??


????def?teardown(self):??

????????print("運(yùn)行于測(cè)試用例之后")??


????config?=?(??

????????Config("get?user?list")??

????????.base_url("https://www.baidu.com")??

????????.verify(False)??

????)??


????teststeps?=?[??

????????Step(??

????????????RunRequest("get?info")??

????????????.get("/")??

????????????.validate()??

????????????.assert_equal("status_code",?200)??

????????)??

????]??



if?__name__?==?"__main__":??

????TestBaiduRequestTestCase().test_start()??

結(jié)果為:

Process?finished?with?exit?code?0??

運(yùn)行于測(cè)試用例之前??

PASSED?[100%]2020-08-20?13:50:53.306?|?INFO?????|?httprunner.loader:load_dot_env_file:127?-?Loading?environment?variables?from?D:\TestScriptDir\httprunner\interfaceDemo\.env??

.??

.??

.??

?D:\TestScriptDir\httprunner\interfaceDemo\logs\a3872c1b-dedf-4485-bd95-3f31947bfae0.run.log??

運(yùn)行于測(cè)試用例之后??

第二種寫法setup_class和teardown_class:

#!/user/bin/env?python??

#?-*-?coding:?utf-8?-*-??


"""?

------------------------------------?

@Project?:?interfaceDemo?

@Time????:?2020/8/20?13:47?

@Auth????:?chineseluo?

@Email???:?848257135@qq.com?

@File????:?demo_baidu_request_test.py?

@IDE?????:?PyCharm?

------------------------------------?

"""??

from?httprunner?import?HttpRunner,?Config,?Step,?RunRequest,?RunTestCase??



class?TestBaiduRequestTestCase(HttpRunner):??

????@classmethod??

????def?setup_class(cls):??

????????print("運(yùn)行于測(cè)試用例之前")??


????@classmethod??

????def?teardown_class(cls):??

????????print("運(yùn)行于測(cè)試用例之后")??


????config?=?(??

????????Config("get?user?list")??

????????.base_url("https://www.baidu.com")??

????????.verify(False)??

????)??


????teststeps?=?[??

????????Step(??

????????????RunRequest("get?info")??

????????????.get("/")??

????????????.validate()??

????????????.assert_equal("status_code",?200)??

????????)??

????]??



if?__name__?==?"__main__":??

????TestBaiduRequestTestCase().test_start()??

上面兩種寫法在unittest和pytest中是不一樣的侧纯,setup_class是運(yùn)行于測(cè)試類的前面,setup是運(yùn)行與每個(gè)測(cè)試方法的前面甲脏,在httprunner好像不區(qū)分這兩個(gè)方法眶熬。

測(cè)試步驟前后的setup和teardown設(shè)置

我在debugtalk.py中寫了兩個(gè)hook_up和hook_teardown方法

def?hook_up():??

????print("前置操作:setup!")??



def?hook_down(response=None):??

????print("后置操作:teardown!")??

????if?response:??

????????print(response)??

????????response.status_code?=?300??

在demo_baidu_request_test.py中調(diào)用debugtalk的兩個(gè)hook方法,使用setup_hook()和teardown_hook()來加載我們自定義的hook:

#!/user/bin/env?python??

#?-*-?coding:?utf-8?-*-??


"""?

------------------------------------?

@Project?:?interfaceDemo?

@Time????:?2020/8/20?13:47?

@Auth????:?chineseluo?

@Email???:?848257135@qq.com?

@File????:?demo_baidu_request_test.py?

@IDE?????:?PyCharm?

------------------------------------?

"""??

from?httprunner?import?HttpRunner,?Config,?Step,?RunRequest,?RunTestCase??



class?TestBaiduRequestTestCase(HttpRunner):??

????@classmethod??

????def?setup_class(cls):??

????????print("運(yùn)行于測(cè)試用例之前")??

????@classmethod??

????def?teardown_class(cls):??

????????print("運(yùn)行于測(cè)試用例之后")??


????config?=?(??

????????Config("get?user?list")??

????????.base_url("https://www.baidu.com")??

????????.verify(False)??

????)??


????teststeps?=?[??

????????Step(??

????????????RunRequest("get?info")??

????????????.setup_hook("${hook_up()}")??

????????????.get("/")??

????????????.teardown_hook("${hook_down()}")??

????????????.validate()??

????????????.assert_equal("status_code",?200)??

????????)??

????]??



if?__name__?==?"__main__":??

????TestBaiduRequestTestCase().test_start()??

運(yùn)行結(jié)果:

Process?finished?with?exit?code?0??

運(yùn)行于測(cè)試用例之前??

PASSED?[100%]前置操作:setup!??

后置操作:teardown!??

2020-08-20?14:07:08.534?|?INFO?????|?httprunner.runner:test_start:460?-?generate?testcase?log:?D:\TestScriptDir\httprunner\interfaceDemo\logs\983886ea-36c1-4677-9966-4929f4006004.run.log??

運(yùn)行于測(cè)試用例之后??

既然是hook方法块请,那么肯定是會(huì)集成一些內(nèi)置的鉤子娜氏,滿足特殊的要求所使用的。

setup_hooks:在測(cè)試步驟前執(zhí)行负乡,先調(diào)用setup_hooks()內(nèi)的函數(shù)牍白。可以傳入 $request 參數(shù)抖棘,可以對(duì)請(qǐng)求進(jìn)行預(yù)處理或者修改茂腥,修改請(qǐng)求參數(shù)

teardown_hooks:在測(cè)試步驟執(zhí)行后,先調(diào)用teardown()內(nèi)的函數(shù)切省,可以傳入$response參數(shù)最岗,可以對(duì)返回值進(jìn)行處理

我先在debugtalk.py中定義兩個(gè)方法,輸出一下后面獲取的request和response.

def?hook_up(request=None):??

????print("輸出request:{}".format(request))??

????print("前置操作:setup!")??



def?hook_down(response=None):??

????print("輸出response:{}".format('\n'.join(['%s:%s'?%?item?for?item?in?response.__dict__.items()])))??

????print("后置操作:teardown!")??

然后在demo_baidu_request_test.py文件中調(diào)用這兩個(gè)hook朝捆,然后傳遞參數(shù)$request和$response般渡。

#!/user/bin/env?python??

#?-*-?coding:?utf-8?-*-??


"""?

------------------------------------?

@Project?:?interfaceDemo?

@Time????:?2020/8/20?13:47?

@Auth????:?chineseluo?

@Email???:?848257135@qq.com?

@File????:?demo_baidu_request_test.py?

@IDE?????:?PyCharm?

------------------------------------?

"""??

from?httprunner?import?HttpRunner,?Config,?Step,?RunRequest,?RunTestCase??



class?TestBaiduRequestTestCase(HttpRunner):??

????@classmethod??

????def?setup_class(cls):??

????????print("運(yùn)行于測(cè)試用例之前")??

????@classmethod??

????def?teardown_class(cls):??

????????print("運(yùn)行于測(cè)試用例之后")??


????config?=?(??

????????Config("get?user?list")??

????????.base_url("https://www.baidu.com")??

????????.verify(False)??

????)??


????teststeps?=?[??

????????Step(??

????????????RunRequest("get?info")??

????????????.setup_hook("${hook_up($request)}")??

????????????.get("/")??

????????????.teardown_hook("${hook_down($response)}")??

????????????.validate()??

????????????.assert_equal("status_code",?200)??

????????)??

????]??



if?__name__?==?"__main__":??

????TestBaiduRequestTestCase().test_start()??

結(jié)果如下:

Process?finished?with?exit?code?0??

運(yùn)行于測(cè)試用例之前??

PASSED?[100%]輸出request:{'method':?'GET',?'url':?'/',?'params':?{},?'headers':?{'HRUN-Request-ID':?'HRUN-656566cb-5369-43b1-af19-47ce6ef1c7ba-081374'},?'req_json':?None,?'data':?None,?'cookies':?{},?'timeout':?120,?'allow_redirects':?True,?'verify':?False}??

前置操作:setup!??

resp_obj:<Response?[200]>??

validation_results:{}??

后置操作:teardown!??

傳入的是一個(gè)request和response對(duì)象,我們可以對(duì)于傳入的request和response對(duì)象進(jìn)行操作

我們可以修改resquest和response傳入和返回的值芙盘,來完成復(fù)雜的業(yè)務(wù)要求驯用。

現(xiàn)在debugtalk.py改變了一下:

def?hook_up(request=None):??

????print("輸出request:{}".format(request))??

????print("前置操作:setup!")??

????if?request:??

????????request["params"]["username"]?=?"888888"??



def?hook_down(response=None):??

????print("輸出response:{}".format('\n'.join(['%s:%s'?%?item?for?item?in?response.__dict__.items()])))??

????print("后置操作:teardown!")??

????if?response:??

????????response.status_code?=?404??

我修改了傳入的setp的密碼為“888888”,修改了step返回的狀態(tài)碼為404儒老,看一下我在demo_baidu_request_test.py中的調(diào)用

#!/user/bin/env?python??

#?-*-?coding:?utf-8?-*-??


"""?

------------------------------------?

@Project?:?interfaceDemo?

@Time????:?2020/8/20?13:47?

@Auth????:?chineseluo?

@Email???:?848257135@qq.com?

@File????:?demo_baidu_request_test.py?

@IDE?????:?PyCharm?

------------------------------------?

"""??

from?httprunner?import?HttpRunner,?Config,?Step,?RunRequest,?RunTestCase??



class?TestBaiduRequestTestCase(HttpRunner):??

????@classmethod??

????def?setup_class(cls):??

????????print("運(yùn)行于測(cè)試用例之前")??

????@classmethod??

????def?teardown_class(cls):??

????????print("運(yùn)行于測(cè)試用例之后")??


????config?=?(??

????????Config("get?user?list")??

????????.variables(??

????????????**{??

????????????????"username":?"123456"??

????????????}??

????????)??

????????.base_url("https://www.baidu.com")??

????????.verify(False)??

????)??


????teststeps?=?[??

????????Step(??

????????????RunRequest("get?info")??

????????????.setup_hook("${hook_up($request)}")??

????????????.get("/")??

????????????.with_params(**{"username":?"${username}"})??

????????????.teardown_hook("${hook_down($response)}")??

????????????.validate()??

????????????.assert_equal("status_code",?200)??

????????)??

????]??



if?__name__?==?"__main__":??

????TestBaiduRequestTestCase().test_start()??

下面是執(zhí)行結(jié)果:

demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start?<-?C:\Users\luozhongwen\AppData\Local\Programs\Python\Python38\lib\site-packages\httprunner\runner.py?運(yùn)行于測(cè)試用例之前??

FAILED?[100%]輸出request:{'method':?'GET',?'url':?'/',?'params':?{'username':?'123456'},?'headers':?{'HRUN-Request-ID':?'HRUN-bbeea383-94b1-43c4-8092-4f35debfdacc-782331'},?'req_json':?None,?'data':?None,?'cookies':?{},?'timeout':?120,?'allow_redirects':?True,?'verify':?False}??

前置操作:setup!??

輸出response:resp_obj:<Response?[200]>??

validation_results:{}??

后置操作:teardown??

method???:?GET??

url??????:?https://www.baidu.com/?username=888888??

httprunner.exceptions.ValidationFailure:?assert?status_code?equal?200(int)??==>?fail??

check_item:?status_code??

check_value:?404(int)??

assert_method:?equal??

expect_value:?200(int)??

可以看到斷言是失敗的蝴乔,我設(shè)置的成功斷言狀態(tài)碼是200,傳入的request中的username開始是123456驮樊,被我們截獲請(qǐng)求參數(shù)后更改為了888888薇正。在實(shí)際應(yīng)用中,我們可以對(duì)于傳入賬號(hào)密碼等進(jìn)行加密囚衔,或者對(duì)于返回值的格式等進(jìn)行解碼操作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挖腰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子练湿,更是在濱河造成了極大的恐慌猴仑,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞠鲜,死亡現(xiàn)場離奇詭異宁脊,居然都是意外死亡断国,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門榆苞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稳衬,“玉大人,你說我怎么就攤上這事坐漏”【危” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵赊琳,是天一觀的道長街夭。 經(jīng)常有香客問我,道長躏筏,這世上最難降的妖魔是什么板丽? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮趁尼,結(jié)果婚禮上埃碱,老公的妹妹穿的比我還像新娘。我一直安慰自己酥泞,他們只是感情好砚殿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芝囤,像睡著了一般似炎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悯姊,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天羡藐,我揣著相機(jī)與錄音,去河邊找鬼悯许。 笑死传睹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的岸晦。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼睛藻,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼启上!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起店印,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤冈在,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后按摘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體包券,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纫谅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溅固。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片付秕。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖侍郭,靈堂內(nèi)的尸體忽然破棺而出询吴,到底是詐尸還是另有隱情,我是刑警寧澤亮元,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布猛计,位于F島的核電站,受9級(jí)特大地震影響爆捞,放射性物質(zhì)發(fā)生泄漏奉瘤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一煮甥、第九天 我趴在偏房一處隱蔽的房頂上張望盗温。 院中可真熱鬧,春花似錦苛秕、人聲如沸肌访。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吼驶。三九已至,卻和暖如春店煞,著一層夾襖步出監(jiān)牢的瞬間蟹演,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工顷蟀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酒请,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓鸣个,卻偏偏與公主長得像羞反,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子囤萤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351