httprunner 3.x学习10 您所在的位置:网站首页 yaml文件如何实现动态参数化 httprunner 3.x学习10

httprunner 3.x学习10

2023-05-10 04:39| 来源: 网络整理| 查看: 265

前言

httprunner 3.x可以在yaml文件中参数化,在 config 中使用 parameters 关键字 环境:httprunner==3.1.4

参数配置

参数名称的定义分为两种情况:

独立参数单独进行定义; 多个参数具有关联性的参数需要将其定义在一起,采用短横线(-)进行连接。

数据源指定支持三种方式:

在 YAML/JSON/py 中直接指定参数列表:该种方式最为简单易用,适合参数列表比较小的情况 通过内置的 parameterize(可简写为P)函数引用 CSV 文件:该种方式需要准备 CSV 数据文件,适合数据量比较大的情况 调用 debugtalk.py 中自定义的函数生成参数列表:该种方式最为灵活,可通过自定义 Python 函数实现任意场景的数据驱动机制,当需要动态生成参数列表时也需要选择该种方式

三种方式可根据实际项目需求进行灵活选择,同时支持多种方式的组合使用。 假如测试用例中定义了多个参数,那么测试用例在运行时会对参数进行笛卡尔积组合,覆盖所有参数组合情况。

单个参数时参数化

先准备测试数据,准备四组登录用的账号和密码,账号为test1,test2,test3,test4,密码统一设置为123456。

参数user账号数据,设置对应的值 ["test1", "test2", "test3", "test4"],定义单个参数用variables,定义参数化用parameters

# 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ config: name: login case base_url: ${ENV(base_url)} variables: user: test password: 123456 parameters: user: [test1, test2, test3, test4]

如果参数化里面的数据只有一个,比如psw对应的值只有一个,parameters 也可以设置 password的值

# 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ config: name: login case base_url: ${ENV(base_url)} variables: user: test password: 123456 parameters: user: [test1, test2, test3, test4] password: 123456

variables 和 parameters 设置相同名称变量时,parameters 优先级大于variables 完整的 login_params.yml 脚本如下

# 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ config: name: login case base_url: ${ENV(base_url)} variables: user: test password: 123456 parameters: user: [test1, test2, test3, test4] teststeps: - name: step login variables: password: 123456 request: url: /api/v1/login method: POST json: username: $user password: $password validate: - eq: [status_code, 200] - eq: [content.code, 0] - eq: [content.msg, login success!] - len_eq: [content.token, 40]

运行用例,会自动生成四个测试用例

pytest 脚本

# NOTE: Generated By HttpRunner v3.1.4 # FROM: testcases\login_params.yml # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ import pytest from httprunner import Parameters from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase class TestCaseLoginParams(HttpRunner): @pytest.mark.parametrize( "param", Parameters({"user": ["test1", "test2", "test3", "test4"]}) ) def test_start(self, param): super().test_start(param) config = ( Config("login case") .variables(**{"user": "test", "password": 123456}) .base_url("${ENV(base_url)}") ) teststeps = [ Step( RunRequest("step login") .with_variables(**{"password": 123456}) .post("/api/v1/login") .with_json({"username": "$user", "password": "$password"}) .validate() .assert_equal("status_code", 200) .assert_equal("body.code", 0) .assert_equal("body.msg", "login success!") .assert_length_equal("body.token", 40) ), ] if __name__ == "__main__": TestCaseLoginParams().test_start() 关联性的参数化

上面的案例多个账号,密码都是一样的,如果密码不一样呢?上面的就行不通了,所以针对于一个账号对应一个密码,这种一一对应的关系,可以用关联性的参数化

# 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ config: name: login case base_url: ${ENV(base_url)} parameters: user-password: - [test1, "123456"] - [test2, "123456"] - [test3, "123456"] - [test4, "123456"] teststeps: - name: step login request: url: /api/v1/login method: POST json: username: $user password: $password validate: - eq: [status_code, 200] - eq: [content.code, 0] - eq: [content.msg, login success!] - len_eq: [content.token, 40]

对应pytest脚本

# NOTE: Generated By HttpRunner v3.1.4 # FROM: testcases\login_params2.yml # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ import pytest from httprunner import Parameters from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase class TestCaseLoginParams2(HttpRunner): @pytest.mark.parametrize( "param", Parameters( { "user-password": [ ["test1", "123456"], ["test2", "123456"], ["test3", "123456"], ["test4", "123456"], ] } ), ) def test_start(self, param): super().test_start(param) config = Config("login case").base_url("${ENV(base_url)}") teststeps = [ Step( RunRequest("step login") .post("/api/v1/login") .with_json({"username": "$user", "password": "$password"}) .validate() .assert_equal("status_code", 200) .assert_equal("body.code", 0) .assert_equal("body.msg", "login success!") .assert_length_equal("body.token", 40) ), ] if __name__ == "__main__": TestCaseLoginParams2().test_start() 笛卡尔积组合

比如测试账号有四种["test1", "test2", "test3", "test4"],密码也有四种 ["123456", "123456", "123456", "123456"] 用笛卡尔积组合的话,就是4*4=16种组合

# 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ config: name: login case base_url: ${ENV(base_url)} parameters: user: [test1, test2, test3, test4] password: ["123456", "123456", "123456", "123456"] teststeps: - name: step login variables: password: 123456 request: url: /api/v1/login method: POST json: username: $user password: $password validate: - eq: [status_code, 200] - eq: [content.code, 0] - eq: [content.msg, login success!] - len_eq: [content.token, 40]

这样运行会生成16组用例,对应pytest脚本

# NOTE: Generated By HttpRunner v3.1.4 # FROM: testcases\login_params3.yml # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ import pytest from httprunner import Parameters from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase class TestCaseLoginParams3(HttpRunner): @pytest.mark.parametrize( "param", Parameters( { "user": ["test1", "test2", "test3", "test4"], "password": ["123456", "123456", "123456", "123456"], } ), ) def test_start(self, param): super().test_start(param) config = Config("login case").base_url("${ENV(base_url)}") teststeps = [ Step( RunRequest("step login") .with_variables(**{"password": 123456}) .post("/api/v1/login") .with_json({"username": "$user", "password": "$password"}) .validate() .assert_equal("status_code", 200) .assert_equal("body.code", 0) .assert_equal("body.msg", "login success!") .assert_length_equal("body.token", 40) ), ] if __name__ == "__main__": TestCaseLoginParams3().test_start()

这跟pytest里面参数化叠加效果是一样的



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有