httprunner3.x详细教程六(httprunner的setup和teardown及hook)

httprunner3.x详细教程六(httprunner的setup和teardown及hook)

httprunner的setup和teardown可以在yml或者json文件中定义,按照3.x版本的推荐,建议大家在py文件中进行定义,unittest和pytest都可以定义setup和teardown,那么httprunner如何定义呢,下面我会介绍一下设置setup和teardown的两种方式。

**欢迎加入测试交流群:自动化测试-夜行者(816489363)进行交流学习QAQ**--成都-阿木木

httprunner有两种setup和teardown的定义方式,一个是测试类级别,一个是测试步骤级别的定义。

测试类级别的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("运行于测试用例之前")  


    def teardown(self):  

        print("运行于测试用例之后")  


    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()  

结果为:

Process finished with exit code 0  

运行于测试用例之前  

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  

运行于测试用例之后  

第二种写法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("运行于测试用例之前")  


    @classmethod  

    def teardown_class(cls):  

        print("运行于测试用例之后")  


    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是运行于测试类的前面,setup是运行与每个测试方法的前面,在httprunner好像不区分这两个方法。

测试步骤前后的setup和teardown设置

我在debugtalk.py中写了两个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中调用debugtalk的两个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("运行于测试用例之前")  

    @classmethod  

    def teardown_class(cls):  

        print("运行于测试用例之后")  


    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()  

运行结果:

Process finished with exit code 0  

运行于测试用例之前  

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  

运行于测试用例之后  

既然是hook方法,那么肯定是会集成一些内置的钩子,满足特殊的要求所使用的。

setup_hooks:在测试步骤前执行,先调用setup_hooks()内的函数。可以传入 $request 参数,可以对请求进行预处理或者修改,修改请求参数

teardown_hooks:在测试步骤执行后,先调用teardown()内的函数,可以传入$response参数,可以对返回值进行处理

我先在debugtalk.py中定义两个方法,输出一下后面获取的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文件中调用这两个hook,然后传递参数$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("运行于测试用例之前")  

    @classmethod  

    def teardown_class(cls):  

        print("运行于测试用例之后")  


    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()  

结果如下:

Process finished with exit code 0  

运行于测试用例之前  

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!  

传入的是一个request和response对象,我们可以对于传入的request和response对象进行操作

我们可以修改resquest和response传入和返回的值,来完成复杂的业务要求。

现在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返回的状态码为404,看一下我在demo_baidu_request_test.py中的调用

#!/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("运行于测试用例之前")  

    @classmethod  

    def teardown_class(cls):  

        print("运行于测试用例之后")  


    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()  

下面是执行结果:

demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start <- C:\Users\luozhongwen\AppData\Local\Programs\Python\Python38\lib\site-packages\httprunner\runner.py 运行于测试用例之前  

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)  

可以看到断言是失败的,我设置的成功断言状态码是200,传入的request中的username开始是123456,被我们截获请求参数后更改为了888888。在实际应用中,我们可以对于传入账号密码等进行加密,或者对于返回值的格式等进行解码操作

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342