httprunner3.x 参数化数据驱动


 


 

httprunner3.x中的参数化我们需要引入pytest和处理参数化的函数:

import pytest
from httprunner import Parameters

 

源码介绍 Parameters 中的使用方法:

def parse_parameters(parameters: Dict,) -> List[Dict]:
    """ parse parameters and generate cartesian product.

    Args:
        parameters (Dict) parameters: parameter name and value mapping
            parameter value may be in three types:
                (1) data list, e.g. ["iOS/10.1", "iOS/10.2", "iOS/10.3"]
                (2) call built-in parameterize function, "${parameterize(account.csv)}"
                (3) call custom function in debugtalk.py, "${gen_app_version()}"

    Returns:
        list: cartesian product list

    Examples:
        >>> parameters = {
            "user_agent": ["iOS/10.1", "iOS/10.2", "iOS/10.3"],
            "username-password": "${parameterize(account.csv)}",
            "app_version": "${gen_app_version()}",
        }
        >>> parse_parameters(parameters)

    """
    parsed_parameters_list: List[List[Dict]] = []

 

第一种是直接获取数据列表的信息:

  • number就是我们引用的变量
import pytest
from httprunner import (HttpRunner, Config, Step, RunRequest, Parameters, RunTestCase)
@pytest.mark.parametrize(
'param', Parameters({'number': [1, 2], 'token_length': [32]})) def test_start(self, param): super().test_start(param) config = ( Config("login") .variables( **{"username": "${ENV(USERNAME)}", "password": "${ENV(PASSWORD)}" } ) .base_url("${ENV(HOSTURL)}") .verify(False) # .export(*["param"]) ) teststeps = [ Step( RunRequest('login') .with_variables(**{'status_code': 201, 'status': 1}) .post('/client/user/auth') .with_headers(**{"Content-Type": "application/json"}) .with_json({"scenario": "client", "company_id": 5940, "user_name": "$username", "password": "$password", "device_type": "$number", "device": ""}) .extract() .with_jmespath("body.data.token", "token") .validate() .assert_equal('status_code', '$status_code', '断言失败') .assert_equal('body.status', '$status', '断言失败') .assert_length_equal('body.data.token', '$token_length', '断言失败') ) ]

 

第二种调用内置parameterize函数读取.csv中的测试数据:

  • username和password就是我们要引用的变量,${parameterize(parameter.csv)} 就是我们读取的.csv文件的数据源

  username-password 是组合数据,每次遍历出来是一组数值,分别赋值给对应变量。

import pytest
from httprunner import (HttpRunner, Config, Step, RunRequest, Parameters, RunTestCase)


class TestCaseLogin(HttpRunner):
    
    @pytest.mark.parametrize('param', Parameters({"username-password": "${parameterize(parameter.csv)}"}))
    def test_start(self, param):
        print(param)
        super().test_start(param)

    config = (
        Config("login")
        .base_url("${ENV(HOSTURL)}")
        .verify(False)
        # .export(*["param"])
    )
    teststeps = [
        Step(
            RunRequest('login')
            .with_variables(**{'token_length': 32, 'status_code': 201, 'status': 1})
            .post('/client/user/auth')
            .with_headers(**{"Content-Type": "application/json"})
            .with_json({"scenario": "client", "company_id": 5940, "user_name": "$username", "password": "$password",
                        "device_type": "$number", "device": ""})
            .extract()
            .with_jmespath("body.data.token", "token")
            .validate()
            .assert_equal('status_code', '$status_code', '断言失败')
            .assert_equal('body.status', '$status', '断言失败')
            .assert_length_equal('body.data.token', '$token_length', '断言失败')
        )
    ]

 

第三种是在debugtalk中调用自定义函数:

  • device_type就是我们要引用的参数化变量,${get_data()} 就是我们自定义的函数

import pytest
from httprunner import (HttpRunner, Config, Step, RunRequest, Parameters, RunTestCase)


class TestCaseLogin(HttpRunner):

    @pytest.mark.parametrize('param', Parameters({"device_type": "${get_data()}"}))
    def test_start(self, param):
        print(param)
        super().test_start(param)

    config = (
        Config("login")
        .base_url("${ENV(HOSTURL)}")
        .variables(
            **{"username": "${ENV(USERNAME)}",
               "password": "${ENV(PASSWORD)}"
               }
        )
        .verify(False)
        # .export(*["param"])
    )
    teststeps = [
        Step(
            RunRequest('login')
            .with_variables(**{'token_length': 32, 'status_code': 201, 'status': 1})
            .post('/client/user/auth')
            .with_headers(**{"Content-Type": "application/json"})
            .with_json({"scenario": "client", "company_id": 5940, "user_name": "$username", "password": "$password",
                        "device_type": "$device_type", "device": ""})
            .extract()
            .with_jmespath("body.data.token", "token")
            .validate()
            .assert_equal('status_code', '$status_code', '断言失败')
            .assert_equal('body.status', '$status', '断言失败')
            .assert_length_equal('body.data.token', '$token_length', '断言失败')
        )
    ]

 

  注意点:参数化的时候引用文件数据源和自定义函数是用 “ ${ 数据源 } ”,测试用例间引用变量直接 “ $变量名 ”,不需要大括号

 

从上面的栗子来看,您会发现,实际的数据驱动,还是使用的pytest中的 parametrize , 其实就是 httprunner 在 pytest的parametrize上封装了一层,增加了csv和debugtalk.py参数化的应用 。

 


 

以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,评论区留言会及时修正发布,谢谢!


未完,待续…

一直都在努力,希望您也是!

 

转载请附带原文链接 ( https://www.cnblogs.com/lifeng0402/articles/14578883.html ),否则追究法律责任,谢谢!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM