目 录CONTENT

文章目录

HttpRunner-8-数据驱动

phyger
2022-04-14 / 0 评论 / 0 点赞 / 768 阅读 / 4,393 字 / 正在检测是否收录...

数据驱动概览

为什么要用数据驱动

举个简单例子,当我们在测试一个输入框的功能时,可能需要输入不同的参数,此时,我们不需要设计多个用例,而只需要将输入值参数化,将不同的参数作为一个列表通过数据驱动的方式进行加载即可。

httprunner 的数据驱动

通过上篇文章,我们已经知道 httprunner 的数据驱动需要在 testsuite 中使用关键字 parameters 来定义。

定义数据源的三种方式

  • testsuiteyaml/json 文件中直接定义。
  • 通过内置的 parameterize 函数引用外部 csv 文件,适用大数据场景。
  • 调用 debugtalk.py 定义的函数(动态)生成参数列表,此方式最灵活。

定义参数的两种方式

  • 独立参数定义
config:
    name: testcase description

testcases:
    create user:
        testcase: demo-quickstart-6.yml
        parameters:
            user_id: [1001, 1002, 1003, 1004]

进行该配置后,测试用例在运行时就会对 user_id 实现数据驱动,即分别使用 [1001, 1002, 1003, 1004] 四个值运行测试用例。测试用例总共会运行 4 次,并且每次运行时都采用不同的 user_id

  • 多个具有关联性的参数定义
config:
    name: "demo"

testcases:
    testcase1_name:
        testcase: /path/to/testcase1
        parameters:
            username-password:
                - ["user1", "111111"]
                - ["user2", "222222"]
                - ["user3", "333333"]

进行该配置后,测试用例在运行时就会对 usernamepassword 实现数据驱动,即分别使用 {"username": "user1", "password": "111111"}、{"username": "user2", "password": "222222"}、{"username": "user3", "password": "333333"} 运行 3 次测试,并且保证参数值总是成对使用。

通过以上内容,我们可以知道,在 HttpRunner 的数据驱动中,我们有 6 种方式进行实现。即:

三种数据源*两种参数定义方式

编号驱动模式
1独立参数 & 直接指定参数列表
2关联参数 & 直接指定参数列表
3独立参数 & 引用 CSV 文件
4关联参数 & 引用 CSV 文件
5独立参数 & 引用自定义函数
6关联参数 & 引用自定义函数

数据驱动实例

在上面我们已经介绍了 6 中驱动模式,而且也学习了直接在 yml 文件中定义参数的两种场景,那怎么使用 CSV 文件实行数据驱动呢?

独立参数 & 引用 CSV 文件

当我们需要对 user_id(1000 个)进行数据驱动时,首先,需要准备 user_id.csv 文件,文件内容如下:

user_id
1001
1002
...
1999
2000

然后,我们在 testsuite 中就可以通过内置的 parameterize(可简写为 P)函数引用 CSV 文件:

假设 user_id.csv 在项目根目录的 data 目录下

config:
    name: "demo"

testcases:
    testcase1_name:
        testcase: /path/to/testcase1
        parameters:
            user_id: ${P(data/user_id.csv)}

即 P 函数的参数(CSV 文件路径)是相对于项目根目录的相对路径。当然,这里也可以使用 CSV 文件在系统中的绝对路径,不过这样的话在项目路径变动时就会出现问题,因此推荐使用相对路径的形式。

关联参数 & 引用 CSV 文件

当我们需要对 username-password(1000 个)进行数据驱动时,首先,需要准备 account.csv 文件,文件内容如下:

username,password
test1,111111
test2,222222
test3,333333
...
test1000,999999

然后,我们在 testsuite 中就可以通过内置的 parameterize(可简写为 P)函数引用 CSV 文件:

假设 account.csv 在项目根目录的 data 目录下

config:
    name: "demo"

testcases:
    testcase1_name:
        testcase: /path/to/testcase1
        parameters:
            username-password: ${P(data/account.csv)}

需要说明的是,在 parameters 中指定的参数名称必须与 CSV 文件中第一行的参数名称一致,顺序可以不一致,参数个数也可以不一致。

例如,在 account.csv 文件中可以包含多个参数,username、password、phone、age

username,password,phone,age
test1,111111,18600000001,21
test2,222222,18600000002,22
test3,333333,18600000003,23
...
test1000,999999,18600000003,99

独立参数 & 引用自定义函数

当我们想要动态生成 100user_id 的时候,我们可以使用 debugtalk.py 的自定义函数动态生成。

debugtalk.py 中定义函数:

def get_user_id():
    ret = []
    for nu in range(101):
       ret.append({"user_id": nu})
    return ret

然后,在 YAML/JSONparameters 中就可以通过调用自定义函数的形式来指定数据源:

config:
    name: "demo"

testcases:
    testcase1_name:
        testcase: /path/to/testcase1
        parameters:
            user_id: ${get_user_id()}

另外,通过函数的传参机制,还可以实现更灵活的参数生成功能,在调用函数时指定需要生成的参数个数。

关联参数 & 引用自定义函数

当我们想要动态生成 100 个账号的时候,我们可以使用 debugtalk.py 的自定义函数动态生成。

debugtalk.py 中定义函数:

def get_account(num):
    ret = []
    for nu in range(num):
        name = 'user-{}'.format(nu)
        pwd = 'pwd-{}'.format(nu)
        ret.append({"username": name,'password':pwd})
    return ret

那么在 YAML/JSONparameters 中就可以调用自定义函数生成指定数量的参数列表:

config:
    name: "demo"

testcases:
    testcase1_name:
        testcase: /path/to/testcase1
        parameters:
            username-password: ${get_account(10)}

数据驱动在 testsuite 中的 testcases 下使用关键字 parameters 定义,这些数据在 testcase 中的 teststeps 中使用关键字 variables 直接使用即可。

实例

测试项目源码

demo_api 文件:

name: demo api
variables:
    var1: value1
    var2: value2
request:
    url: /phyger
    method: GET
    headers:
        User-Agent: $user_agent
        Content-Type: "application/json"
    json:
        key: $var2
        username: $username
        pwd: $password

demo_api2 类似。

用例文件:

config:
    name: "demo testcase"
    variables:
        device_sn: "ABC"
    base_url: "https://getman.cn/mock"
    output: [
        "username",
        "password"
    ]

teststeps:
-
    name: demo step 1
    api: api/demo_api.yml
    variables:
        user_agent: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
        device_sn: $device_sn
        username: $username
        password: $password
    validate:
        - eq: ["status_code", 200]
    setup_hooks:
        - ${hook_print(setup)}
    teardown_hooks:
        - ${hook_print(teardown)}
-
    name: demo step 2
    api: api/demo_api2.yml
    variables:
        token: ${get_token()}
    validate:
        - eq: [reason, OK]

测试套文件:

config:
    name: "demo testsuite"
    variables:
        device_sn: "XYZ"
    base_url: "http://127.0.0.1:5000"

testcases:
-
    name: call demo_testcase with data 1
    testcase: testcases/demo_testcase.yml
    variables:
        device_sn: $device_sn
    parameters:
        - username-password: ${get_account(10)}

执行测试

测试报告

我们可以看到共执行用例 10 条,测试步骤 20,全部通过。测试用例遍历了测试套中获取的数据源 10 条,又因为测试用例中有两个步骤,所以总共有 1*10*2=20 个步骤。

0

评论区