httprunner2接口測(cè)試框架說明文檔

一.流程說明

流程說明

框架圖

二.配置config

1. 為什么要配置奕枢?

在接口測(cè)試過程中娄昆,會(huì)有好多參數(shù)需要指定,如果沒有一個(gè)統(tǒng)一的配置文件的話缝彬,數(shù)據(jù)會(huì)散落在各個(gè)測(cè)試用例中萌焰,后期維護(hù)的時(shí)候特別浪費(fèi)時(shí)間。
為了解決這個(gè)問題谷浅,我們?cè)黾恿艘粋€(gè)配置文件扒俯,python自帶的有一個(gè)配置文件的模塊為-ConfigParser,支持動(dòng)態(tài)配置數(shù)據(jù)一疯。
在測(cè)試過程中撼玄,為了區(qū)分測(cè)試環(huán)境和正式環(huán)境的數(shù)據(jù),我們配置了兩套文件墩邀,其中test_data.ini為測(cè)試環(huán)境的數(shù)據(jù)文件掌猛,formal_data.ini為正式環(huán)境的數(shù)據(jù)。

2. 如何配置眉睹?

2.1 ini文件配置格式
ini文件配置格式

解釋說明:
[test]:為分組的名稱荔茬,不區(qū)分大小寫,不要與其他分組名稱重復(fù)辣往;一個(gè)分組下可以配置多個(gè)數(shù)據(jù)信息兔院,注意不要重名
username = test001: 為test組下的數(shù)據(jù)信息
password = 123456:也是test組下的數(shù)據(jù)信息殖卑,不要與同分組下的數(shù)據(jù)信息重名

2.2 讀取ini配置文件
讀取ini配置文件

文件位置:wechatInterfaceTestCases--parameters--common_config.py
讀取方法:

from parameters.common_config import CommonConfig


class Common(CommonConfig):
    
    def test_useranme(self):
        """
        讀取配置文件中的test分組中的username
        :return: 
        """
        return self.cf.get("test", "username")

三.增加參數(shù)文件站削,獲取參數(shù)信息

1. 為什么要有參數(shù)文件?

參數(shù)文件是為了提取ini文件中的數(shù)據(jù)孵稽,參數(shù)文件對(duì)應(yīng)ini配置文件的分組信息许起,比如公共數(shù)據(jù)[test],對(duì)應(yīng)test.py文件菩鲜;test組下面的的username和password园细,對(duì)應(yīng)common.py的username和password方法。
如果直接把所有的數(shù)據(jù)存放到一個(gè)文件中接校,那這個(gè)文件會(huì)非常龐大猛频,如果遇到不同分組下的同名數(shù)據(jù),還會(huì)導(dǎo)致debugtalk調(diào)用的時(shí)候出現(xiàn)混亂的情況蛛勉。
像這樣分開設(shè)計(jì)鹿寻,可以更方便、直接的查找和調(diào)用自己需要的數(shù)據(jù)诽凌。

2. 如何增加參數(shù)文件毡熏?

ini文件中,當(dāng)在某個(gè)分組下增加數(shù)據(jù)的時(shí)候侣诵,就需要在對(duì)應(yīng)的配置文件下增加相應(yīng)的獲取參數(shù)信息方法痢法;當(dāng)新增一個(gè)分組的時(shí)候狱窘,就要?jiǎng)?chuàng)建一個(gè)參數(shù)文件,并增加獲取參數(shù)信息相應(yīng)的方法财搁。
配置位置:參數(shù)文件統(tǒng)一放置在parameters文件下
文件命名規(guī)則:一般為ini文件中的分組名稱蘸炸,例如:test.py
方法命名規(guī)則:一般為ini中分組下的數(shù)據(jù)名稱,例如:username

3. 如何獲取參數(shù)信息尖奔?

"""
獲取參數(shù)信息
:author: test <test@test.com>
"""

from parameters.common_config import CommonConfig


class Test(CommonConfig):

    def username(self):
        """
        用戶名
        :return:
        """
        return self.cf.get("test", "username")

    def password(self):
        """
        密碼
        :return:
        """
        return self.cf.get("test", "password")

文件中要增加注釋幻馁,首先是頂部注釋,注明文件的主要內(nèi)容越锈;其次是方法的注釋仗嗦,注釋此方法的內(nèi)容。

四.debugtalk

1. 什么是debugtalk甘凭?

文檔中是這樣說明的:
HttpRunner 的實(shí)現(xiàn)方式為稀拐,支持熱加載的插件機(jī)制(debugtalk.py),可以在 YAML/JSON 中調(diào)用 Python 函數(shù)丹弱。具體地做法德撬,我們可以在測(cè)試用例文件的同級(jí)或其父級(jí)目錄中創(chuàng)建一個(gè) debugtalk.py 文件,然后在其中定義相關(guān)的函數(shù)和變量躲胳。

2. 如何使用debugtalk蜓洪?

例如,我們需要一個(gè)獲取ini文件test分組中的username方法坯苹,可以定義一個(gè)test_useranme函數(shù)

from parameters.test import Test

test = Test()

def test_useranme():
    """
    獲取test分組下的用戶名
    :return:
    """
    return test.username()

然后隆檀,我們?cè)?JSON 測(cè)試用例文件中,就可以對(duì)定義的函數(shù)進(jìn)行調(diào)用粹湃,對(duì)定義的變量進(jìn)行引用了恐仑。引用變量的方式仍然與前面講的一樣,采用+ 變量名稱的方式为鳄;調(diào)用函數(shù)的方式為{func($var)}裳仆。

"variables": [
  {"username": "${test_username()}"}
]

五.編寫用例

1. 測(cè)試用例組織形式

在 HttpRunner 中,測(cè)試用例組織主要基于兩種概念(在不考慮用例分層概念的情況下):

測(cè)試用例集(testset):?jiǎn)蝹€(gè)或多個(gè)測(cè)試用例的集合孤钦,存儲(chǔ)形式為一個(gè) JSON 文件
測(cè)試用例(testcase):?jiǎn)未握?qǐng)求歧斟、響應(yīng)、校驗(yàn)過程偏形,對(duì)應(yīng) JSON 文件中的一個(gè) test
對(duì)于單個(gè) JSON 文件來說静袖,數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)為 list of dict 的形式,其中可能包含一個(gè)全局配置項(xiàng)(config)和若干個(gè)測(cè)試用例(test)壳猜;測(cè)試用例存在順序關(guān)系勾徽,運(yùn)行時(shí)將從前往后依次運(yùn)行。

[
  {
    "config": {...}
  },
  {
    "test": {...}
  }
]

config:作為整個(gè)測(cè)試用例集的全局配置項(xiàng)
test:對(duì)應(yīng)單個(gè)測(cè)試用例

2.用例組織結(jié)構(gòu)

config:

{
        "config": {
            "name": "小程序自考圈接口自動(dòng)化腳本",
            "variables": [
                {"openId":"${self_test_circle_openId()}"},
                {"msgContent":"${self_test_circle_msgContent()}"},
                {"zkTopicId":"${self_test_circle_zkTopicId()}"},
                {"zkPersonId":"${self_test_circle_zkPersonId()}"}
            ],
            "request": {
                "base_url": "${base_url()}",
                "headers":{
                    "mobile_type":"${mobile_type()}",
                    "Accept-Encoding":"${header_Accept_Encoding()}",
                    "User-Agent":"${header_User_Agent()}",
                    "Connection":"${header_Connection()}"
                }
            }
        }
    }

name:測(cè)試用例集的名稱,在測(cè)試報(bào)告中將作為標(biāo)題
variables:定義的全局變量喘帚,作用域?yàn)檎麄€(gè)用例集;在本測(cè)試框架中畅姊,測(cè)試用例集中用到的所有變量,統(tǒng)一放在config中的variables下吹由,test只調(diào)用若未,不再定義新的變量;目的是直接明了的知道該測(cè)試用例集下有多少個(gè)變量被使用了倾鲫,也方便后續(xù)的修改和優(yōu)化
request:request 的公共參數(shù)粗合,作用域?yàn)檎麄€(gè)用例集
base_url:測(cè)試用例集請(qǐng)求 URL 的公共 host,指定該參數(shù)后乌昔,test 中的 url 可以只描述 path 部分
headers:request 中 headers 的公共參數(shù)隙疚,作用域?yàn)檎麄€(gè)用例集;headers中的信息可以使用fiddler或者charles錄制出來磕道,一般需要指定Accept-Encoding供屉、User-Agent、Connection溺蕉;其他參數(shù)可以自己選擇是否需要伶丐。

test:

{
        "test": {
            "name": "22.2  自考百科問題列表api-問題類型-正常情況",
            "parameters":[
                {"type":["1", "2"]}
            ],
            "request": {
                "url": "/wechat/wiki/questionByType",
                "method": "GET",
                "params":{
                    "type":"$type"
                }
            },
            "extract": [
                {"status_code22_2": "status_code"}
            ],
            "validate": [
                {"eq": ["status_code", 200]},
                {"eq": ["headers.Content-Type",
                        "application/json;charset=UTF-8"]},
                {"eq": ["content.state", 1]},
                {"eq": ["content.alertMessage", "找到匹配數(shù)據(jù)。"]},
                {"eq": ["content.message", "obtain success."]},
                {"type_match": ["content.content", "dict"]},
                {"type_match": ["content.content.data", "list"]},
                {"type_match": ["content.content.data.0.id", "int"]},
                {"type_match": ["content.content.data.0.reportKey", "str"]},
                {"type_match": ["content.content.data.0.title", "str"]},
                {"type_match": ["content.content.data.0.totalTimes", "int"]},
                {"eq": ["content.content.data.0.type", "${str_transformt_int($type)}"]},
                {"type_match": ["content.content.descript", "str"]},
                {"type_match": ["content.content.total", "int"]},
                {"eq": ["content.content.type", "${str_transformt_int($type)}"]},
                {"eq": ["content.message", "obtain success."]}
            ]
        }
    }

name:測(cè)試用例的名稱疯特,在測(cè)試報(bào)告中將作為每一項(xiàng)測(cè)試的標(biāo)題
parameters:測(cè)試用例中定義的參數(shù)列表哗魂,作用域?yàn)楫?dāng)前測(cè)試用例,用于實(shí)現(xiàn)對(duì)當(dāng)前測(cè)試用例進(jìn)行數(shù)據(jù)化驅(qū)動(dòng)
request:HTTP 請(qǐng)求的詳細(xì)內(nèi)容
params:請(qǐng)求參數(shù)
extract:從當(dāng)前 HTTP 請(qǐng)求的響應(yīng)結(jié)果中提取參數(shù)漓雅,并保存到參數(shù)變量中(例如token)录别,后續(xù)測(cè)試用例可通過$token的形式進(jìn)行引用
validate:測(cè)試用例中定義的結(jié)果校驗(yàn)項(xiàng),作用域?yàn)楫?dāng)前測(cè)試用例故硅,用于實(shí)現(xiàn)對(duì)當(dāng)前測(cè)試用例運(yùn)行結(jié)果的校驗(yàn)

六.舉例說明

步驟一:配置ini文件

目錄位置:config/test_data.ini
test_data.ini文件:

[common]
base_url = https://www.sunlands.wang
openId = test0123456789

[header]
Accept-Encoding = gzip
User-Agent = Mozilla/5.0 (Linux; Android 7.1.1; OPPO R11 Build/NMF26X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/043909 Mobile Safari/537.36 MicroMessenger/6.6.6.1300(0x26060636) NetType/WIFI Language/zh_CN MicroMessenger/6.6.6.1300(0x26060636) NetType/WIFI Language/zh_CN
content-type = application/x-www-form-urlencoded
content-type-two: application/json
Connection = Keep-Alive
mobile_type = android

步驟二:創(chuàng)建參數(shù)文件庶灿,調(diào)用ini中的數(shù)據(jù)

目錄位置:parameters/header.py;parameters/common.py
創(chuàng)建header.py文件

"""
header參數(shù)文件
:author: author <author@126.com>
"""

from parameters.common_config import CommonConfig


class Header(CommonConfig):

    def Accept_Encoding(self):
        """
        Accept_Encoding
        :return:
        """
        return self.cf.get("header", "Accept-Encoding")

    def User_Agent(self):
        """
        User_Agent
        :return:
        """
        return self.cf.get("header", "User-Agent")

    def content_type(self):
        """
        content_type
        :return:
        """
        return self.cf.get("header", "content-type")

    def content_type_two(self):
        """
        content_type_two
        :return:
        """
        return self.cf.get("header", "content-type-two")

    def Connection(self):
        """
        Connection
        :return:
        """
        return self.cf.get("header", "Connection")

    def mobile_type(self):
        """
        mobile_type
        :return:
        """
        return self.cf.get("header", "mobile_type")

創(chuàng)建common.py文件

"""
公共參數(shù)文件
:author: author <author@126.com>
"""

from parameters.common_config import CommonConfig


class Common(CommonConfig):

    def base_url(self):
        """
        base_url
        :return:
        """
        return self.cf.get("common", "base_url")

    def openId(self):
        """
        微信openId
        :return:
        """
        return self.cf.get("common", "openId")

步驟三:debugtalk獲取需要的測(cè)試數(shù)據(jù)

目錄位置:testCase/debugtalk.py
debugtalk.py文件:


"""
httprunner支持熱加載的插件機(jī)制,此函數(shù)供JSON測(cè)試用例文件調(diào)用

:author: author <author@126.com>
"""

from parameters.common import Common
from parameters.header import Header


common = Common()
header = Header()

def base_url():
    """
    base_url
    :return:
    """
    return common.base_url()

def openId():
    """
    微信openId
    :return:
    """
    return common.openId()

def mobile_type():
    """
    終端類型
    :return:
    """
    return header.mobile_type()

def header_Accept_Encoding():
    """

    :return:
    """
    return header.Accept_Encoding()


def header_User_Agent():
    """

    :return:
    """
    return header.User_Agent()


def header_content_type():
    """

    :return:
    """
    return header.content_type()


def header_content_type_two():
    """

    :return:
    """
    return header.content_type_two()


def header_Connection():
    """

    :return:
    """
    return header.Connection()

步驟四:編寫測(cè)試用例

目錄位置:testCase/interface_test.json
創(chuàng)建interface_test.json文件

[
    {
        "config": {
            "name": "測(cè)試用戶使用幫助相關(guān)接口自動(dòng)化腳本",
            "variables":[
                {"openId":"${openId()}"}
            ],
            "request": {
                "base_url": "${base_url()}",
                "headers":{
                    "mobile_type":"${mobile_type()}",
                    "Accept-Encoding":"${header_Accept_Encoding()}",
                    "User-Agent":"${header_User_Agent()}",
                    "content-type":"${header_content_type_two()}",
                    "Connection":"${header_Connection()}"
                }
            }
        }
    },
    {
        "test": {
            "name": "獲取是否彈出紅包-正常情況",
            "request": {
                "url": "/wechat/getIsThongbao",
                "method": "GET",
                "params":{
                    "openId":"$openId"
                }
            },
            "extract": [
                {"status_code": "status_code"}
            ],
            "validate": [
                {"eq": ["status_code", 200]},
                {"eq": ["headers.Content-Type",
                        "application/json;charset=UTF-8"]},
                {"eq": ["content.state", 1]},
                {"eq": ["content.message", "success"]},
                {"type_match": ["content.content.flag", "int"]}
            ]
        }
    },
    {
        "test": {
            "name": "獲取上一個(gè)test提取的status_code并檢查",
            "request": {
                "url": "/wechat/getIsThongbao",
                "method": "GET"
            },
            "validate": [
                {"eq": ["$status_code", 200]}
            ]
        }
    }
]

步驟五:運(yùn)行測(cè)試用例

運(yùn)行測(cè)試用例的命令為hrun吃衅,后面直接指定測(cè)試用例文件的路徑即可
hrun testCase/interface_test.json

image.png

步驟六:查看測(cè)試報(bào)告

目錄位置:report/*.html

測(cè)試報(bào)告

七. 參考網(wǎng)址:

HttpRunner中文使用手冊(cè):http://cn.httprunner.org/
httprunner中validate的比較方法總結(jié):http://www.reibang.com/p/0367fb6ab5a2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腾誉,隨后出現(xiàn)的幾起案子徘层,更是在濱河造成了極大的恐慌,老刑警劉巖利职,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趣效,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡猪贪,警方通過查閱死者的電腦和手機(jī)跷敬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來热押,“玉大人西傀,你說我怎么就攤上這事斤寇。” “怎么了拥褂?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵娘锁,是天一觀的道長。 經(jīng)常有香客問我饺鹃,道長莫秆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任悔详,我火速辦了婚禮镊屎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茄螃。我一直安慰自己杯道,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布责蝠。 她就那樣靜靜地躺著党巾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霜医。 梳的紋絲不亂的頭發(fā)上齿拂,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音肴敛,去河邊找鬼署海。 笑死,一個(gè)胖子當(dāng)著我的面吹牛医男,可吹牛的內(nèi)容都是我干的砸狞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼镀梭,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼刀森!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起报账,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤研底,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后透罢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榜晦,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年羽圃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乾胶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖识窿,靈堂內(nèi)的尸體忽然破棺而出斩郎,到底是詐尸還是另有隱情,我是刑警寧澤腕扶,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布孽拷,位于F島的核電站,受9級(jí)特大地震影響半抱,放射性物質(zhì)發(fā)生泄漏脓恕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一窿侈、第九天 我趴在偏房一處隱蔽的房頂上張望炼幔。 院中可真熱鬧,春花似錦史简、人聲如沸乃秀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跺讯。三九已至,卻和暖如春殉农,著一層夾襖步出監(jiān)牢的瞬間刀脏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工超凳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愈污,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓轮傍,卻偏偏與公主長得像暂雹,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子创夜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理杭跪,服務(wù)發(fā)現(xiàn),斷路器挥下,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • .bat腳本基本命令語法 目錄 批處理的常見命令(未列舉的命令還比較多揍魂,請(qǐng)查閱幫助信息) 1、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,065評(píng)論 1 19
  • 人的一生會(huì)遇到很多人喜最,有些人偎蘸,你付出再多他也看不到你;而還有些人,早在你不經(jīng)意間迷雪,他就已經(jīng)把你放到了心里最重要的位...
    大親家閱讀 422評(píng)論 0 0
  • 最近在看奚愷元寫的《別做正常的傻瓜》這本書限书,其實(shí)本來現(xiàn)在不想寫有關(guān)這本書的任何東西的,因?yàn)檫€沒看完章咧,只看到了第七章...
    ___So__閱讀 471評(píng)論 0 1