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