httprunner3-參數(shù)化--學(xué)習(xí)筆記 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ù)化之前煌往,首先要導(dǎo)入pytest包眼俊,和httprunner的Parameters這個(gè)類

使用httprunner改造過的pytest參數(shù)化继低,通過parameters這個(gè)字段去引用
注意:需結(jié)合 test_start()方法使用
如果聲明多個(gè)參數(shù)值黑界,那么用例數(shù)會(huì)是笛卡爾積后的數(shù)量勉失,我這里只聲明一個(gè)參數(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ù)化,因?yàn)?目前headers像url 那樣參數(shù)化調(diào)不通
.with_headers(**'$headers')時(shí)會(huì)報(bào)錯(cuò)乱凿,當(dāng)然按道理來講應(yīng)該可以調(diào)用的
這個(gè)就放在第三種參數(shù)化方式里實(shí)現(xiàn)吧

2.csv文件

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

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

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

聲明的時(shí)候把參數(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()

運(yùn)行如下胁出,因?yàn)橛幸粋€(gè)用戶名不存在,所以一個(gè)成功一個(gè)失敹紊蟆:

3.debugtalk.py

  • 定義
    在debugtalk.py中定義get_user()函數(shù)全蝶,返回列表,兩組測試用例,一組成功一組失敗
    再將 header 進(jìn)行參數(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)用绷落,直接導(dǎ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()

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

@pytest.mark.parametrize()會(huì)先將param作為一個(gè)動(dòng)態(tài)參數(shù),傳遞給param始苇,然后由httprunner再進(jìn)行參數(shù)化砌烁,httprunner在pytest的parametrize上封裝了一層,增加了csv和debugtalk.py參數(shù)化的支持

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末催式,一起剝皮案震驚了整個(gè)濱河市函喉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荣月,老刑警劉巖管呵,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哺窄,居然都是意外死亡捐下,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門堂氯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔑担,“玉大人,你說我怎么就攤上這事咽白∑∥眨” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵晶框,是天一觀的道長排抬。 經(jīng)常有香客問我,道長授段,這世上最難降的妖魔是什么蹲蒲? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮侵贵,結(jié)果婚禮上届搁,老公的妹妹穿的比我還像新娘。我一直安慰自己窍育,他們只是感情好卡睦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漱抓,像睡著了一般表锻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乞娄,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天瞬逊,我揣著相機(jī)與錄音显歧,去河邊找鬼。 笑死确镊,一個(gè)胖子當(dāng)著我的面吹牛士骤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骚腥,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼敦间,長吁一口氣:“原來是場噩夢啊……” “哼瓶逃!你這毒婦竟也來了束铭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤厢绝,失蹤者是張志新(化名)和其女友劉穎契沫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昔汉,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懈万,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了靶病。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片会通。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖娄周,靈堂內(nèi)的尸體忽然破棺而出涕侈,到底是詐尸還是另有隱情,我是刑警寧澤煤辨,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布裳涛,位于F島的核電站,受9級(jí)特大地震影響众辨,放射性物質(zhì)發(fā)生泄漏端三。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一鹃彻、第九天 我趴在偏房一處隱蔽的房頂上張望郊闯。 院中可真熱鬧,春花似錦蛛株、人聲如沸团赁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽然痊。三九已至,卻和暖如春屉符,著一層夾襖步出監(jiān)牢的瞬間剧浸,已是汗流浹背锹引。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唆香,地道東北人嫌变。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像躬它,于是被迫代替她去往敵國和親腾啥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容