httprunner3-參數(shù)化--學習筆記 2

參數(shù)化方式有三種,以下面的登錄接口為例

from httprunner import HttpRunner, Config, Step, RunRequest

class TestCaseLogin(HttpRunner):
    config = Config('hrun3_demo').base_url('http://xxx:9090').export(*['vars_name'])

    teststeps = [
        Step(
            RunRequest('login')
            .post('/xxx/login.html')
            .with_headers(**{'X-Requested-With': 'XMLHttpRequest'})
            .with_data({'accounts':'ss','pwd':'123456'})
        .extract()
            .with_jmespath('body.msg','value_msg')
        .validate()
            .assert_equal('body.msg','登錄成功')
            .assert_equal('body.code',0)
        )
    ]

if __name__ == '__main__':
    TestCaseLogin().test_start()

1.裝飾器

  • 聲明:

在使用參數(shù)化之前,首先要導入pytest包,和httprunner的Parameters這個類

使用httprunner改造過的pytest參數(shù)化,通過parameters這個字段去引用
注意:需結(jié)合 test_start()方法使用
如果聲明多個參數(shù)值,那么用例數(shù)會是笛卡爾積后的數(shù)量,我這里只聲明一個參數(shù)值

    @pytest.mark.parametrize(
        'param',
        Parameters(
            {
                'base_url':['http://xxx:9090'],
                'url':['/xxx/login.html'],
                'accounts':['ss'],
                'pwd':['123456']
            }),
    )
    def test_start(self, param):
        super().test_start(param)
  • 引用
    使用$base_url,$url,$accounts,$pwd 方式引用參數(shù),下面是完整代碼
from httprunner import HttpRunner, Config, Step, RunRequest
import pytest
from httprunner import Parameters

class TestCaseLogin(HttpRunner):
    @pytest.mark.parametrize(
        'param',
        Parameters(
            {
                'base_url':['http://xxx:9090'],
                'url':['/xxx/login.html'],
                'accounts':['ss'],
                'pwd':['123456']
            }),
    )
    def test_start(self, param):
        super().test_start(param)

    config = Config('hrun3_demo').base_url('$base_url').export(*['vars_name'])

    teststeps = [
        Step(
            RunRequest('login')
            .post('$url')
            .with_headers(**{'X-Requested-With': 'XMLHttpRequest'})
            .with_data({'accounts':'$accounts','pwd':'$pwd'})
        .extract()
            .with_jmespath('body.msg','value_msg')
        .validate()
            .assert_equal('body.msg','登錄成功')
            .assert_equal('body.code',0)
        )

可以看到 headers沒有參數(shù)化,因為 目前headers像url 那樣參數(shù)化調(diào)不通
.with_headers(**'$headers')時會報錯,當然按道理來講應該可以調(diào)用的
這個就放在第三種參數(shù)化方式里實現(xiàn)吧

2.csv文件

通過外部csv文件進行參數(shù)化,將 csv 文件放到項目的根目錄(也可以在該目錄下指定相對路徑,比如data/*.csv)
這部分url 我先不參數(shù)化,只參數(shù)化用戶名和密碼

  • 一對一參數(shù)化
    data.csv 文件如下:

data里是兩組測試用例[bull,123456] [ss,123456]
注意 csv里不同字段用“,”分隔

聲明的時候把參數(shù)用 “- ”關(guān)聯(lián)
'accounts-pwd': '${parameterize(data.csv)}'

@pytest.mark.parametrize(
        'param',
        Parameters(
            {
                'accounts-pwd': '${parameterize(data.csv)}'
            }),
    )
    def test_start(self, param):
        super().test_start(param)

引用還是使用$accounts,$pwd,完整代碼如下:

from httprunner import HttpRunner, Config, Step, RunRequest
import pytest
from httprunner import Parameters
class TestCaseLogin(HttpRunner):
    @pytest.mark.parametrize(
        'param',
        Parameters(
            {
                'accounts-pwd': '${parameterize(data.csv)}'
            }),
    )
    def test_start(self, param):
        super().test_start(param)

    config = Config('hrun3_demo').base_url('http://xxx:9090').export(*['vars_name'])

    teststeps = [
        Step(
            RunRequest('login')
            .post('/xxx/login.html')
            .with_headers(**{'X-Requested-With': 'XMLHttpRequest'})
            .with_data({'accounts':'$accounts','pwd':'$pwd'})
        .extract()
            .with_jmespath('body.msg','value_msg')
        .validate()
            .assert_equal('body.msg','登錄成功')
            .assert_equal('body.code',0)
        )
    ]

if __name__ == '__main__':
    TestCaseLogin().test_start()

運行如下,因為有一個用戶名不存在,所以一個成功一個失?。?/p>

3.debugtalk.py

  • 定義
    在debugtalk.py中定義get_user()函數(shù),返回列表,兩組測試用例,一組成功一組失敗
    再將 header 進行參數(shù)化,定義 get_headers()函數(shù)
# @File: debugtalk.py

def get_user():
    return [
        {'accounts': 'ss', 'pwd': '123456'},
        {'accounts': 'bull', 'pwd': ''}
    ]

def get_headers():
    headers={
        'X-Requested-With': 'XMLHttpRequest'
    }
    return headers
  • 調(diào)用
    debugtalk.py的回調(diào)
    get_user()調(diào)用,${gen_user()}
@pytest.mark.parametrize(
        'param',
        Parameters(
            {
                'accounts-pwd': '${get_user()}'
            }),
    )
    def test_start(self, param):
        super().test_start(param)

headers 調(diào)用,直接導入get_headers 方法

from hrun_demo.mtx_demo.debugtalk import get_headers

然后.with_headers(**get_headers())
完整代碼如下:

from httprunner import HttpRunner, Config, Step, RunRequest
import pytest
from httprunner import Parameters

from hrun_demo.mtx_demo.debugtalk import get_headers

class TestCaseLogin(HttpRunner):
    @pytest.mark.parametrize(
        'param',
        Parameters(
            {
                'accounts-pwd': '${get_user()}'
            }),
    )
    def test_start(self, param):
        super().test_start(param)

    config = Config('hrun3_demo').base_url('http://xxx:9090').export(*['vars_name'])

    teststeps = [
        Step(
            RunRequest('login')
            .post('/xxx/login.html')
            .with_headers(**get_headers())
            .with_data({'accounts':'$accounts','pwd':'$pwd'})
        .extract()
            .with_jmespath('body.msg','value_msg')
        .validate()
            .assert_equal('body.msg','登錄成功')
            .assert_equal('body.code',0)
        )
    ]

if __name__ == '__main__':
    TestCaseLogin().test_start()

三種方式實現(xiàn)原理

@pytest.mark.parametrize()會先將param作為一個動態(tài)參數(shù),傳遞給param,然后由httprunner再進行參數(shù)化,httprunner在pytest的parametrize上封裝了一層,增加了csv和debugtalk.py參數(shù)化的支持

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容