【HttpRunner学习笔记】3- HttpRunner 解析测试用例组织

引言

在前面一篇文章介绍了怎么生成测试用例,而在生成的测试用例文件中,我们可以看到很多的属性,那么这些属性代表什么呢?都有什么作用呢?以及怎么用呢?

每个HttpRunner测试用例是HttpRunner的子类,并且必须包含configteststeps两个属性。

1. config 属性

配置testcase级别的config属性,它包含base_urlnameverifyvariablesexport

每一个测试用例(testcase)都有一个config属性,可以是testcase级别的配置

  • name(必需):testcase的一部分,会显示咋测试报告以及运行日志当中
  • base_url(可选):功能路径,url的一部分。比如:http://www.woshipm.com/。如果设置了base_url的话,在teststep中的url中只能设置相对路径。如果需要切换不同的环境的话,该功能很有用。
  • variables(可选):testcase通用变量。每个step中可以引用没有在step中设置的变量。换句话说,step中设置的变量的级别比在config中设置的变量级别更高。
  • verify(可选):指定是否验证服务器的TLS证书。如果想要记录testcase中的http数据特别有用。如果不设置或者设置为true则会产生SSLError错误。
  • export(可选):提取testcasesession变量。测试用例是为黑盒,config中的variables视为输入,export为输出。特别是,当该testcase中的某个输出作为下一个testcase中的输入的时候特别有用。

2. teststeps 属性

每一个testcase中包括一个或者多个排序的steps列表(List[Step]),每个step相当于一个api请求(request)或者testcase的引用。此外还支持variables/extract/validate/hooks机制实现更为复杂的场景。

在这里插入图片描述

RunRequest(name)

RunRequest在一个步骤中用于向API发出请求,并为响应执行一些提取或验证。RunRequest的参数name作为step的名字,将会在测试报告和运行日志中显示。

.with_variables

teststep的变量。 每个步骤中的变量都是相互独立的,因此如果想相互共享variable的话,需要把variable配置在config中。另外teststep中的变量会覆盖config中相同名称的变量。

.method(url)

指定http的方法的url,它对应于requests.request的方法和url参数。如果配置中设置了base_url,则此处之能设置相对路径。

.with_params

指定request url的参数,这个相当于requests.request中的params参数的数据。

.with_headers

指定requesthttp headers。相当于requests.requestheaders参数部分。

.with_cookies

指定requesthttp cookies。相当于requests.requestcookies参数部分。

.with_data

指定requesthttp body。相当于requests.requestdata参数部分。

.with_json

指定requesthttp json。相当于requests.requestjson参数部分。

.extract

使用jmespath提取json 应答数据:.with_jmespath(jmes_path:Text, var_name:Text)-->jmes_path: jmespath表达式,可以参考https://jmespath.org/tutorial.html做详细了解;var_name: 存储提取值的变量名,该变量可以被后续的steps中直接使用。

.validate

使用jmespath提取json应答数据,并使用.assert_xxx(jmes_path:Text, expected_value:Any)验证期望值。其中jmes_path表示jmespath表达式; expected_value为预期值,变量或者函数表示。如下图:

在这里插入图片描述

RunTestCase(name)

step中引用RunTestCase来调用另一个testcase。参数name为用来表示testcase的名字,会展示在运行日志中和测试报告中。

.with_variables

RunRequest.with_variables

.call

指定引用testcase的类

.export

指定要从引用的testcase导出的会话变量名。导出的变量可以被后续的测试步骤引用。

3. 示例分析

以网站的推荐作家接口作为示例:

在这里插入图片描述

示例网站:http://www.woshipm.com

然后拿到第一个作者的作者ID作为参数查看作者内容;

这个测试用例包含两个api请求:

  • /api2/recommendation/authors/with-article-info
  • /api2/user/followings/status

使用Step调用,代码如下:

# NOTE: Generated By HttpRunner v3.1.4
# FROM: har\woshipm_recommended_author.har


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


class TestCaseWoshipmRecommendedAuthor(HttpRunner):

    config = Config("request methods testcase with functions")\
        .variables(
        **{
            "pn": "1",
            "ps": "20"
            }
        )\
        .base_url("http://www.woshipm.com")\
        .verify(False)\
        .export(*["author_id"])


    teststeps = [
        Step(
            RunRequest("/api2/recommendation/authors/with-article-info")
            .get("/api2/recommendation/authors/with-article-info")
            .with_params(**{"PN": "${pn}", "PS": "${ps}"})
            .with_headers(
                **{
                    "Host": "www.woshipm.com",
                    "Accept": "application/json, text/plain, */*",
                    "COMMON_ACCESS_TOKEN_SECRET": "NjM4ODgxLCwxNjI4MzQyNjAzOTM1LCxodHRwczovL3N0YXRpYy5xaWRpYW5sYS5jb20vd29zaGlwbV9kZWZfaGVhZF8xLmpwZywseWMsLDRkNDI0MzM0Y2U2NDQ2NDI5MThlNjFiZjNlZmQ5NjgzLTAtMQ==",
                    "COMMON_ACCESS_TOKEN": "MGJRTW5TU0xiU3M0TEY1QUg0N1NnTFhsWXVoYm5nOFlrbVM5MEpRbDEzaTI0TTk4NHFhTEZMSW1YZ0lnNEw0WU0wMXdhbVJFYTBmNnNrNDJpQUZRcG4xZXFwWHQwc3ZoL0Y2U0dhMHM0WTRrZ3RGU2dYMDM0WEU2OGU4b3FRTDA=",
                    "X-WP-Nonce": "452000896a",
                    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
                    "Referer": "http://www.woshipm.com/users",
                    "Accept-Encoding": "gzip, deflate",
                    "Accept-Language": "zh-CN,zh;q=0.9",
                    "Cookie": "new_device_id=device_0ca45ac5-91b5-48f1-989f-09d72908c13f; isOverlayShowx=VVVV; Hm_lvt_b85cbcc76e92e3fd79be8f2fed0f504f=1628163442,1628172667,1628334320; dts_device_info=%7B%22device_id%22%3A%22device_0ca45ac5-91b5-48f1-989f-09d72908c13f%22%2C%22device_brand%22%3A%22%22%2C%22device_model%22%3A%22%22%2C%22client_type%22%3A%22pc%22%2C%22os_type%22%3A%22Win32%22%2C%22os_version%22%3A%22%22%2C%22network_type%22%3A%22%22%2C%22browser_type%22%3A%22Chrome%22%2C%22browser_version%22%3A%2291.0.4472.124%22%7D; article_index=; article_user_profile=article_recom_users@author_items; article_detail_normal=article_user_profile@article_items; _DAU=done%21; wordpress_logged_in_41071e66c7856d347ba575b5339c5a86=18144854885%7C1629552204%7CcnJRMC1LLCPnvL3ZEGLxFpuh3LXe1JeyovQ8OlsPvm6%7C3b42d3281e8bef80c1f7ef7c44ff0b7430bed59c80ff13f7e97cb93c3805feee; t=MGJRTW5TU0xiU3M0TEY1QUg0N1NnTFhsWXVoYm5nOFlrbVM5MEpRbDEzaTI0TTk4NHFhTEZMSW1YZ0lnNEw0WU0wMXdhbVJFYTBmNnNrNDJpQUZRcG4xZXFwWHQwc3ZoL0Y2U0dhMHM0WTRrZ3RGU2dYMDM0WEU2OGU4b3FRTDA%3D; s=NjM4ODgxLCwxNjI4MzQyNjAzOTM1LCxodHRwczovL3N0YXRpYy5xaWRpYW5sYS5jb20vd29zaGlwbV9kZWZfaGVhZF8xLmpwZywseWMsLDRkNDI0MzM0Y2U2NDQ2NDI5MThlNjFiZjNlZmQ5NjgzLTAtMQ%3D%3D; firstVisitTime=1628342605147; post_view_4751263=2; Hm_lpvt_b85cbcc76e92e3fd79be8f2fed0f504f=1628342635",
                    "Connection": "keep-alive",
                }
            )
            .with_cookies(
                **{
                    "new_device_id": "device_0ca45ac5-91b5-48f1-989f-09d72908c13f",
                    "isOverlayShowx": "VVVV",
                    "Hm_lvt_b85cbcc76e92e3fd79be8f2fed0f504f": "1628163442,1628172667,1628334320",
                    "dts_device_info": "%7B%22device_id%22%3A%22device_0ca45ac5-91b5-48f1-989f-09d72908c13f%22%2C%22device_brand%22%3A%22%22%2C%22device_model%22%3A%22%22%2C%22client_type%22%3A%22pc%22%2C%22os_type%22%3A%22Win32%22%2C%22os_version%22%3A%22%22%2C%22network_type%22%3A%22%22%2C%22browser_type%22%3A%22Chrome%22%2C%22browser_version%22%3A%2291.0.4472.124%22%7D",
                    "article_index": "",
                    "article_user_profile": "article_recom_users@author_items",
                    "article_detail_normal": "article_user_profile@article_items",
                    "_DAU": "done%21",
                    "wordpress_logged_in_41071e66c7856d347ba575b5339c5a86": "18144854885%7C1629552204%7CcnJRMC1LLCPnvL3ZEGLxFpuh3LXe1JeyovQ8OlsPvm6%7C3b42d3281e8bef80c1f7ef7c44ff0b7430bed59c80ff13f7e97cb93c3805feee",
                    "t": "MGJRTW5TU0xiU3M0TEY1QUg0N1NnTFhsWXVoYm5nOFlrbVM5MEpRbDEzaTI0TTk4NHFhTEZMSW1YZ0lnNEw0WU0wMXdhbVJFYTBmNnNrNDJpQUZRcG4xZXFwWHQwc3ZoL0Y2U0dhMHM0WTRrZ3RGU2dYMDM0WEU2OGU4b3FRTDA%3D",
                    "s": "NjM4ODgxLCwxNjI4MzQyNjAzOTM1LCxodHRwczovL3N0YXRpYy5xaWRpYW5sYS5jb20vd29zaGlwbV9kZWZfaGVhZF8xLmpwZywseWMsLDRkNDI0MzM0Y2U2NDQ2NDI5MThlNjFiZjNlZmQ5NjgzLTAtMQ%3D%3D",
                    "firstVisitTime": "1628342605147",
                    "post_view_4751263": "2",
                    "Hm_lpvt_b85cbcc76e92e3fd79be8f2fed0f504f": "1628342635",
                }
            )
            .extract()
            .with_jmespath("body.REQUEST_ID", "request_id")
            .with_jmespath("body.RESULT.authors[0].authorId", "author_id")
            .validate()
            .assert_equal("status_code", 200)
            .assert_equal('headers."Content-Type"', "application/json;charset=UTF-8")
            .assert_equal("body.CODE", 200)
            .assert_equal("body.MESSAGE", "请求成功")
            .assert_equal("body.REQUEST_ID", "${request_id}")
            .assert_equal("body.HOST_ID", "localhost")
        ),
        Step(
            RunRequest("/api2/user/followings/status")
                .get("/api2/user/followings/status")
                #.with_params(**{"authorIds": "801994"})
                .with_params(**{"authorIds": "${author_id}"})

                .with_headers(
                **{
                    "Host": "www.woshipm.com",
                    "Accept": "application/json, text/plain, */*",
                    "COMMON_ACCESS_TOKEN_SECRET": "NjM4ODgxLCwxNjI4MzQyNjAzOTM1LCxodHRwczovL3N0YXRpYy5xaWRpYW5sYS5jb20vd29zaGlwbV9kZWZfaGVhZF8xLmpwZywseWMsLDRkNDI0MzM0Y2U2NDQ2NDI5MThlNjFiZjNlZmQ5NjgzLTAtMQ==",
                    "COMMON_ACCESS_TOKEN": "MGJRTW5TU0xiU3M0TEY1QUg0N1NnTFhsWXVoYm5nOFlrbVM5MEpRbDEzaTI0TTk4NHFhTEZMSW1YZ0lnNEw0WU0wMXdhbVJFYTBmNnNrNDJpQUZRcG4xZXFwWHQwc3ZoL0Y2U0dhMHM0WTRrZ3RGU2dYMDM0WEU2OGU4b3FRTDA=",
                    "X-WP-Nonce": "452000896a",
                    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
                    "Referer": "http://www.woshipm.com/u/801994",
                    "Accept-Encoding": "gzip, deflate",
                    "Accept-Language": "zh-CN,zh;q=0.9",
                    "Cookie": "new_device_id=device_0ca45ac5-91b5-48f1-989f-09d72908c13f; isOverlayShowx=VVVV; Hm_lvt_b85cbcc76e92e3fd79be8f2fed0f504f=1628163442,1628172667,1628334320; dts_device_info=%7B%22device_id%22%3A%22device_0ca45ac5-91b5-48f1-989f-09d72908c13f%22%2C%22device_brand%22%3A%22%22%2C%22device_model%22%3A%22%22%2C%22client_type%22%3A%22pc%22%2C%22os_type%22%3A%22Win32%22%2C%22os_version%22%3A%22%22%2C%22network_type%22%3A%22%22%2C%22browser_type%22%3A%22Chrome%22%2C%22browser_version%22%3A%2291.0.4472.124%22%7D; article_index=; article_user_profile=article_recom_users@author_items; article_detail_normal=article_user_profile@article_items; _DAU=done%21; wordpress_logged_in_41071e66c7856d347ba575b5339c5a86=18144854885%7C1629552204%7CcnJRMC1LLCPnvL3ZEGLxFpuh3LXe1JeyovQ8OlsPvm6%7C3b42d3281e8bef80c1f7ef7c44ff0b7430bed59c80ff13f7e97cb93c3805feee; t=MGJRTW5TU0xiU3M0TEY1QUg0N1NnTFhsWXVoYm5nOFlrbVM5MEpRbDEzaTI0TTk4NHFhTEZMSW1YZ0lnNEw0WU0wMXdhbVJFYTBmNnNrNDJpQUZRcG4xZXFwWHQwc3ZoL0Y2U0dhMHM0WTRrZ3RGU2dYMDM0WEU2OGU4b3FRTDA%3D; s=NjM4ODgxLCwxNjI4MzQyNjAzOTM1LCxodHRwczovL3N0YXRpYy5xaWRpYW5sYS5jb20vd29zaGlwbV9kZWZfaGVhZF8xLmpwZywseWMsLDRkNDI0MzM0Y2U2NDQ2NDI5MThlNjFiZjNlZmQ5NjgzLTAtMQ%3D%3D; firstVisitTime=1628342605147; post_view_4751263=2; Hm_lpvt_b85cbcc76e92e3fd79be8f2fed0f504f=1628342649",
                    "Connection": "keep-alive",
                }
            )
                .with_cookies(
                **{
                    "new_device_id": "device_0ca45ac5-91b5-48f1-989f-09d72908c13f",
                    "isOverlayShowx": "VVVV",
                    "Hm_lvt_b85cbcc76e92e3fd79be8f2fed0f504f": "1628163442,1628172667,1628334320",
                    "dts_device_info": "%7B%22device_id%22%3A%22device_0ca45ac5-91b5-48f1-989f-09d72908c13f%22%2C%22device_brand%22%3A%22%22%2C%22device_model%22%3A%22%22%2C%22client_type%22%3A%22pc%22%2C%22os_type%22%3A%22Win32%22%2C%22os_version%22%3A%22%22%2C%22network_type%22%3A%22%22%2C%22browser_type%22%3A%22Chrome%22%2C%22browser_version%22%3A%2291.0.4472.124%22%7D",
                    "article_index": "",
                    "article_user_profile": "article_recom_users@author_items",
                    "article_detail_normal": "article_user_profile@article_items",
                    "_DAU": "done%21",
                    "wordpress_logged_in_41071e66c7856d347ba575b5339c5a86": "18144854885%7C1629552204%7CcnJRMC1LLCPnvL3ZEGLxFpuh3LXe1JeyovQ8OlsPvm6%7C3b42d3281e8bef80c1f7ef7c44ff0b7430bed59c80ff13f7e97cb93c3805feee",
                    "t": "MGJRTW5TU0xiU3M0TEY1QUg0N1NnTFhsWXVoYm5nOFlrbVM5MEpRbDEzaTI0TTk4NHFhTEZMSW1YZ0lnNEw0WU0wMXdhbVJFYTBmNnNrNDJpQUZRcG4xZXFwWHQwc3ZoL0Y2U0dhMHM0WTRrZ3RGU2dYMDM0WEU2OGU4b3FRTDA%3D",
                    "s": "NjM4ODgxLCwxNjI4MzQyNjAzOTM1LCxodHRwczovL3N0YXRpYy5xaWRpYW5sYS5jb20vd29zaGlwbV9kZWZfaGVhZF8xLmpwZywseWMsLDRkNDI0MzM0Y2U2NDQ2NDI5MThlNjFiZjNlZmQ5NjgzLTAtMQ%3D%3D",
                    "firstVisitTime": "1628342605147",
                    "post_view_4751263": "2",
                    "Hm_lpvt_b85cbcc76e92e3fd79be8f2fed0f504f": "1628342649",
                }
            )
                .extract()
                .with_jmespath("body.REQUEST_ID", "request_id")
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal('headers."Content-Type"', "application/json;charset=UTF-8")
                .assert_equal("body.CODE", 200)
                .assert_equal("body.MESSAGE", "请求成功")
                .assert_equal("body.REQUEST_ID", "${request_id}")
                .assert_equal("body.HOST_ID", "localhost")
        )
    ]


if __name__ == "__main__":
    TestCaseWoshipmRecommendedAuthor().test_start()

在示例中:

  • config属性

    • 使用config属性抽离base_url,以便切换环境IP的问题;
    • config中使用.variables声明全局变量
    • config使用export提取测试用例的第一个step的作者ID:author_id作为下一个step中的输入;
  • teststeps属性

    • .extract().with_jmespath("body.REQUEST_ID", "request_id")提取请求响应数据,因为在响应的request_id是动态的,所以在验证中需要先存储提取值的变量名,该变量可以被后续的steps中直接使用,也可以被assert_equal使用。

    • .extract().with_jmespath("body.RESULT.authors[0].authorId", "author_id")

      提取请求/api2/recommendation/authors/with-article-info响应数据的authors列表中的第一个作者的作者ID:authorId并声明为author_id,然后在configauthor_id引用,之后在发送

      请求/api2/user/followings/status的时候通过config.export方法将author_id的值传入进来;

    • .with_params(**{"PN": "${pn}", "PS": "${ps}"})调用config属性的.variables里面声明的pn以及ps两个参数;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值